frame.go 4.0 KB

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