assign.go 8.3 KB

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