stmt.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565
  1. package eval
  2. import (
  3. "fw/cp"
  4. "fw/cp/constant"
  5. "fw/cp/constant/operation"
  6. "fw/cp/constant/statement"
  7. "fw/cp/node"
  8. "fw/cp/object"
  9. "fw/cp/traps"
  10. "fw/rt2"
  11. "fw/rt2/context"
  12. "fw/rt2/frame"
  13. rtm "fw/rt2/module"
  14. "fw/rt2/scope"
  15. "fw/utils"
  16. "log"
  17. "math/big"
  18. "reflect"
  19. "ypk/assert"
  20. "ypk/halt"
  21. )
  22. func makeTrap(f frame.Frame, err traps.TRAP) (out OUT) {
  23. trap := node.New(constant.TRAP, cp.Some()).(node.TrapNode)
  24. code := node.New(constant.CONSTANT, cp.Some()).(node.ConstantNode)
  25. code.SetData(int32(err))
  26. trap.SetLeft(code)
  27. rt2.Push(rt2.New(trap), f)
  28. return Later(Tail(STOP))
  29. }
  30. func doEnter(in IN) OUT {
  31. e := in.IR.(node.EnterNode)
  32. var next Do
  33. tail := func(IN) (out OUT) {
  34. body := in.IR.Right()
  35. switch {
  36. case body == nil:
  37. return End()
  38. case body != nil && in.Parent != nil:
  39. rt2.Push(rt2.New(body), in.Frame)
  40. return Later(Tail(STOP))
  41. case body != nil && in.Parent == nil: //секция BEGIN
  42. rt2.Push(rt2.New(body), in.Frame)
  43. end := in.IR.Link()
  44. if end != nil { //секция CLOSE
  45. out.Do = func(in IN) OUT {
  46. in.Frame.Root().PushFor(rt2.New(end), in.Frame)
  47. return OUT{Do: Tail(STOP), Next: LATER}
  48. }
  49. } else {
  50. out.Do = Tail(STOP)
  51. }
  52. out.Next = BEGIN
  53. }
  54. return
  55. }
  56. sm := rt2.ThisScope(in.Frame)
  57. if e.Object() != nil { //параметры процедуры
  58. par, ok := rt2.RegOf(in.Frame)[e.Object()].(node.Node)
  59. //fmt.Println(rt2.DataOf(f)[n.Object()])
  60. //fmt.Println(ok)
  61. if ok {
  62. sm.Target().(scope.ScopeAllocator).Allocate(e, false)
  63. next = func(in IN) OUT {
  64. seq, _ := sm.Target().(scope.ScopeAllocator).Initialize(e,
  65. scope.PARAM{Objects: e.Object().Link(),
  66. Values: par,
  67. Frame: in.Frame,
  68. Tail: Propose(tail)})
  69. return Later(Expose(seq))
  70. }
  71. } else {
  72. sm.Target().(scope.ScopeAllocator).Allocate(e, true)
  73. next = tail
  74. }
  75. } else {
  76. sm.Target().(scope.ScopeAllocator).Allocate(in.IR, true)
  77. next = tail
  78. }
  79. return Now(next)
  80. }
  81. func inc_dec_seq(in IN, code operation.Operation) OUT {
  82. n := in.IR
  83. a := node.New(constant.ASSIGN, cp.Some()).(node.AssignNode)
  84. a.SetStatement(statement.ASSIGN)
  85. a.SetLeft(n.Left())
  86. op := node.New(constant.DYADIC, cp.Some()).(node.OperationNode)
  87. op.SetOperation(code)
  88. op.SetLeft(n.Left())
  89. op.SetRight(n.Right())
  90. a.SetRight(op)
  91. rt2.Push(rt2.New(a), in.Frame)
  92. /*seq = func(f frame.Frame) (seq frame.Sequence, ret frame.WAIT) {
  93. sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  94. sc.Update(n.Left().Object().Adr(), scope.Simple(rt2.ValueOf(f)[op.Adr()]))
  95. return frame.End()
  96. }
  97. ret = frame.LATER */
  98. return Later(Tail(STOP))
  99. }
  100. func doAssign(in IN) (out OUT) {
  101. const (
  102. right = "assign:right"
  103. left = "assign:left"
  104. )
  105. a := in.IR.(node.AssignNode)
  106. switch a.Statement() {
  107. case statement.ASSIGN:
  108. out = GetExpression(in, right, a.Right(), func(in IN) OUT {
  109. id := KeyOf(in, right)
  110. val := rt2.ValueOf(in.Frame)[id]
  111. assert.For(val != nil, 40, id)
  112. return GetDesignator(in, left, a.Left(), func(in IN) OUT {
  113. id := KeyOf(in, left)
  114. v, ok := rt2.ValueOf(in.Frame)[id].(scope.Variable)
  115. assert.For(ok, 41, reflect.TypeOf(v))
  116. v.Set(val)
  117. return End()
  118. })
  119. })
  120. case statement.INC, statement.INCL:
  121. switch a.Left().(type) {
  122. case node.VariableNode, node.ParameterNode, node.FieldNode:
  123. out = inc_dec_seq(in, operation.PLUS)
  124. default:
  125. halt.As(100, "wrong left", reflect.TypeOf(a.Left()))
  126. }
  127. case statement.DEC, statement.EXCL:
  128. switch a.Left().(type) {
  129. case node.VariableNode, node.ParameterNode, node.FieldNode:
  130. out = inc_dec_seq(in, operation.MINUS)
  131. default:
  132. halt.As(100, "wrong left", reflect.TypeOf(a.Left()))
  133. }
  134. case statement.NEW:
  135. obj := a.Left().Object()
  136. assert.For(obj != nil, 20)
  137. heap := in.Frame.Domain().Discover(context.HEAP).(scope.Manager).Target().(scope.HeapAllocator)
  138. if a.Right() != nil {
  139. out = GetExpression(in, right, a.Right(), func(in IN) OUT {
  140. size := rt2.ValueOf(in.Frame)[KeyOf(in, right)]
  141. return GetDesignator(in, left, a.Left(), func(in IN) OUT {
  142. v := rt2.ValueOf(in.Frame)[KeyOf(in, left)].(scope.Variable)
  143. fn := heap.Allocate(obj, obj.Complex().(object.PointerType), size)
  144. v.Set(fn)
  145. return End()
  146. })
  147. })
  148. } else {
  149. out = GetDesignator(in, left, a.Left(), func(IN) OUT {
  150. v := rt2.ValueOf(in.Frame)[KeyOf(in, left)].(scope.Variable)
  151. fn := heap.Allocate(obj, obj.Complex().(object.PointerType))
  152. v.Set(fn)
  153. return End()
  154. })
  155. }
  156. default:
  157. halt.As(100, "unsupported assign statement", a.Statement())
  158. }
  159. return
  160. }
  161. func doIf(in IN) OUT {
  162. const left = "if:left:if"
  163. i := in.IR.(node.IfNode)
  164. return GetExpression(in, left, i.Left(), func(in IN) OUT {
  165. val := rt2.ValueOf(in.Frame)[KeyOf(in, left)]
  166. assert.For(val != nil, 20)
  167. rt2.ValueOf(in.Parent)[i.Adr()] = val
  168. rt2.RegOf(in.Parent)[in.Key] = i.Adr()
  169. return End()
  170. })
  171. }
  172. func doCondition(in IN) OUT {
  173. const left = "if:left"
  174. i := in.IR.(node.ConditionalNode)
  175. rt2.RegOf(in.Frame)[0] = i.Left() // if
  176. var next Do
  177. next = func(in IN) OUT {
  178. last := rt2.RegOf(in.Frame)[0].(node.Node)
  179. fi := rt2.ValueOf(in.Frame)[KeyOf(in, left)]
  180. done := scope.GoTypeFrom(fi).(bool)
  181. rt2.RegOf(in.Frame)[0] = nil
  182. rt2.ValueOf(in.Frame)[KeyOf(in, left)] = nil
  183. if done && last.Right() != nil {
  184. rt2.Push(rt2.New(last.Right()), in.Frame)
  185. return Later(Tail(STOP))
  186. } else if last.Right() == nil {
  187. return End()
  188. } else if last.Link() != nil { //elsif
  189. rt2.RegOf(in.Frame)[0] = last.Link()
  190. return GetStrange(in, left, i.Left(), next)
  191. } else if i.Right() != nil { //else
  192. rt2.Push(rt2.New(i.Right()), in.Frame)
  193. return Later(Tail(STOP))
  194. } else if i.Right() == nil {
  195. return End()
  196. } else if i.Right() == last {
  197. return End()
  198. } else {
  199. halt.As(100, "wrong if then else")
  200. panic(100)
  201. }
  202. }
  203. return GetStrange(in, left, i.Left(), next)
  204. }
  205. func doWhile(in IN) OUT {
  206. const left = "while:left"
  207. w := in.IR.(node.WhileNode)
  208. var next Do
  209. next = func(IN) OUT {
  210. key := KeyOf(in, left)
  211. fi := rt2.ValueOf(in.Frame)[key]
  212. rt2.ValueOf(in.Frame)[key] = nil
  213. done := scope.GoTypeFrom(fi).(bool)
  214. if done && w.Right() != nil {
  215. rt2.Push(rt2.New(w.Right()), in.Frame)
  216. return Later(func(IN) OUT { return GetExpression(in, left, w.Left(), next) })
  217. } else if !done {
  218. return End()
  219. } else if w.Right() == nil {
  220. return End()
  221. } else {
  222. panic("unexpected while seq")
  223. }
  224. }
  225. return GetExpression(in, left, w.Left(), next)
  226. }
  227. const exitFlag = 1812
  228. func doExit(in IN) OUT {
  229. in.Frame.Root().ForEach(func(f frame.Frame) (ok bool) {
  230. n := rt2.NodeOf(f)
  231. _, ok = n.(node.LoopNode)
  232. if ok {
  233. rt2.RegOf(f)[exitFlag] = true
  234. }
  235. ok = !ok
  236. return ok
  237. })
  238. return End()
  239. }
  240. func doLoop(in IN) OUT {
  241. l := in.IR.(node.LoopNode)
  242. exit, ok := rt2.RegOf(in.Frame)[exitFlag].(bool)
  243. if ok && exit {
  244. return End()
  245. }
  246. if l.Left() != nil {
  247. rt2.Push(rt2.New(l.Left()), in.Frame)
  248. return Later(doLoop)
  249. } else if l.Left() == nil {
  250. return End()
  251. } else {
  252. panic("unexpected loop seq")
  253. }
  254. }
  255. func doRepeat(in IN) OUT {
  256. const right = "return:right"
  257. r := in.IR.(node.RepeatNode)
  258. rt2.ValueOf(in.Frame)[r.Right().Adr()] = scope.TypeFromGo(false)
  259. var next Do
  260. next = func(in IN) OUT {
  261. fi := rt2.ValueOf(in.Frame)[r.Right().Adr()]
  262. done := scope.GoTypeFrom(fi).(bool)
  263. if !done && r.Left() != nil {
  264. rt2.Push(rt2.New(r.Left()), in.Frame)
  265. return Later(func(IN) OUT { return GetExpression(in, right, r.Right(), next) })
  266. } else if done {
  267. return End()
  268. } else if r.Left() == nil {
  269. return End()
  270. } else {
  271. panic("unexpected repeat seq")
  272. }
  273. }
  274. return Now(next)
  275. }
  276. func doTrap(in IN) OUT {
  277. const left = "trap:left"
  278. return GetExpression(in, left, in.IR.Left(), func(IN) OUT {
  279. val := rt2.ValueOf(in.Frame)[KeyOf(in, left)]
  280. log.Println("TRAP:", traps.This(scope.GoTypeFrom(val)))
  281. return Now(Tail(WRONG))
  282. })
  283. }
  284. func doReturn(in IN) OUT {
  285. const left = "return:left"
  286. r := in.IR.(node.ReturnNode)
  287. return GetExpression(in, left, r.Left(), func(IN) OUT {
  288. val := rt2.ValueOf(in.Frame)[KeyOf(in, left)]
  289. if val == nil {
  290. val, _ = rt2.RegOf(in.Frame)[context.RETURN].(scope.Value)
  291. }
  292. assert.For(val != nil, 40)
  293. rt2.ValueOf(in.Parent)[r.Object().Adr()] = val
  294. rt2.RegOf(in.Parent)[context.RETURN] = val
  295. return End()
  296. })
  297. }
  298. func doCall(in IN) (out OUT) {
  299. const (
  300. right = "call:right"
  301. )
  302. c := in.IR.(node.CallNode)
  303. call := func(proc node.Node, d context.Domain) {
  304. _, ok := proc.(node.EnterNode)
  305. assert.For(ok, 20, "try call", reflect.TypeOf(proc), proc.Adr(), proc.Object().Adr())
  306. nf := rt2.New(proc)
  307. rt2.Push(nf, in.Frame)
  308. if d != nil {
  309. rt2.ReplaceDomain(nf, d)
  310. }
  311. //передаем ссылку на цепочку значений параметров в данные фрейма входа в процедуру
  312. if (c.Right() != nil) && (proc.Object() != nil) {
  313. rt2.RegOf(nf)[proc.Object()] = c.Right()
  314. } else {
  315. //fmt.Println("no data for call")
  316. }
  317. out = Later(func(in IN) OUT {
  318. if in.Key != nil {
  319. val := rt2.ValueOf(in.Frame)[c.Left().Object().Adr(0, 0)]
  320. if val == nil {
  321. if rv, _ := rt2.RegOf(in.Frame)[context.RETURN].(scope.Value); rv != nil {
  322. val = rv
  323. }
  324. }
  325. assert.For(val != nil, 40, in.Key, rt2.RegOf(in.Frame), rt2.ValueOf(in.Frame), rt2.RegOf(in.Parent), rt2.ValueOf(in.Parent))
  326. id := cp.ID(cp.Some())
  327. rt2.ValueOf(in.Parent)[id] = val
  328. rt2.RegOf(in.Parent)[in.Key] = id
  329. }
  330. return End()
  331. })
  332. }
  333. switch p := c.Left().(type) {
  334. case node.ProcedureNode:
  335. m := rtm.DomainModule(in.Frame.Domain())
  336. ml := in.Frame.Domain().Global().Discover(context.MOD).(rtm.List)
  337. switch p.Object().Mode() {
  338. case object.LOCAL_PROC, object.EXTERNAL_PROC:
  339. if imp := p.Object().Imp(); imp == "" || imp == m.Name {
  340. proc := m.NodeByObject(p.Object())
  341. assert.For(proc != nil, 40, m.Name, imp, p.Object().Imp(), p.Object().Adr(0, 0), p.Object().Name())
  342. call(proc[0], nil)
  343. } else {
  344. m := ml.Loaded(imp)
  345. pl := m.ObjectByName(m.Enter, c.Left().Object().Name())
  346. var proc object.ProcedureObject
  347. var nl []node.Node
  348. for _, n := range pl {
  349. if n.Mode() == p.Object().Mode() {
  350. proc = n.(object.ProcedureObject)
  351. }
  352. }
  353. nl = m.NodeByObject(proc)
  354. utils.PrintFrame("foreign call", len(nl), "proc refs", proc)
  355. call(nl[0], in.Frame.Domain().Global().Discover(imp).(context.Domain))
  356. }
  357. case object.TYPE_PROC:
  358. //sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  359. out = GetExpression(in, right, c.Right(), func(IN) (out OUT) {
  360. var (
  361. proc []node.Node
  362. dm context.Domain
  363. )
  364. id := KeyOf(in, right)
  365. v := rt2.ValueOf(in.Frame)[id]
  366. t, ct := scope.Ops.TypeOf(v)
  367. if ct == nil {
  368. return makeTrap(in.Frame, traps.Default)
  369. }
  370. assert.For(ct != nil, 40, id, v, t)
  371. x := ml.NewTypeCalc()
  372. x.ConnectTo(ct)
  373. sup := p.Super()
  374. for _, ml := range x.MethodList() {
  375. for _, m := range ml {
  376. //fmt.Println(m.Obj.Name(), m.Obj.Adr())
  377. if m.Obj.Name() == p.Object().Name() {
  378. if !sup {
  379. proc = append(proc, m.Enter)
  380. break
  381. } else {
  382. sup = false //супервызов должен быть вторым методом с тем же именем
  383. }
  384. dm = in.Frame.Domain().Global().Discover(m.Mod.Name).(context.Domain)
  385. }
  386. }
  387. if len(proc) > 0 {
  388. break
  389. }
  390. }
  391. assert.For(len(proc) > 0, 40, p.Object().Name())
  392. call(proc[0], dm)
  393. out = Later(Tail(STOP))
  394. return
  395. })
  396. default:
  397. halt.As(100, "wrong proc mode ", p.Object().Mode(), p.Object().Adr(), p.Object().Name())
  398. }
  399. case node.VariableNode:
  400. m := rtm.DomainModule(in.Frame.Domain())
  401. sc := rt2.ScopeFor(in.Frame, p.Object().Adr())
  402. var obj interface{}
  403. sc.Select(p.Object().Adr(), func(in scope.Value) {
  404. obj = scope.GoTypeFrom(in)
  405. })
  406. if obj, ok := obj.(object.Object); ok {
  407. proc := m.NodeByObject(obj)
  408. call(proc[0], nil)
  409. } else {
  410. name := p.Object().Name()
  411. switch {
  412. case sys[name] != nil:
  413. return syscall(in)
  414. default:
  415. halt.As(100, "unknown sysproc variable", name)
  416. }
  417. }
  418. default:
  419. halt.As(100, reflect.TypeOf(p))
  420. }
  421. return
  422. }
  423. const isFlag = 1700
  424. func doWith(in IN) OUT {
  425. const left = "with:left"
  426. w := in.IR.(node.WithNode)
  427. f := in.Frame
  428. rt2.RegOf(f)[isFlag] = w.Left() //if
  429. var seq Do
  430. seq = func(in IN) OUT {
  431. last := rt2.RegOf(f)[isFlag].(node.Node)
  432. id := KeyOf(in, left)
  433. v := rt2.ValueOf(f)[id]
  434. assert.For(v != nil, 40)
  435. done := scope.GoTypeFrom(v).(bool)
  436. rt2.ValueOf(f)[id] = nil
  437. if done && last.Right() != nil {
  438. rt2.Push(rt2.New(last.Right()), f)
  439. return Later(Tail(STOP))
  440. } else if last.Right() == nil {
  441. return End()
  442. } else if last.Link() != nil { //elsif
  443. rt2.RegOf(f)[isFlag] = last.Link()
  444. return Later(func(IN) OUT { return GetStrange(in, left, last.Link(), seq) })
  445. } else if w.Right() != nil { //else
  446. rt2.Push(rt2.New(w.Right()), f)
  447. return Later(Tail(STOP))
  448. } else if w.Right() == nil {
  449. return End()
  450. } else if last == w.Right() {
  451. return End()
  452. } else {
  453. panic("conditional sequence wrong")
  454. }
  455. }
  456. return GetStrange(in, left, w.Left(), seq)
  457. }
  458. func int32Of(x interface{}) (a int32) {
  459. //fmt.Println(reflect.TypeOf(x))
  460. switch v := x.(type) {
  461. case *int32:
  462. z := *x.(*int32)
  463. a = z
  464. case int32:
  465. a = x.(int32)
  466. case *big.Int:
  467. a = int32(v.Int64())
  468. default:
  469. //panic(fmt.Sprintln("unsupported type", reflect.TypeOf(x)))
  470. }
  471. return a
  472. }
  473. func doCase(in IN) OUT {
  474. const left = "case:left"
  475. c := in.IR.(node.CaseNode)
  476. var e int
  477. do := func(in IN) (out OUT) {
  478. cond := c.Right().(node.ElseNode)
  479. //fmt.Println("case?", e, cond.Min(), cond.Max())
  480. if e < cond.Min() || e > cond.Max() { //case?
  481. if cond.Right() != nil {
  482. rt2.Push(rt2.New(cond.Right()), in.Frame)
  483. }
  484. out.Do = Tail(STOP)
  485. out.Next = LATER
  486. } else {
  487. for next := cond.Left(); next != nil && out.Do == nil; next = next.Link() {
  488. var ok bool
  489. // _c := next.Left()
  490. for _c := next.Left(); _c != nil && !ok; _c = _c.Link() {
  491. c := _c.(node.ConstantNode)
  492. //fmt.Println("const", c.Data(), c.Min(), c.Max())
  493. if (c.Min() != nil) && (c.Max() != nil) {
  494. //fmt.Println(e, *c.Max(), "..", *c.Min())
  495. ok = e >= *c.Min() && e <= *c.Max()
  496. } else {
  497. //fmt.Println(e, c.Data())
  498. ok = int32Of(c.Data()) == int32(e)
  499. }
  500. }
  501. //fmt.Println(ok)
  502. if ok {
  503. rt2.Push(rt2.New(next.Right()), in.Frame)
  504. out.Do = Tail(STOP)
  505. out.Next = LATER
  506. }
  507. }
  508. if out.Do == nil && cond.Right() != nil {
  509. rt2.Push(rt2.New(cond.Right()), in.Frame)
  510. out.Do = Tail(STOP)
  511. out.Next = LATER
  512. }
  513. }
  514. assert.For(out.Do != nil, 60)
  515. return out
  516. }
  517. return GetExpression(in, left, c.Left(), func(IN) (out OUT) {
  518. v := rt2.ValueOf(in.Frame)[KeyOf(in, left)]
  519. _x := scope.GoTypeFrom(v)
  520. switch x := _x.(type) {
  521. case nil:
  522. panic("nil")
  523. case int32:
  524. e = int(x)
  525. //fmt.Println("case", e)
  526. out.Do = do
  527. out.Next = NOW
  528. return out
  529. default:
  530. halt.As(100, "unsupported case expr", reflect.TypeOf(_x))
  531. }
  532. panic(0)
  533. })
  534. }