frame.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package nodeframe
  2. import (
  3. "cp/node"
  4. "rt2/context"
  5. "rt2/decision"
  6. "rt2/frame"
  7. "ypk/assert"
  8. )
  9. type FrameUtils struct{}
  10. func (fu FrameUtils) New(n node.Node) (f frame.Frame) {
  11. assert.For(n != nil, 20)
  12. f = new(nodeFrame)
  13. f.(*nodeFrame).ir = n
  14. return f
  15. }
  16. func (fu FrameUtils) Push(f, p frame.Frame) {
  17. assert.For(f != nil, 20)
  18. pp, _ := p.(*nodeFrame)
  19. pp.push(f)
  20. }
  21. func (fu FrameUtils) NodeOf(f frame.Frame) node.Node {
  22. ff, _ := f.(*nodeFrame)
  23. assert.For(ff.ir != nil, 40)
  24. return ff.ir
  25. }
  26. type nodeFrame struct {
  27. root frame.Stack
  28. parent frame.Frame
  29. ir node.Node
  30. seq frame.Sequence
  31. domain context.Domain
  32. }
  33. func (f *nodeFrame) Do() frame.WAIT {
  34. assert.For(f.seq != nil, 20)
  35. next, ret := f.seq(f)
  36. if next != nil {
  37. assert.For(ret != frame.STOP, 40)
  38. f.seq = next
  39. } else {
  40. assert.For(ret == frame.STOP, 41)
  41. }
  42. return ret
  43. }
  44. func (f *nodeFrame) onPush() {
  45. f.seq = decision.PrologueFor(f.ir)
  46. }
  47. func (f *nodeFrame) OnPop() {
  48. f.seq = decision.EpilogueFor(f.ir)
  49. if f.seq != nil {
  50. _, _ = f.seq(f)
  51. }
  52. }
  53. func (f *nodeFrame) push(n frame.Frame) {
  54. f.root.PushFor(n, f)
  55. }
  56. func (f *nodeFrame) OnPush(root frame.Stack, parent frame.Frame) {
  57. f.root = root
  58. f.parent = parent
  59. f.onPush()
  60. }
  61. func (f *nodeFrame) Parent() frame.Frame { return f.parent }
  62. func (f *nodeFrame) Root() frame.Stack { return f.root }
  63. func (f *nodeFrame) Domain() context.Domain { return f.domain }
  64. func (f *nodeFrame) Init(d context.Domain) {
  65. assert.For(f.domain == nil, 20)
  66. assert.For(d != nil, 21)
  67. f.domain = d
  68. }