frame.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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), n.Adr())
  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, ok := f.(*nodeFrame)
  32. if ok {
  33. assert.For(ff.ir != nil, 40)
  34. return ff.ir
  35. } else {
  36. return nil
  37. }
  38. }
  39. func (fu NodeFrameUtils) DataOf(f frame.Frame) map[interface{}]interface{} {
  40. return f.(*nodeFrame).data
  41. }
  42. func (fu NodeFrameUtils) ValueOf(f frame.Frame) map[cp.ID]scope.Value {
  43. return f.(*nodeFrame).value
  44. }
  45. func (fu NodeFrameUtils) ReplaceDomain(f frame.Frame, d context.Domain) {
  46. ff := f.(*nodeFrame)
  47. ff.domain = d
  48. }
  49. func (fu NodeFrameUtils) Assert(f frame.Frame, ok frame.Assert) {
  50. ff := f.(*nodeFrame)
  51. ff.assertion = ok
  52. }
  53. type nodeFrame struct {
  54. root frame.Stack
  55. parent frame.Frame
  56. ir node.Node
  57. seq frame.Sequence
  58. assertion frame.Assert
  59. domain context.Domain
  60. data map[interface{}]interface{}
  61. value map[cp.ID]scope.Value
  62. num int64
  63. }
  64. func done(f frame.Frame) {
  65. utils.PrintFrame("____")
  66. utils.PrintFrame(f.Domain().Discover(context.SCOPE))
  67. // utils.PrintFrame("--")
  68. // utils.PrintFrame(f.Domain().Discover(context.HEAP))
  69. utils.PrintFrame("^^^^")
  70. }
  71. func (f *nodeFrame) Do() frame.WAIT {
  72. assert.For(f.seq != nil, 20)
  73. next, ret := f.seq(f)
  74. utils.PrintFrame(f.num, ret, reflect.TypeOf(f.ir), f.ir)
  75. utils.PrintFrame("data:", f.data, f.value)
  76. if next != nil {
  77. assert.For(ret != frame.STOP, 40)
  78. f.seq = next
  79. } else {
  80. assert.For(ret == frame.STOP || ret == frame.WRONG, 41)
  81. if ret == frame.WRONG {
  82. var fu NodeFrameUtils
  83. utils.PrintTrap()
  84. utils.PrintTrap("something WRONG")
  85. utils.PrintTrap(f.Domain().Discover(context.SCOPE))
  86. depth := 10
  87. f.root.ForEach(func(old frame.Frame) bool {
  88. n := fu.NodeOf(old)
  89. if n != nil {
  90. utils.PrintTrap(reflect.TypeOf(n), n.Adr())
  91. utils.PrintTrap("data: ", fu.DataOf(old), "value: ", fu.ValueOf(old))
  92. } else {
  93. utils.PrintTrap(reflect.TypeOf(old))
  94. }
  95. depth--
  96. return depth != 0
  97. })
  98. utils.PrintTrap(f.Domain().Discover(context.HEAP))
  99. }
  100. }
  101. defer done(f)
  102. return ret
  103. }
  104. func (f *nodeFrame) onPush() {
  105. f.num = count
  106. count++
  107. // assert.For(count < 15, 40)
  108. utils.PrintFrame("_", "PUSH", reflect.TypeOf(f.ir))
  109. f.seq = decision.PrologueFor(f.ir)
  110. }
  111. func (f *nodeFrame) OnPop() {
  112. count--
  113. utils.PrintFrame("_", "POP", reflect.TypeOf(f.ir))
  114. f.seq = decision.EpilogueFor(f.ir)
  115. if f.seq != nil {
  116. _, _ = f.seq(f)
  117. }
  118. if f.parent != nil {
  119. ff, ok := f.parent.(*nodeFrame)
  120. if ok && ff.assertion != nil {
  121. ok, code := ff.assertion(ff)
  122. if !ok {
  123. panic(fmt.Sprintln("assert", code, "for", reflect.TypeOf(ff.ir)))
  124. } else {
  125. utils.PrintFrame("assert passed", code, "for", reflect.TypeOf(ff.ir))
  126. }
  127. ff.assertion = nil
  128. }
  129. }
  130. }
  131. func (f *nodeFrame) push(n frame.Frame) {
  132. f.root.PushFor(n, f)
  133. }
  134. func (f *nodeFrame) OnPush(root frame.Stack, parent frame.Frame) {
  135. f.root = root
  136. f.parent = parent
  137. f.onPush()
  138. }
  139. func (f *nodeFrame) Parent() frame.Frame { return f.parent }
  140. func (f *nodeFrame) Root() frame.Stack { return f.root }
  141. func (f *nodeFrame) Domain() context.Domain { return f.domain }
  142. func (f *nodeFrame) Init(d context.Domain) {
  143. assert.For(f.domain == nil, 20)
  144. assert.For(d != nil, 21)
  145. f.domain = d
  146. }
  147. func (f *nodeFrame) Handle(msg interface{}) {
  148. assert.For(msg != nil, 20)
  149. }