frame.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package nodeframe
  2. import (
  3. "fmt"
  4. "fw/cp/node"
  5. "fw/rt2/context"
  6. "fw/rt2/decision"
  7. "fw/rt2/frame"
  8. "reflect"
  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).data = make(map[interface{}]interface{})
  18. fmt.Println("_", "NEW", reflect.TypeOf(n))
  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. return f.(*nodeFrame).data
  33. }
  34. type nodeFrame struct {
  35. root frame.Stack
  36. parent frame.Frame
  37. ir node.Node
  38. seq frame.Sequence
  39. domain context.Domain
  40. data map[interface{}]interface{}
  41. num int64
  42. }
  43. func (f *nodeFrame) Do() frame.WAIT {
  44. assert.For(f.seq != nil, 20)
  45. next, ret := f.seq(f)
  46. fmt.Println(f.num, ret, reflect.TypeOf(f.ir))
  47. if next != nil {
  48. assert.For(ret != frame.STOP, 40)
  49. f.seq = next
  50. } else {
  51. assert.For(ret == frame.STOP, 41)
  52. }
  53. return ret
  54. }
  55. func (f *nodeFrame) onPush() {
  56. f.num = count
  57. count++
  58. fmt.Println("_", "PUSH", reflect.TypeOf(f.ir))
  59. f.seq = decision.PrologueFor(f.ir)
  60. }
  61. func (f *nodeFrame) OnPop() {
  62. count--
  63. fmt.Println("_", "POP", reflect.TypeOf(f.ir))
  64. f.seq = decision.EpilogueFor(f.ir)
  65. if f.seq != nil {
  66. _, _ = f.seq(f)
  67. }
  68. }
  69. func (f *nodeFrame) push(n frame.Frame) {
  70. f.root.PushFor(n, f)
  71. }
  72. func (f *nodeFrame) OnPush(root frame.Stack, parent frame.Frame) {
  73. f.root = root
  74. f.parent = parent
  75. f.onPush()
  76. }
  77. func (f *nodeFrame) Parent() frame.Frame { return f.parent }
  78. func (f *nodeFrame) Root() frame.Stack { return f.root }
  79. func (f *nodeFrame) Domain() context.Domain { return f.domain }
  80. func (f *nodeFrame) Init(d context.Domain) {
  81. assert.For(f.domain == nil, 20)
  82. assert.For(d != nil, 21)
  83. f.domain = d
  84. }
  85. func (f *nodeFrame) Handle(msg interface{}) {
  86. assert.For(msg != nil, 20)
  87. }