frame.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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. "github.com/kpmy/ypk/assert"
  12. "reflect"
  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.Do(func() {
  70. utils.PrintScope("== SCOPE ==")
  71. utils.PrintScope(f.Domain().Discover(context.SCOPE))
  72. utils.PrintScope("== HEAP ==")
  73. utils.PrintScope(f.Domain().Discover(context.HEAP))
  74. utils.PrintScope("== CALL ==")
  75. utils.PrintScope(f.Domain().Discover(context.CALL))
  76. utils.PrintScope("^^^^^^^^^")
  77. })
  78. }
  79. func (f *nodeFrame) Do() frame.WAIT {
  80. assert.For(f.seq != nil, 20)
  81. next, ret := f.seq(f)
  82. utils.PrintFrame(f.num, ret, reflect.TypeOf(f.ir), f.ir)
  83. utils.PrintFrame("data:", f.data, f.value)
  84. if next != nil {
  85. assert.For(ret != frame.STOP, 40)
  86. f.seq = next
  87. } else {
  88. assert.For(ret == frame.STOP || ret == frame.WRONG, 41)
  89. if ret == frame.WRONG {
  90. var fu NodeFrameUtils
  91. utils.PrintTrap()
  92. utils.PrintTrap("something WRONG")
  93. utils.PrintTrap(f.Domain().Discover(context.SCOPE))
  94. depth := 10
  95. f.root.ForEach(func(old frame.Frame) bool {
  96. n := fu.NodeOf(old)
  97. if n != nil {
  98. utils.PrintTrap(reflect.TypeOf(n), n.Adr())
  99. utils.PrintTrap("data: ", fu.DataOf(old), "value: ", fu.ValueOf(old))
  100. } else {
  101. utils.PrintTrap(reflect.TypeOf(old))
  102. }
  103. depth--
  104. return depth != 0
  105. })
  106. utils.PrintTrap(f.Domain().Discover(context.HEAP))
  107. }
  108. }
  109. defer done(f)
  110. return ret
  111. }
  112. func (f *nodeFrame) onPush() {
  113. f.num = count
  114. count++
  115. // assert.For(count < 15, 40)
  116. utils.PrintFrame("_", "PUSH", reflect.TypeOf(f.ir))
  117. f.seq = decision.PrologueFor(f.ir)
  118. }
  119. func (f *nodeFrame) OnPop() {
  120. count--
  121. utils.PrintFrame("_", "POP", reflect.TypeOf(f.ir))
  122. f.seq = decision.EpilogueFor(f.ir)
  123. if f.seq != nil {
  124. _, end := f.seq(f)
  125. assert.For(end == frame.END || end == frame.STOP, 60, end)
  126. }
  127. if f.parent != nil {
  128. ff, ok := f.parent.(*nodeFrame)
  129. if ok && ff.assertion != nil {
  130. check := func(ok bool, msg ...interface{}) {
  131. if !ok {
  132. panic(fmt.Sprintln("assert for", reflect.TypeOf(ff.ir), ff.ir, fmt.Sprint(msg...)))
  133. } else {
  134. utils.PrintFrame("assert passed for", reflect.TypeOf(ff.ir), ff.ir)
  135. }
  136. }
  137. ff.assertion(ff, check)
  138. ff.assertion = nil
  139. }
  140. }
  141. }
  142. func (f *nodeFrame) push(n frame.Frame) {
  143. f.root.PushFor(n, f)
  144. }
  145. func (f *nodeFrame) OnPush(root frame.Stack, parent frame.Frame) {
  146. f.root = root
  147. f.parent = parent
  148. f.onPush()
  149. }
  150. func (f *nodeFrame) Parent() frame.Frame { return f.parent }
  151. func (f *nodeFrame) Root() frame.Stack { return f.root }
  152. func (f *nodeFrame) Domain() context.Domain { return f.domain }
  153. func (f *nodeFrame) Init(d context.Domain) {
  154. assert.For(f.domain == nil, 20)
  155. assert.For(d != nil, 21)
  156. f.domain = d
  157. }
  158. func (f *nodeFrame) Handle(msg interface{}) {
  159. assert.For(msg != nil, 20)
  160. }