table.go 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232
  1. //dynamicaly loading from outer space
  2. package rules
  3. import (
  4. "fmt"
  5. "fw/cp/module"
  6. "fw/cp/node"
  7. "fw/rt2"
  8. "fw/rt2/context"
  9. "fw/rt2/decision"
  10. "fw/rt2/frame"
  11. "fw/rt2/frame/std"
  12. rt_module "fw/rt2/module"
  13. "fw/rt2/nodeframe"
  14. "fw/rt2/scope"
  15. "fw/utils"
  16. "reflect"
  17. "time"
  18. "ypk/assert"
  19. )
  20. func prologue(n node.Node) frame.Sequence {
  21. //fmt.Println(reflect.TypeOf(n))
  22. switch next := n.(type) {
  23. case node.EnterNode:
  24. return enterSeq
  25. case node.AssignNode:
  26. return assignSeq
  27. case node.OperationNode:
  28. switch n.(type) {
  29. case node.DyadicNode:
  30. return dopSeq
  31. case node.MonadicNode:
  32. return mopSeq
  33. default:
  34. panic("no such op")
  35. }
  36. case node.CallNode:
  37. return callSeq
  38. case node.ReturnNode:
  39. return returnSeq
  40. case node.ConditionalNode:
  41. return ifSeq
  42. case node.IfNode:
  43. return ifExpr
  44. case node.WhileNode:
  45. return whileSeq
  46. case node.RepeatNode:
  47. return repeatSeq
  48. case node.LoopNode:
  49. return loopSeq
  50. case node.ExitNode:
  51. return exitSeq
  52. case node.DerefNode:
  53. return derefSeq
  54. case node.InitNode:
  55. return frame.Tail(frame.STOP)
  56. case node.IndexNode:
  57. return indexSeq
  58. case node.TrapNode:
  59. return func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  60. switch code := next.Left().(type) {
  61. case node.ConstantNode:
  62. utils.PrintTrap("TRAP:", code.Data())
  63. return frame.Tail(frame.WRONG), frame.NOW
  64. default:
  65. panic(fmt.Sprintln("unsupported code", reflect.TypeOf(code)))
  66. }
  67. }
  68. case node.WithNode:
  69. return withSeq
  70. case node.GuardNode:
  71. return guardSeq
  72. case node.CaseNode:
  73. return caseSeq
  74. case node.RangeNode:
  75. return rangeSeq
  76. case node.CompNode:
  77. return func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  78. right := func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  79. if next.Right() != nil {
  80. rt2.Push(rt2.New(next.Right()), f)
  81. return frame.Tail(frame.STOP), frame.LATER
  82. }
  83. return frame.End()
  84. }
  85. left := func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  86. if next.Left() != nil {
  87. rt2.Push(rt2.New(next.Left()), f)
  88. return right, frame.LATER
  89. }
  90. return right, frame.NOW
  91. }
  92. return left, frame.NOW
  93. }
  94. default:
  95. panic(fmt.Sprintln("unknown node", reflect.TypeOf(n)))
  96. }
  97. }
  98. func epilogue(n node.Node) frame.Sequence {
  99. var fu nodeframe.FrameUtils
  100. switch n.(type) {
  101. case node.AssignNode, node.InitNode, node.CallNode, node.ConditionalNode, node.WhileNode,
  102. node.RepeatNode, node.ExitNode, node.WithNode, node.CaseNode, node.CompNode:
  103. return func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  104. next := n.Link()
  105. //fmt.Println("from", reflect.TypeOf(n))
  106. //fmt.Println("next", reflect.TypeOf(next))
  107. if next != nil {
  108. f.Root().PushFor(fu.New(next), f.Parent())
  109. }
  110. return frame.End()
  111. }
  112. case node.EnterNode:
  113. return func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  114. fmt.Println(rt_module.DomainModule(f.Domain()).Name)
  115. sm := scope.This(f.Domain().Discover(context.SCOPE))
  116. sm.Target().(scope.ScopeAllocator).Dispose(n)
  117. return frame.End()
  118. }
  119. case node.OperationNode, node.ReturnNode, node.IfNode, node.LoopNode,
  120. node.DerefNode, node.IndexNode, node.TrapNode, node.GuardNode, node.RangeNode:
  121. return nil
  122. default:
  123. fmt.Println(reflect.TypeOf(n))
  124. panic("unhandled epilogue")
  125. }
  126. }
  127. type flow struct {
  128. root frame.Stack
  129. parent frame.Frame
  130. domain context.Domain
  131. fl []frame.Frame
  132. cl []frame.Frame
  133. this int
  134. }
  135. func (f *flow) Do() (ret frame.WAIT) {
  136. const Z WAIT = -1
  137. x := Z
  138. if f.this >= 0 {
  139. x = waiting(f.fl[f.this].Do())
  140. }
  141. switch x {
  142. case NOW, WRONG, LATER, BEGIN:
  143. ret = WAIT.wait(x)
  144. case END:
  145. old := f.Root().(*std.RootFrame).Drop()
  146. assert.For(old != nil, 40)
  147. f.cl = append(f.cl, old)
  148. ret = WAIT.wait(LATER)
  149. case STOP, Z:
  150. f.this--
  151. if f.this >= 0 {
  152. ret = WAIT.wait(LATER)
  153. } else {
  154. if len(f.cl) > 0 {
  155. for _, old := range f.cl {
  156. n := rt2.NodeOf(old)
  157. rt2.Push(rt2.New(n), old.Parent())
  158. }
  159. f.cl = nil
  160. ret = WAIT.wait(LATER)
  161. } else {
  162. ret = WAIT.wait(STOP)
  163. }
  164. }
  165. }
  166. fmt.Println(">", ret)
  167. return ret
  168. }
  169. func (f *flow) OnPush(root frame.Stack, parent frame.Frame) {
  170. f.root = root
  171. f.parent = parent
  172. fmt.Println("flow control pushed")
  173. f.this = len(f.fl) - 1
  174. }
  175. func (f *flow) OnPop() {
  176. fmt.Println("flow control poped")
  177. }
  178. func (f *flow) Parent() frame.Frame { return f.parent }
  179. func (f *flow) Root() frame.Stack { return f.root }
  180. func (f *flow) Domain() context.Domain { return f.domain }
  181. func (f *flow) Init(d context.Domain) {
  182. assert.For(f.domain == nil, 20)
  183. assert.For(d != nil, 21)
  184. f.domain = d
  185. }
  186. func (f *flow) Handle(msg interface{}) {
  187. assert.For(msg != nil, 20)
  188. }
  189. func run(global context.Domain, init []*module.Module) {
  190. {
  191. var (
  192. root *std.RootFrame = std.NewRoot()
  193. nf frame.Frame
  194. ff []frame.Frame
  195. )
  196. global.Attach(context.STACK, root)
  197. for i := len(init) - 1; i >= 0; i-- {
  198. ret := init[i]
  199. fmt.Println("queue", ret.Name)
  200. nf = rt2.New(ret.Enter)
  201. root.PushFor(nf, nil)
  202. ff = append(ff, nf)
  203. global.Attach(ret.Name, nf.Domain())
  204. }
  205. root.PushFor(&flow{fl: ff}, nil)
  206. i := 0
  207. t0 := time.Now()
  208. for x := frame.NOW; x == frame.NOW; x = root.Do() {
  209. //fmt.Println(x)
  210. i++
  211. }
  212. t1 := time.Now()
  213. fmt.Println("total steps", i)
  214. fmt.Println("spent", t1.Sub(t0))
  215. }
  216. }
  217. func init() {
  218. decision.PrologueFor = prologue
  219. decision.EpilogueFor = epilogue
  220. decision.Run = run
  221. }