expr.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414
  1. package eval
  2. import (
  3. "fmt"
  4. "fw/cp/constant/operation"
  5. "fw/cp/node"
  6. "fw/cp/object"
  7. "fw/cp/traps"
  8. "fw/rt2"
  9. "fw/rt2/context"
  10. rtm "fw/rt2/module"
  11. "fw/rt2/scope"
  12. "math/big"
  13. "reflect"
  14. "ypk/assert"
  15. "ypk/halt"
  16. )
  17. func getConst(in IN) OUT {
  18. c := in.IR.(node.ConstantNode)
  19. sc := rt2.ModScope(in.Frame)
  20. fn := sc.Provide(c)
  21. assert.For(fn != nil, 40)
  22. rt2.ValueOf(in.Parent)[c.Adr()] = fn
  23. rt2.RegOf(in.Parent)[in.Key] = c.Adr()
  24. return End()
  25. }
  26. func getVar(in IN) OUT {
  27. v := in.IR.(node.VariableNode)
  28. obj := rtm.MapImportObject(in.Frame.Domain(), v.Object())
  29. sc := rt2.ScopeFor(in.Frame, obj.Adr(), func(val scope.Value) {
  30. rt2.ValueOf(in.Parent)[v.Adr()] = val
  31. rt2.RegOf(in.Parent)[in.Key] = v.Adr()
  32. })
  33. rt2.RegOf(in.Parent)[context.META] = &Meta{Scope: sc, Id: obj.Adr()}
  34. return End()
  35. }
  36. func getVarPar(in IN) OUT {
  37. v := in.IR.(node.ParameterNode)
  38. sc := rt2.ScopeFor(in.Frame, v.Object().Adr(), func(val scope.Value) {
  39. rt2.ValueOf(in.Parent)[v.Adr()] = val
  40. rt2.RegOf(in.Parent)[in.Key] = v.Adr()
  41. rt2.RegOf(in.Parent)[context.META] = &Meta{}
  42. })
  43. rt2.RegOf(in.Parent)[context.META] = &Meta{Scope: sc, Id: v.Object().Adr()}
  44. return End()
  45. }
  46. func getField(in IN) OUT {
  47. const left = "field:left"
  48. f := in.IR.(node.FieldNode)
  49. return GetDesignator(in, left, f.Left(), func(in IN) OUT {
  50. _v := rt2.ValueOf(in.Frame)[KeyOf(in, left)]
  51. switch v := _v.(type) {
  52. case scope.Record:
  53. fld := v.Get(f.Object().Adr()).(scope.Variable)
  54. rt2.ValueOf(in.Parent)[f.Adr()] = fld
  55. rt2.RegOf(in.Parent)[in.Key] = f.Adr()
  56. //rt2.RegOf(in.Parent)[context.META] = &Meta{Scope: nil, Rec: v, Id: fld.Id()}
  57. return End()
  58. default:
  59. halt.As(100, reflect.TypeOf(v))
  60. }
  61. panic(0)
  62. })
  63. }
  64. func getIndex(in IN) OUT {
  65. const (
  66. left = "index:left"
  67. right = "index:right"
  68. )
  69. i := in.IR.(node.IndexNode)
  70. return GetExpression(in, right, i.Right(), func(IN) OUT {
  71. idx := rt2.ValueOf(in.Frame)[KeyOf(in, right)]
  72. assert.For(idx != nil, 40)
  73. return GetDesignator(in, left, i.Left(), func(IN) OUT {
  74. arr := rt2.ValueOf(in.Frame)[KeyOf(in, left)]
  75. assert.For(arr != nil, 41)
  76. switch a := arr.(type) {
  77. case scope.Array:
  78. rt2.ValueOf(in.Parent)[i.Adr()] = a.Get(idx)
  79. rt2.RegOf(in.Parent)[in.Key] = i.Adr()
  80. //rt2.RegOf(in.Parent)[context.META] = &Meta{Arr: a, Id: a.Id()}
  81. return End()
  82. default:
  83. halt.As(100, reflect.TypeOf(a))
  84. }
  85. panic(890)
  86. })
  87. })
  88. }
  89. func getProc(in IN) OUT {
  90. p := in.IR.(node.ProcedureNode)
  91. sc := rt2.ModScope(in.Frame)
  92. fn := sc.Provide(p.Object())
  93. assert.For(fn != nil, 40)
  94. rt2.ValueOf(in.Parent)[p.Adr()] = fn
  95. rt2.RegOf(in.Parent)[in.Key] = p.Adr()
  96. rt2.RegOf(in.Parent)[context.META] = &Meta{}
  97. return End()
  98. }
  99. const nullSafeFlag = "deref:null"
  100. func getDeref(in IN) OUT {
  101. const left = "design:left"
  102. d := in.IR.(node.DerefNode)
  103. //nullSafe, _ := rt2.RegOf(in.Parent)[nullSafeFlag].(bool)
  104. //fmt.Println(reflect.TypeOf(rt2.NodeOf(in.Parent)), nullSafe)
  105. return GetDesignator(in, left, d.Left(), func(in IN) (out OUT) {
  106. _v := rt2.ValueOf(in.Frame)[KeyOf(in, left)]
  107. switch v := _v.(type) {
  108. case scope.Array:
  109. assert.For(!d.Ptr(), 40)
  110. t, c := scope.Ops.TypeOf(v)
  111. switch cc := c.(type) {
  112. case object.ArrayType:
  113. assert.For(cc.Base() == object.CHAR || cc.Base() == object.SHORTCHAR, 41)
  114. rt2.ValueOf(in.Parent)[d.Adr()] = scope.TypeFromGo(scope.GoTypeFrom(v))
  115. rt2.RegOf(in.Parent)[in.Key] = d.Adr()
  116. rt2.RegOf(in.Parent)[context.META] = nil
  117. return End()
  118. case object.DynArrayType:
  119. assert.For(cc.Base() == object.CHAR || cc.Base() == object.SHORTCHAR, 41)
  120. rt2.ValueOf(in.Parent)[d.Adr()] = scope.TypeFromGo(scope.GoTypeFrom(v))
  121. rt2.RegOf(in.Parent)[in.Key] = d.Adr()
  122. rt2.RegOf(in.Parent)[context.META] = nil
  123. return End()
  124. default:
  125. halt.As(100, t, reflect.TypeOf(cc))
  126. }
  127. case scope.Pointer:
  128. switch {
  129. case scope.GoTypeFrom(v.Get()) == nil:
  130. out = makeTrap(in.Frame, traps.NILderef)
  131. case d.Ptr():
  132. out = End()
  133. switch r := v.Get().(type) {
  134. case scope.Record:
  135. rec := r.(scope.Record)
  136. rt2.ValueOf(in.Parent)[d.Adr()] = rec
  137. rt2.RegOf(in.Parent)[in.Key] = d.Adr()
  138. //rt2.RegOf(in.Parent)[context.META] = &Meta{Scope: rt2.ScopeFor(in.Frame, rec.Id()), Id: rec.Id()}
  139. case scope.Array:
  140. arr := r.(scope.Array)
  141. rt2.ValueOf(in.Parent)[d.Adr()] = arr
  142. rt2.RegOf(in.Parent)[in.Key] = d.Adr()
  143. //rt2.RegOf(in.Parent)[context.META] = &Meta{Scope: rt2.ScopeFor(in.Frame, arr.Id()), Id: arr.Id()}
  144. default:
  145. halt.As(100, reflect.TypeOf(r))
  146. }
  147. case !d.Ptr():
  148. out = End()
  149. switch r := v.Get().(type) {
  150. case scope.Array:
  151. arr := r.(scope.Array)
  152. rt2.ValueOf(in.Parent)[d.Adr()] = scope.TypeFromGo(scope.GoTypeFrom(arr))
  153. rt2.RegOf(in.Parent)[in.Key] = d.Adr()
  154. //rt2.RegOf(in.Parent)[context.META] = &Meta{Arr: arr, Id: arr.Id()}
  155. default:
  156. halt.As(100, reflect.TypeOf(r))
  157. }
  158. default:
  159. halt.As(100, d.Adr(), d.Ptr(), v, v.Get())
  160. }
  161. return out
  162. case scope.Index:
  163. switch {
  164. case scope.GoTypeFrom(v.Get()) == nil:
  165. out = makeTrap(in.Frame, traps.NILderef)
  166. case !d.Ptr():
  167. out = End()
  168. switch r := v.Get().(type) {
  169. case scope.Array:
  170. arr := r.(scope.Array)
  171. rt2.ValueOf(in.Parent)[d.Adr()] = scope.TypeFromGo(scope.GoTypeFrom(arr))
  172. rt2.RegOf(in.Parent)[in.Key] = d.Adr()
  173. //rt2.RegOf(in.Parent)[context.META] = &Meta{Arr: arr, Id: arr.Id()}
  174. default:
  175. halt.As(100, reflect.TypeOf(r))
  176. }
  177. case d.Ptr():
  178. out = End()
  179. switch r := v.Get().(type) {
  180. case scope.Pointer:
  181. if scope.GoTypeFrom(v.Get()) == nil {
  182. out = makeTrap(in.Frame, traps.NILderef)
  183. } else {
  184. switch vr := r.Get().(type) {
  185. case scope.Record:
  186. rec := vr.(scope.Record)
  187. rt2.ValueOf(in.Parent)[d.Adr()] = rec
  188. rt2.RegOf(in.Parent)[in.Key] = d.Adr()
  189. //rt2.RegOf(in.Parent)[context.META] = &Meta{Scope: rt2.ScopeFor(in.Frame, rec.Id()), Id: rec.Id()}
  190. case scope.Array:
  191. arr := vr.(scope.Array)
  192. rt2.ValueOf(in.Parent)[d.Adr()] = arr
  193. rt2.RegOf(in.Parent)[in.Key] = d.Adr()
  194. //rt2.RegOf(in.Parent)[context.META] = &Meta{Scope: rt2.ScopeFor(in.Frame, arr.Id()), Id: arr.Id()}
  195. default:
  196. halt.As(100, reflect.TypeOf(r))
  197. }
  198. }
  199. default:
  200. halt.As(100, reflect.TypeOf(r))
  201. }
  202. default:
  203. halt.As(100, d.Adr(), d.Ptr(), v, v.Get())
  204. }
  205. return out
  206. case scope.Value:
  207. rt2.ValueOf(in.Parent)[d.Adr()] = v
  208. rt2.RegOf(in.Parent)[in.Key] = d.Adr()
  209. rt2.RegOf(in.Parent)[context.META] = nil
  210. return End()
  211. default:
  212. halt.As(100, reflect.TypeOf(v))
  213. }
  214. panic(0)
  215. })
  216. }
  217. func getDop(in IN) OUT {
  218. const (
  219. left = "dop:left"
  220. right = "dop:right"
  221. )
  222. op := in.IR.(node.DyadicNode)
  223. do := func(in IN) OUT {
  224. var (
  225. res scope.Value
  226. )
  227. l := rt2.ValueOf(in.Frame)[KeyOf(in, left)]
  228. r := rt2.ValueOf(in.Frame)[KeyOf(in, right)]
  229. switch op.Operation() {
  230. case operation.PLUS:
  231. res = scope.Ops.Sum(l, r)
  232. case operation.MINUS:
  233. res = scope.Ops.Sub(l, r)
  234. case operation.EQUAL:
  235. res = scope.Ops.Eq(l, r)
  236. case operation.LESSER:
  237. res = scope.Ops.Lss(l, r)
  238. case operation.LESS_EQUAL:
  239. res = scope.Ops.Leq(l, r)
  240. case operation.LEN:
  241. res = scope.Ops.Len(op.Left().Object(), l, r)
  242. case operation.NOT_EQUAL:
  243. res = scope.Ops.Neq(l, r)
  244. case operation.GREATER:
  245. res = scope.Ops.Gtr(l, r)
  246. case operation.MAX:
  247. res = scope.Ops.Max(l, r)
  248. case operation.MIN:
  249. res = scope.Ops.Min(l, r)
  250. case operation.DIV:
  251. res = scope.Ops.Div(l, r)
  252. case operation.MOD:
  253. res = scope.Ops.Mod(l, r)
  254. case operation.ALIEN_MSK:
  255. res = scope.Ops.Msk(l, r)
  256. case operation.TIMES:
  257. res = scope.Ops.Mult(l, r)
  258. case operation.SLASH:
  259. res = scope.Ops.Divide(l, r)
  260. case operation.IN:
  261. res = scope.Ops.In(l, r)
  262. case operation.ASH:
  263. res = scope.Ops.Ash(l, r)
  264. case operation.AND:
  265. res = scope.Ops.And(l, r)
  266. case operation.OR:
  267. res = scope.Ops.Or(l, r)
  268. case operation.GREAT_EQUAL:
  269. res = scope.Ops.Geq(l, r)
  270. default:
  271. halt.As(100, op.Operation())
  272. }
  273. assert.For(res != nil, 40)
  274. rt2.ValueOf(in.Parent)[op.Adr()] = res
  275. rt2.RegOf(in.Parent)[in.Key] = op.Adr()
  276. return End()
  277. }
  278. next := func(IN) OUT {
  279. return GetExpression(in, right, op.Right(), do)
  280. }
  281. short := func(IN) OUT {
  282. id := KeyOf(in, left)
  283. lv := rt2.ValueOf(in.Frame)[id]
  284. switch op.Operation() {
  285. case operation.AND:
  286. val := scope.GoTypeFrom(lv).(bool)
  287. if val {
  288. return Now(next)
  289. } else {
  290. rt2.ValueOf(in.Parent)[op.Adr()] = scope.TypeFromGo(false)
  291. rt2.RegOf(in.Parent)[in.Key] = op.Adr()
  292. return End()
  293. }
  294. case operation.OR:
  295. val := scope.GoTypeFrom(lv).(bool)
  296. if !val {
  297. return Now(next)
  298. } else {
  299. rt2.ValueOf(in.Parent)[op.Adr()] = scope.TypeFromGo(true)
  300. rt2.RegOf(in.Parent)[in.Key] = op.Adr()
  301. return End()
  302. }
  303. default:
  304. return Now(next)
  305. }
  306. }
  307. return GetExpression(in, left, op.Left(), short)
  308. }
  309. func getMop(in IN) OUT {
  310. const left = "mop:left"
  311. op := in.IR.(node.MonadicNode)
  312. do := func(in IN) OUT {
  313. lv := rt2.ValueOf(in.Frame)[KeyOf(in, left)]
  314. var res scope.Value
  315. switch op.Operation() {
  316. case operation.ALIEN_CONV:
  317. if op.Type() != object.NOTYPE {
  318. res = scope.Ops.Conv(lv, op.Type())
  319. } else {
  320. res = scope.Ops.Conv(lv, op.Type(), op.Complex())
  321. }
  322. case operation.NOT:
  323. res = scope.Ops.Not(lv)
  324. case operation.IS:
  325. res = scope.Ops.Is(lv, op.Object().Complex())
  326. case operation.ABS:
  327. res = scope.Ops.Abs(lv)
  328. case operation.ODD:
  329. res = scope.Ops.Odd(lv)
  330. case operation.CAP:
  331. res = scope.Ops.Cap(lv)
  332. case operation.BITS:
  333. res = scope.Ops.Bits(lv)
  334. case operation.MINUS:
  335. res = scope.Ops.Minus(lv)
  336. default:
  337. halt.As(100, "unknown op", op.Operation())
  338. }
  339. assert.For(res != nil, 60)
  340. rt2.ValueOf(in.Parent)[op.Adr()] = res
  341. rt2.RegOf(in.Parent)[in.Key] = op.Adr()
  342. return End()
  343. }
  344. return GetExpression(in, left, op.Left(), do)
  345. }
  346. func getGuard(in IN) OUT {
  347. const left = "guard:left"
  348. g := in.IR.(node.GuardNode)
  349. return GetDesignator(in, left, g.Left(), func(IN) OUT {
  350. v := rt2.ValueOf(in.Frame)[KeyOf(in, left)]
  351. assert.For(v != nil, 20)
  352. switch vv := v.(type) {
  353. case scope.Pointer:
  354. v = vv.Get()
  355. }
  356. if scope.GoTypeFrom(scope.Ops.Is(v, g.Type())).(bool) {
  357. rt2.ValueOf(in.Parent)[g.Adr()] = v
  358. rt2.RegOf(in.Parent)[in.Key] = g.Adr()
  359. rt2.RegOf(in.Parent)[context.META] = rt2.RegOf(in.Frame)[context.META] //&Meta{Id: vv.Id(), }
  360. return End()
  361. } else if scope.GoTypeFrom(v) == nil {
  362. return makeTrap(in.Frame, traps.NILderef)
  363. } else {
  364. return makeTrap(in.Frame, traps.GUARDfail)
  365. }
  366. })
  367. }
  368. func bit_range(_f scope.Value, _t scope.Value) scope.Value {
  369. f := scope.GoTypeFrom(_f).(int32)
  370. t := scope.GoTypeFrom(_t).(int32)
  371. ret := big.NewInt(0)
  372. for i := f; i <= t; i++ {
  373. ret = ret.SetBit(ret, int(i), 1)
  374. }
  375. fmt.Println("bits", ret)
  376. return scope.TypeFromGo(ret)
  377. }
  378. func getRange(in IN) OUT {
  379. const (
  380. left = "range:left"
  381. right = "range:right"
  382. )
  383. r := in.IR.(node.RangeNode)
  384. return GetExpression(in, left, r.Left(), func(IN) OUT {
  385. return GetExpression(in, right, r.Right(), func(in IN) OUT {
  386. lv := rt2.ValueOf(in.Frame)[KeyOf(in, left)]
  387. rv := rt2.ValueOf(in.Frame)[KeyOf(in, right)]
  388. res := bit_range(lv, rv)
  389. rt2.ValueOf(in.Parent)[r.Adr()] = res
  390. rt2.RegOf(in.Parent)[in.Key] = r.Adr()
  391. return End()
  392. })
  393. })
  394. }