frame.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package nodeframe
  2. import (
  3. "cp/node"
  4. "fmt"
  5. "reflect"
  6. "rt2/context"
  7. "rt2/decision"
  8. "rt2/frame"
  9. "ypk/assert"
  10. )
  11. var count int64
  12. type FrameUtils struct{}
  13. func (fu FrameUtils) New(n node.Node) (f frame.Frame) {
  14. assert.For(n != nil, 20)
  15. f = new(nodeFrame)
  16. f.(*nodeFrame).ir = n
  17. f.(*nodeFrame).num = count
  18. count++
  19. return f
  20. }
  21. func (fu FrameUtils) Push(f, p frame.Frame) {
  22. assert.For(f != nil, 20)
  23. pp, _ := p.(*nodeFrame)
  24. pp.push(f)
  25. }
  26. func (fu FrameUtils) NodeOf(f frame.Frame) node.Node {
  27. ff, _ := f.(*nodeFrame)
  28. assert.For(ff.ir != nil, 40)
  29. return ff.ir
  30. }
  31. func (fu FrameUtils) DataOf(f frame.Frame) map[interface{}]interface{} {
  32. m := new(frame.GetDataMsg)
  33. f.(context.ContextAware).Handle(m)
  34. return m.Data.(map[interface{}]interface{})
  35. }
  36. type nodeFrame struct {
  37. root frame.Stack
  38. parent frame.Frame
  39. ir node.Node
  40. seq frame.Sequence
  41. domain context.Domain
  42. data map[interface{}]interface{}
  43. num int64
  44. }
  45. func (f *nodeFrame) Do() frame.WAIT {
  46. assert.For(f.seq != nil, 20)
  47. next, ret := f.seq(f)
  48. fmt.Println(f.num, ret, reflect.TypeOf(f.ir))
  49. if next != nil {
  50. assert.For(ret != frame.STOP, 40)
  51. f.seq = next
  52. } else {
  53. assert.For(ret == frame.STOP, 41)
  54. }
  55. return ret
  56. }
  57. func (f *nodeFrame) onPush() {
  58. f.seq = decision.PrologueFor(f.ir)
  59. }
  60. func (f *nodeFrame) OnPop() {
  61. f.seq = decision.EpilogueFor(f.ir)
  62. if f.seq != nil {
  63. _, _ = f.seq(f)
  64. }
  65. }
  66. func (f *nodeFrame) push(n frame.Frame) {
  67. f.root.PushFor(n, f)
  68. }
  69. func (f *nodeFrame) OnPush(root frame.Stack, parent frame.Frame) {
  70. f.root = root
  71. f.parent = parent
  72. f.onPush()
  73. }
  74. func (f *nodeFrame) Parent() frame.Frame { return f.parent }
  75. func (f *nodeFrame) Root() frame.Stack { return f.root }
  76. func (f *nodeFrame) Domain() context.Domain { return f.domain }
  77. func (f *nodeFrame) Init(d context.Domain) {
  78. assert.For(f.domain == nil, 20)
  79. assert.For(d != nil, 21)
  80. f.domain = d
  81. }
  82. func (f *nodeFrame) Handle(msg interface{}) {
  83. assert.For(msg != nil, 20)
  84. switch msg.(type) {
  85. case *frame.SetDataMsg:
  86. f.data = msg.(*frame.SetDataMsg).Data.(map[interface{}]interface{})
  87. case *frame.GetDataMsg:
  88. msg.(*frame.GetDataMsg).Data = f.data
  89. }
  90. }