frame.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. f.(*nodeFrame).data = make(map[interface{}]interface{})
  19. count++
  20. return f
  21. }
  22. func (fu FrameUtils) Push(f, p frame.Frame) {
  23. assert.For(f != nil, 20)
  24. pp, _ := p.(*nodeFrame)
  25. pp.push(f)
  26. }
  27. func (fu FrameUtils) NodeOf(f frame.Frame) node.Node {
  28. ff, _ := f.(*nodeFrame)
  29. assert.For(ff.ir != nil, 40)
  30. return ff.ir
  31. }
  32. func (fu FrameUtils) DataOf(f frame.Frame) map[interface{}]interface{} {
  33. return f.(*nodeFrame).data
  34. }
  35. type nodeFrame struct {
  36. root frame.Stack
  37. parent frame.Frame
  38. ir node.Node
  39. seq frame.Sequence
  40. domain context.Domain
  41. data map[interface{}]interface{}
  42. num int64
  43. }
  44. func (f *nodeFrame) Do() frame.WAIT {
  45. assert.For(f.seq != nil, 20)
  46. next, ret := f.seq(f)
  47. fmt.Println(f.num, ret, reflect.TypeOf(f.ir))
  48. if next != nil {
  49. assert.For(ret != frame.STOP, 40)
  50. f.seq = next
  51. } else {
  52. assert.For(ret == frame.STOP, 41)
  53. }
  54. return ret
  55. }
  56. func (f *nodeFrame) onPush() {
  57. f.seq = decision.PrologueFor(f.ir)
  58. }
  59. func (f *nodeFrame) OnPop() {
  60. f.seq = decision.EpilogueFor(f.ir)
  61. if f.seq != nil {
  62. _, _ = f.seq(f)
  63. }
  64. }
  65. func (f *nodeFrame) push(n frame.Frame) {
  66. f.root.PushFor(n, f)
  67. }
  68. func (f *nodeFrame) OnPush(root frame.Stack, parent frame.Frame) {
  69. f.root = root
  70. f.parent = parent
  71. f.onPush()
  72. }
  73. func (f *nodeFrame) Parent() frame.Frame { return f.parent }
  74. func (f *nodeFrame) Root() frame.Stack { return f.root }
  75. func (f *nodeFrame) Domain() context.Domain { return f.domain }
  76. func (f *nodeFrame) Init(d context.Domain) {
  77. assert.For(f.domain == nil, 20)
  78. assert.For(d != nil, 21)
  79. f.domain = d
  80. }
  81. func (f *nodeFrame) Handle(msg interface{}) {
  82. assert.For(msg != nil, 20)
  83. }