frame.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package nodeframe
  2. import (
  3. "fmt"
  4. "fw/cp"
  5. "fw/cp/node"
  6. "fw/rt2/context"
  7. "fw/rt2/decision"
  8. "fw/rt2/frame"
  9. "fw/rt2/scope"
  10. "fw/utils"
  11. "reflect"
  12. "ypk/assert"
  13. )
  14. var count int64
  15. type NodeFrameUtils struct{}
  16. func (fu NodeFrameUtils) New(n node.Node) (f frame.Frame) {
  17. assert.For(n != nil, 20)
  18. f = new(nodeFrame)
  19. f.(*nodeFrame).ir = n
  20. f.(*nodeFrame).data = make(map[interface{}]interface{})
  21. f.(*nodeFrame).value = make(map[cp.ID]scope.Value)
  22. utils.PrintFrame("_", "NEW", reflect.TypeOf(n))
  23. return f
  24. }
  25. func (fu NodeFrameUtils) Push(f, p frame.Frame) {
  26. assert.For(f != nil, 20)
  27. pp, _ := p.(*nodeFrame)
  28. pp.push(f)
  29. }
  30. func (fu NodeFrameUtils) NodeOf(f frame.Frame) node.Node {
  31. ff, _ := f.(*nodeFrame)
  32. assert.For(ff.ir != nil, 40)
  33. return ff.ir
  34. }
  35. func (fu NodeFrameUtils) DataOf(f frame.Frame) map[interface{}]interface{} {
  36. return f.(*nodeFrame).data
  37. }
  38. func (fu NodeFrameUtils) ValueOf(f frame.Frame) map[cp.ID]scope.Value {
  39. return f.(*nodeFrame).value
  40. }
  41. func (fu NodeFrameUtils) ReplaceDomain(f frame.Frame, d context.Domain) {
  42. ff := f.(*nodeFrame)
  43. ff.domain = d
  44. }
  45. func (fu NodeFrameUtils) Assert(f frame.Frame, ok frame.Assert) {
  46. ff := f.(*nodeFrame)
  47. ff.assertion = ok
  48. }
  49. type nodeFrame struct {
  50. root frame.Stack
  51. parent frame.Frame
  52. ir node.Node
  53. seq frame.Sequence
  54. assertion frame.Assert
  55. domain context.Domain
  56. data map[interface{}]interface{}
  57. value map[cp.ID]scope.Value
  58. num int64
  59. }
  60. func done(f frame.Frame) {
  61. utils.PrintFrame("____")
  62. utils.PrintFrame(f.Domain().Discover(context.SCOPE))
  63. utils.PrintFrame("--")
  64. utils.PrintFrame(f.Domain().Discover(context.HEAP))
  65. utils.PrintFrame("^^^^")
  66. }
  67. func (f *nodeFrame) Do() frame.WAIT {
  68. assert.For(f.seq != nil, 20)
  69. next, ret := f.seq(f)
  70. utils.PrintFrame(f.num, ret, reflect.TypeOf(f.ir), f.ir)
  71. utils.PrintFrame("data:", f.data, f.value)
  72. if next != nil {
  73. assert.For(ret != frame.STOP, 40)
  74. f.seq = next
  75. } else {
  76. assert.For(ret == frame.STOP || ret == frame.WRONG, 41)
  77. if ret == frame.WRONG {
  78. fmt.Println("stopped by signal")
  79. }
  80. }
  81. defer done(f)
  82. return ret
  83. }
  84. func (f *nodeFrame) onPush() {
  85. f.num = count
  86. count++
  87. assert.For(count < 15, 40)
  88. utils.PrintFrame("_", "PUSH", reflect.TypeOf(f.ir))
  89. f.seq = decision.PrologueFor(f.ir)
  90. }
  91. func (f *nodeFrame) OnPop() {
  92. count--
  93. utils.PrintFrame("_", "POP", reflect.TypeOf(f.ir))
  94. f.seq = decision.EpilogueFor(f.ir)
  95. if f.seq != nil {
  96. _, _ = f.seq(f)
  97. }
  98. if f.parent != nil {
  99. ff, ok := f.parent.(*nodeFrame)
  100. if ok && ff.assertion != nil {
  101. ok, code := ff.assertion(ff)
  102. if !ok {
  103. panic(fmt.Sprintln("assert", code, "for", reflect.TypeOf(ff.ir)))
  104. } else {
  105. utils.PrintFrame("assert passed", code, "for", reflect.TypeOf(ff.ir))
  106. }
  107. ff.assertion = nil
  108. }
  109. }
  110. }
  111. func (f *nodeFrame) push(n frame.Frame) {
  112. f.root.PushFor(n, f)
  113. }
  114. func (f *nodeFrame) OnPush(root frame.Stack, parent frame.Frame) {
  115. f.root = root
  116. f.parent = parent
  117. f.onPush()
  118. }
  119. func (f *nodeFrame) Parent() frame.Frame { return f.parent }
  120. func (f *nodeFrame) Root() frame.Stack { return f.root }
  121. func (f *nodeFrame) Domain() context.Domain { return f.domain }
  122. func (f *nodeFrame) Init(d context.Domain) {
  123. assert.For(f.domain == nil, 20)
  124. assert.For(d != nil, 21)
  125. f.domain = d
  126. }
  127. func (f *nodeFrame) Handle(msg interface{}) {
  128. assert.For(msg != nil, 20)
  129. }