table.go 6.4 KB

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