assign.go 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. package rules
  2. import (
  3. "fmt"
  4. "fw/cp"
  5. "fw/cp/constant"
  6. "fw/cp/constant/operation"
  7. "fw/cp/constant/statement"
  8. "fw/cp/node"
  9. "fw/rt2"
  10. "fw/rt2/context"
  11. "fw/rt2/frame"
  12. "fw/rt2/scope"
  13. "reflect"
  14. "ypk/halt"
  15. )
  16. func inc_dec_seq(f frame.Frame, code operation.Operation) (seq frame.Sequence, ret frame.WAIT) {
  17. n := rt2.NodeOf(f)
  18. a := node.New(constant.ASSIGN, cp.Some()).(node.AssignNode)
  19. a.SetStatement(statement.ASSIGN)
  20. a.SetLeft(n.Left())
  21. op := node.New(constant.DYADIC, cp.Some()).(node.OperationNode)
  22. op.SetOperation(code)
  23. op.SetLeft(n.Left())
  24. op.SetRight(n.Right())
  25. a.SetRight(op)
  26. rt2.Push(rt2.New(a), f)
  27. /*seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  28. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  29. sc.Update(n.Left().Object().Adr(), scope.Simple(rt2.ValueOf(f)[op.Adr()]))
  30. return frame.End()
  31. }
  32. ret = frame.LATER */
  33. return frame.Tail(frame.STOP), frame.LATER
  34. }
  35. /*func decSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  36. n := rt2.NodeOf(f)
  37. op := node.New(constant.DYADIC, cp.Some()).(node.OperationNode)
  38. op.SetOperation(operation.MINUS)
  39. op.SetLeft(n.Left())
  40. op.SetRight(n.Right())
  41. rt2.Push(rt2.New(op), f)
  42. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  43. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  44. sc.Update(n.Left().Object().Adr(), scope.Simple(rt2.ValueOf(f)[op.Adr()]))
  45. return frame.End()
  46. }
  47. ret = frame.LATER
  48. return seq, ret
  49. }
  50. */
  51. func assignSeq(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  52. a := rt2.NodeOf(f)
  53. var left scope.Value
  54. var rightId cp.ID
  55. right := func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  56. vleft := left.(scope.Variable)
  57. switch r := a.Right().(type) {
  58. case node.ConstantNode:
  59. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  60. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  61. vleft.Set(sc.Provide(a.Right())(nil)) //scope.Simple(a.Right().(node.ConstantNode).Data()))
  62. return frame.End()
  63. }
  64. ret = frame.NOW
  65. case node.VariableNode, node.ParameterNode:
  66. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  67. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  68. vleft.Set(sc.Select(a.Right().Object().Adr()))
  69. return frame.End()
  70. }
  71. ret = frame.NOW
  72. case node.OperationNode, node.CallNode, node.DerefNode, node.FieldNode:
  73. rt2.Push(rt2.New(a.Right()), f)
  74. rt2.Assert(f, func(f frame.Frame) (bool, int) {
  75. return rt2.ValueOf(f)[a.Right().Adr()] != nil || rt2.RegOf(f)["RETURN"] != nil, 61
  76. })
  77. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  78. //sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  79. val := rt2.ValueOf(f)[a.Right().Adr()]
  80. if val == nil {
  81. val = rt2.RegOf(f)["RETURN"].(scope.Value)
  82. }
  83. vleft.Set(val)
  84. return frame.End()
  85. }
  86. ret = frame.LATER
  87. case node.IndexNode:
  88. rightId = r.Adr()
  89. rt2.Push(rt2.New(r), f)
  90. rt2.Assert(f, func(f frame.Frame) (bool, int) {
  91. return rt2.ValueOf(f)[rightId] != nil, 62
  92. })
  93. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  94. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  95. right := rt2.ValueOf(f)[r.Adr()]
  96. switch z := r.Left().(type) {
  97. case node.VariableNode, node.ParameterNode:
  98. arr := sc.Select(z.Object().Adr()).(scope.Array)
  99. right = arr.Get(right)
  100. vleft.Set(right)
  101. return frame.End()
  102. case node.DerefNode:
  103. return This(expectExpr(f, z, func(in ...IN) (out OUT) {
  104. arr := rt2.ValueOf(f)[z.Adr()].(scope.Array)
  105. right = arr.Get(right)
  106. vleft.Set(right)
  107. return End()
  108. }))
  109. default:
  110. halt.As(100, reflect.TypeOf(z), z)
  111. }
  112. panic(0)
  113. }
  114. ret = frame.LATER
  115. case node.ProcedureNode:
  116. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  117. vleft.Set(sc.Provide(a.Right().Object())(nil))
  118. return frame.End()
  119. default:
  120. fmt.Println(reflect.TypeOf(a.Right()))
  121. panic("wrong right")
  122. }
  123. return seq, ret
  124. }
  125. switch a.(node.AssignNode).Statement() {
  126. case statement.ASSIGN:
  127. switch l := a.Left().(type) {
  128. case node.VariableNode, node.ParameterNode:
  129. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  130. left = sc.Select(a.Left().Object().Adr())
  131. seq, ret = right(f)
  132. case node.FieldNode:
  133. rt2.Push(rt2.New(l), f)
  134. rt2.Assert(f, func(f frame.Frame) (bool, int) {
  135. return rt2.ValueOf(f)[l.Adr()] != nil, 63
  136. })
  137. seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  138. left = rt2.ValueOf(f)[l.Adr()]
  139. return right(f)
  140. }
  141. ret = frame.LATER
  142. case node.IndexNode:
  143. rt2.Push(rt2.New(a.Left()), f)
  144. rt2.Assert(f, func(f frame.Frame) (bool, int) {
  145. return rt2.ValueOf(f)[l.Adr()] != nil, 64
  146. })
  147. seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  148. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  149. left = rt2.ValueOf(f)[l.Adr()]
  150. switch z := l.Left().(type) {
  151. case node.VariableNode, node.ParameterNode:
  152. arr := sc.Select(l.Left().Object().Adr()).(scope.Array)
  153. left = arr.Get(left)
  154. return right(f)
  155. case node.DerefNode:
  156. return This(expectExpr(f, z, func(in ...IN) (out OUT) {
  157. arr := rt2.ValueOf(f)[z.Adr()].(scope.Array)
  158. left = arr.Get(left)
  159. out.do = Expose(right)
  160. out.next = NOW
  161. return
  162. }))
  163. default:
  164. halt.As(100, reflect.TypeOf(z), z)
  165. }
  166. panic(0)
  167. }
  168. ret = frame.LATER
  169. case node.DerefNode:
  170. // rt2.DataOf(f)[a.Left()] = scope.ID{}
  171. rt2.Push(rt2.New(a.Left()), f)
  172. rt2.Assert(f, func(f frame.Frame) (bool, int) {
  173. ok := rt2.ValueOf(f)[l.Adr()] != nil
  174. return ok, 65
  175. })
  176. seq = func(f frame.Frame) (frame.Sequence, frame.WAIT) {
  177. left = rt2.ValueOf(f)[a.Left().Adr()]
  178. return right(f)
  179. }
  180. ret = frame.LATER
  181. default:
  182. fmt.Println(reflect.TypeOf(a.Left()))
  183. panic("wrong left")
  184. }
  185. case statement.INC, statement.INCL:
  186. switch a.Left().(type) {
  187. case node.VariableNode, node.ParameterNode, node.FieldNode:
  188. seq, ret = inc_dec_seq(f, operation.PLUS)
  189. default:
  190. panic(fmt.Sprintln("wrong left", reflect.TypeOf(a.Left())))
  191. }
  192. case statement.DEC, statement.EXCL:
  193. switch a.Left().(type) {
  194. case node.VariableNode, node.ParameterNode, node.FieldNode:
  195. seq, ret = inc_dec_seq(f, operation.MINUS)
  196. default:
  197. panic(fmt.Sprintln("wrong left", reflect.TypeOf(a.Left())))
  198. }
  199. case statement.NEW:
  200. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  201. heap := f.Domain().Discover(context.HEAP).(scope.Manager).Target().(scope.HeapAllocator)
  202. if a.Right() != nil {
  203. seq, ret = This(expectExpr(f, a.Right(), func(in ...IN) (out OUT) {
  204. //fmt.Println("NEW", rt2.ValueOf(f)[a.Right().Adr()], "here")
  205. switch z := a.Left().(type) {
  206. case node.VariableNode:
  207. fn := heap.Allocate(a.Left(), rt2.ValueOf(f)[a.Right().Adr()])
  208. sc.Update(a.Left().Object().Adr(), fn)
  209. return End()
  210. case node.FieldNode:
  211. fn := heap.Allocate(a.Left(), rt2.ValueOf(f)[a.Right().Adr()])
  212. rt2.Push(rt2.New(z), in[0].frame)
  213. rt2.Assert(f, func(f frame.Frame) (bool, int) {
  214. return rt2.ValueOf(f)[z.Adr()] != nil, 65
  215. })
  216. out.do = func(in ...IN) OUT {
  217. field := rt2.ValueOf(in[0].frame)[z.Adr()].(scope.Variable)
  218. field.Set(fn(nil))
  219. return End()
  220. }
  221. out.next = LATER
  222. return
  223. default:
  224. halt.As(100, reflect.TypeOf(z))
  225. }
  226. panic(0)
  227. }))
  228. } else {
  229. //fmt.Println("NEW here", a.Left().Adr())
  230. fn := heap.Allocate(a.Left())
  231. sc.Update(a.Left().Object().Adr(), fn)
  232. return frame.End()
  233. }
  234. default:
  235. panic(fmt.Sprintln("wrong statement", a.(node.AssignNode).Statement()))
  236. }
  237. return seq, ret
  238. }