expr.go 12 KB

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