assign.go 7.2 KB

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