table.go 5.9 KB

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