stmt.go 15 KB

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