stmt.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582
  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. heap := in.Frame.Domain().Discover(context.HEAP).(scope.Manager).Target().(scope.HeapAllocator)
  144. if a.Right() != nil {
  145. out = GetExpression(in, right, a.Right(), func(in IN) OUT {
  146. size := rt2.ValueOf(in.Frame)[KeyOf(in, right)]
  147. return GetDesignator(in, left, a.Left(), func(in IN) OUT {
  148. v := rt2.ValueOf(in.Frame)[KeyOf(in, left)].(scope.Variable)
  149. _, c := scope.Ops.TypeOf(v)
  150. fn := heap.Allocate("new", c.(object.PointerType), size)
  151. v.Set(fn)
  152. return End()
  153. })
  154. })
  155. } else {
  156. out = GetDesignator(in, left, a.Left(), func(IN) OUT {
  157. v := rt2.ValueOf(in.Frame)[KeyOf(in, left)].(scope.Variable)
  158. _, c := scope.Ops.TypeOf(v)
  159. fn := heap.Allocate("new", c.(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. const ifCode = 1700
  170. func doIf(in IN) OUT {
  171. const left = "if:left:if"
  172. i := in.IR.(node.IfNode)
  173. return GetExpression(in, left, i.Left(), func(in IN) OUT {
  174. val := rt2.ValueOf(in.Frame)[KeyOf(in, left)]
  175. assert.For(val != nil, 20)
  176. rt2.ValueOf(in.Parent)[i.Adr()] = val
  177. rt2.RegOf(in.Parent)[in.Key] = i.Adr()
  178. return End()
  179. })
  180. }
  181. func doCondition(in IN) OUT {
  182. const left = "if:left"
  183. i := in.IR.(node.ConditionalNode)
  184. rt2.RegOf(in.Frame)[ifCode] = i.Left() // if
  185. var next Do
  186. next = func(in IN) OUT {
  187. last := rt2.RegOf(in.Frame)[ifCode].(node.Node)
  188. fi := rt2.ValueOf(in.Frame)[KeyOf(in, left)]
  189. done := scope.GoTypeFrom(fi).(bool)
  190. rt2.RegOf(in.Frame)[ifCode] = nil
  191. rt2.ValueOf(in.Frame)[KeyOf(in, left)] = nil
  192. if done && last.Right() != nil {
  193. rt2.Push(rt2.New(last.Right()), in.Frame)
  194. return Later(Tail(STOP))
  195. } else if last.Right() == nil {
  196. return End()
  197. } else if last.Link() != nil { //elsif
  198. rt2.RegOf(in.Frame)[ifCode] = last.Link()
  199. return GetStrange(in, left, last.Link(), next)
  200. } else if i.Right() != nil { //else
  201. rt2.Push(rt2.New(i.Right()), in.Frame)
  202. return Later(Tail(STOP))
  203. } else if i.Right() == nil {
  204. return End()
  205. } else if i.Right() == last {
  206. return End()
  207. } else {
  208. halt.As(100, "wrong if then else")
  209. panic(100)
  210. }
  211. }
  212. return GetStrange(in, left, i.Left(), next)
  213. }
  214. func doWhile(in IN) OUT {
  215. const left = "while:left"
  216. w := in.IR.(node.WhileNode)
  217. var next Do
  218. next = func(IN) OUT {
  219. key := KeyOf(in, left)
  220. fi := rt2.ValueOf(in.Frame)[key]
  221. rt2.ValueOf(in.Frame)[key] = nil
  222. done := scope.GoTypeFrom(fi).(bool)
  223. if done && w.Right() != nil {
  224. rt2.Push(rt2.New(w.Right()), in.Frame)
  225. return Later(func(IN) OUT { return GetExpression(in, left, w.Left(), next) })
  226. } else if !done {
  227. return End()
  228. } else if w.Right() == nil {
  229. return End()
  230. } else {
  231. panic("unexpected while seq")
  232. }
  233. }
  234. return GetExpression(in, left, w.Left(), next)
  235. }
  236. const exitFlag = 1812
  237. func doExit(in IN) OUT {
  238. in.Frame.Root().ForEach(func(f frame.Frame) (ok bool) {
  239. n := rt2.NodeOf(f)
  240. _, ok = n.(node.LoopNode)
  241. if ok {
  242. rt2.RegOf(f)[exitFlag] = true
  243. }
  244. ok = !ok
  245. return ok
  246. })
  247. return End()
  248. }
  249. func doLoop(in IN) OUT {
  250. l := in.IR.(node.LoopNode)
  251. exit, ok := rt2.RegOf(in.Frame)[exitFlag].(bool)
  252. if ok && exit {
  253. return End()
  254. }
  255. if l.Left() != nil {
  256. rt2.Push(rt2.New(l.Left()), in.Frame)
  257. return Later(doLoop)
  258. } else if l.Left() == nil {
  259. return End()
  260. } else {
  261. panic("unexpected loop seq")
  262. }
  263. }
  264. func doRepeat(in IN) OUT {
  265. const right = "return:right"
  266. r := in.IR.(node.RepeatNode)
  267. rt2.ValueOf(in.Frame)[r.Right().Adr()] = scope.TypeFromGo(false)
  268. var next Do
  269. next = func(in IN) OUT {
  270. fi := rt2.ValueOf(in.Frame)[r.Right().Adr()]
  271. done := scope.GoTypeFrom(fi).(bool)
  272. if !done && r.Left() != nil {
  273. rt2.Push(rt2.New(r.Left()), in.Frame)
  274. return Later(func(IN) OUT { return GetExpression(in, right, r.Right(), next) })
  275. } else if done {
  276. return End()
  277. } else if r.Left() == nil {
  278. return End()
  279. } else {
  280. panic("unexpected repeat seq")
  281. }
  282. }
  283. return Now(next)
  284. }
  285. func doTrap(in IN) OUT {
  286. const left = "trap:left"
  287. return GetExpression(in, left, in.IR.Left(), func(IN) OUT {
  288. val := rt2.ValueOf(in.Frame)[KeyOf(in, left)]
  289. log.Println("TRAP:", traps.This(scope.GoTypeFrom(val)))
  290. return Now(Tail(WRONG))
  291. })
  292. }
  293. func doReturn(in IN) OUT {
  294. const left = "return:left"
  295. r := in.IR.(node.ReturnNode)
  296. return GetExpression(in, left, r.Left(), func(IN) OUT {
  297. val := rt2.ValueOf(in.Frame)[KeyOf(in, left)]
  298. if val == nil {
  299. val, _ = rt2.RegOf(in.Frame)[context.RETURN].(scope.Value)
  300. }
  301. assert.For(val != nil, 40)
  302. rt2.ValueOf(in.Parent)[r.Object().Adr()] = val
  303. rt2.RegOf(in.Parent)[context.RETURN] = val
  304. return End()
  305. })
  306. }
  307. func doCall(in IN) (out OUT) {
  308. const (
  309. right = "call:right"
  310. )
  311. c := in.IR.(node.CallNode)
  312. call := func(proc node.Node, d context.Domain) {
  313. _, ok := proc.(node.EnterNode)
  314. assert.For(ok, 20, "try call", reflect.TypeOf(proc), proc.Adr(), proc.Object().Adr())
  315. nf := rt2.New(proc)
  316. rt2.Push(nf, in.Frame)
  317. if d != nil {
  318. rt2.ReplaceDomain(nf, d)
  319. }
  320. //передаем ссылку на цепочку значений параметров в данные фрейма входа в процедуру
  321. if (c.Right() != nil) && (proc.Object() != nil) {
  322. rt2.RegOf(nf)[proc.Object()] = c.Right()
  323. } else {
  324. //fmt.Println("no data for call")
  325. }
  326. out = Later(func(in IN) OUT {
  327. if in.Key != nil {
  328. val := rt2.ValueOf(in.Frame)[c.Left().Object().Adr(0, 0)]
  329. if val == nil {
  330. if rv, _ := rt2.RegOf(in.Frame)[context.RETURN].(scope.Value); rv != nil {
  331. val = rv
  332. }
  333. }
  334. if val != nil {
  335. id := cp.ID(cp.Some())
  336. rt2.ValueOf(in.Parent)[id] = val
  337. rt2.RegOf(in.Parent)[in.Key] = id
  338. } else {
  339. utils.PrintFrame("possibly no return", in.Key, rt2.RegOf(in.Frame), rt2.ValueOf(in.Frame), rt2.RegOf(in.Parent), rt2.ValueOf(in.Parent))
  340. }
  341. }
  342. return End()
  343. })
  344. }
  345. switch p := c.Left().(type) {
  346. case node.EnterNode:
  347. call(p, nil)
  348. case node.ProcedureNode:
  349. //m := rtm.DomainModule(in.Frame.Domain())
  350. ml := in.Frame.Domain().Global().Discover(context.MOD).(rtm.List)
  351. switch p.Object().Mode() {
  352. case object.LOCAL_PROC, object.EXTERNAL_PROC:
  353. if imp := p.Object().Imp(); imp == "" {
  354. m := rtm.ModuleOfObject(in.Frame.Domain(), p.Object())
  355. proc := m.NodeByObject(p.Object())
  356. assert.For(proc != nil, 40, m.Name, imp, p.Object().Imp(), p.Object().Adr(0, 0), p.Object().Name())
  357. call(proc[0], nil)
  358. } else {
  359. m := ml.Loaded(imp)
  360. pl := m.ObjectByName(m.Enter, c.Left().Object().Name())
  361. var proc object.ProcedureObject
  362. var nl []node.Node
  363. for _, n := range pl {
  364. if n.Mode() == p.Object().Mode() {
  365. proc = n.(object.ProcedureObject)
  366. }
  367. }
  368. nl = m.NodeByObject(proc)
  369. utils.PrintFrame("foreign call", len(nl), "proc refs", proc)
  370. call(nl[0], in.Frame.Domain().Global().Discover(imp).(context.Domain))
  371. }
  372. case object.TYPE_PROC:
  373. //sc := f.Domain().Discover(context.SCOPE).(scope.Manager)
  374. out = GetExpression(in, right, c.Right(), func(IN) (out OUT) {
  375. var (
  376. proc []node.Node
  377. dm context.Domain
  378. )
  379. id := KeyOf(in, right)
  380. v := rt2.ValueOf(in.Frame)[id]
  381. t, ct := scope.Ops.TypeOf(v)
  382. if ct == nil {
  383. return makeTrap(in.Frame, traps.Default)
  384. }
  385. assert.For(ct != nil, 40, id, v, t)
  386. x := ml.NewTypeCalc()
  387. x.ConnectTo(ct)
  388. sup := p.Super()
  389. for _, ml := range x.MethodList() {
  390. for _, m := range ml {
  391. //fmt.Println(m.Obj.Name(), m.Obj.Adr())
  392. if m.Obj.Name() == p.Object().Name() {
  393. if !sup {
  394. proc = append(proc, m.Enter)
  395. break
  396. } else {
  397. sup = false //супервызов должен быть вторым методом с тем же именем
  398. }
  399. dm = in.Frame.Domain().Global().Discover(m.Mod.Name).(context.Domain)
  400. }
  401. }
  402. if len(proc) > 0 {
  403. break
  404. }
  405. }
  406. assert.For(len(proc) > 0, 40, p.Object().Name())
  407. call(proc[0], dm)
  408. out = Later(Tail(STOP))
  409. return
  410. })
  411. default:
  412. halt.As(100, "wrong proc mode ", p.Object().Mode(), p.Object().Adr(), p.Object().Name())
  413. }
  414. case node.VariableNode:
  415. m := rtm.DomainModule(in.Frame.Domain())
  416. sc := rt2.ScopeFor(in.Frame, p.Object().Adr())
  417. var obj interface{}
  418. sc.Select(p.Object().Adr(), func(in scope.Value) {
  419. obj = scope.GoTypeFrom(in)
  420. })
  421. if obj, ok := obj.(object.Object); ok {
  422. proc := m.NodeByObject(obj)
  423. call(proc[0], nil)
  424. } else {
  425. name := p.Object().Name()
  426. switch {
  427. case sys[name] != nil:
  428. return syscall(in)
  429. default:
  430. halt.As(100, "unknown sysproc variable", name)
  431. }
  432. }
  433. default:
  434. halt.As(100, reflect.TypeOf(p))
  435. }
  436. return
  437. }
  438. const isFlag = 1700
  439. func doWith(in IN) OUT {
  440. const left = "with:left"
  441. w := in.IR.(node.WithNode)
  442. f := in.Frame
  443. rt2.RegOf(f)[isFlag] = w.Left() //if
  444. var seq Do
  445. seq = func(in IN) OUT {
  446. last := rt2.RegOf(f)[isFlag].(node.Node)
  447. id := KeyOf(in, left)
  448. v := rt2.ValueOf(f)[id]
  449. assert.For(v != nil, 40)
  450. done := scope.GoTypeFrom(v).(bool)
  451. rt2.ValueOf(f)[id] = nil
  452. if done && last.Right() != nil {
  453. rt2.Push(rt2.New(last.Right()), f)
  454. return Later(Tail(STOP))
  455. } else if last.Right() == nil {
  456. return End()
  457. } else if last.Link() != nil { //elsif
  458. rt2.RegOf(f)[isFlag] = last.Link()
  459. return Later(func(IN) OUT { return GetStrange(in, left, last.Link(), seq) })
  460. } else if w.Right() != nil { //else
  461. rt2.Push(rt2.New(w.Right()), f)
  462. return Later(Tail(STOP))
  463. } else if w.Right() == nil {
  464. return End()
  465. } else if last == w.Right() {
  466. return End()
  467. } else {
  468. panic("conditional sequence wrong")
  469. }
  470. }
  471. return GetStrange(in, left, w.Left(), seq)
  472. }
  473. func int32Of(x interface{}) (a int32) {
  474. //fmt.Println(reflect.TypeOf(x))
  475. switch v := x.(type) {
  476. case *int32:
  477. z := *x.(*int32)
  478. a = z
  479. case int32:
  480. a = x.(int32)
  481. case *big.Int:
  482. a = int32(v.Int64())
  483. default:
  484. //panic(fmt.Sprintln("unsupported type", reflect.TypeOf(x)))
  485. }
  486. return a
  487. }
  488. func doCase(in IN) OUT {
  489. const left = "case:left"
  490. c := in.IR.(node.CaseNode)
  491. var e int
  492. do := func(in IN) (out OUT) {
  493. cond := c.Right().(node.ElseNode)
  494. //fmt.Println("case?", e, cond.Min(), cond.Max())
  495. if e < cond.Min() || e > cond.Max() { //case?
  496. if cond.Right() != nil {
  497. rt2.Push(rt2.New(cond.Right()), in.Frame)
  498. }
  499. out.Do = Tail(STOP)
  500. out.Next = LATER
  501. } else {
  502. for next := cond.Left(); next != nil && out.Do == nil; next = next.Link() {
  503. var ok bool
  504. // _c := next.Left()
  505. for _c := next.Left(); _c != nil && !ok; _c = _c.Link() {
  506. c := _c.(node.ConstantNode)
  507. //fmt.Println("const", c.Data(), c.Min(), c.Max())
  508. if (c.Min() != nil) && (c.Max() != nil) {
  509. //fmt.Println(e, *c.Max(), "..", *c.Min())
  510. ok = e >= *c.Min() && e <= *c.Max()
  511. } else {
  512. //fmt.Println(e, c.Data())
  513. ok = int32Of(c.Data()) == int32(e)
  514. }
  515. }
  516. //fmt.Println(ok)
  517. if ok {
  518. rt2.Push(rt2.New(next.Right()), in.Frame)
  519. out.Do = Tail(STOP)
  520. out.Next = LATER
  521. }
  522. }
  523. if out.Do == nil && cond.Right() != nil {
  524. rt2.Push(rt2.New(cond.Right()), in.Frame)
  525. out.Do = Tail(STOP)
  526. out.Next = LATER
  527. }
  528. }
  529. assert.For(out.Do != nil, 60)
  530. return out
  531. }
  532. return GetExpression(in, left, c.Left(), func(IN) (out OUT) {
  533. v := rt2.ValueOf(in.Frame)[KeyOf(in, left)]
  534. _x := scope.GoTypeFrom(v)
  535. switch x := _x.(type) {
  536. case nil:
  537. panic("nil")
  538. case int32:
  539. e = int(x)
  540. //fmt.Println("case", e)
  541. out.Do = do
  542. out.Next = NOW
  543. return out
  544. default:
  545. halt.As(100, "unsupported case expr", reflect.TypeOf(_x))
  546. }
  547. panic(0)
  548. })
  549. }