table.go 5.6 KB

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