diff options
author | cooldome <cdome@bk.ru> | 2019-01-28 07:32:14 +0000 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2019-01-28 08:32:14 +0100 |
commit | 690f21043d7c1cad321e116fdc666b2951ba1da3 (patch) | |
tree | a4e512fbb6cba321b4f3c30fc22b68143018225b /compiler/dfa.nim | |
parent | 5fa8a61a238c08bca12da272f71692f2f103b6d8 (diff) | |
download | Nim-690f21043d7c1cad321e116fdc666b2951ba1da3.tar.gz |
isLastRead regression fix (#10463)
* fixes #10462 * add a test
Diffstat (limited to 'compiler/dfa.nim')
-rw-r--r-- | compiler/dfa.nim | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/compiler/dfa.nim b/compiler/dfa.nim index f34981000..462cf0fb7 100644 --- a/compiler/dfa.nim +++ b/compiler/dfa.nim @@ -74,7 +74,7 @@ proc codeListing(c: ControlFlowGraph, result: var string, start=0; last = -1) = while i <= last: if i in jumpTargets: result.add("L" & $i & ":\n") result.add "\t" - result.add $c[i].kind + result.add ($i & " " & $c[i].kind) result.add "\t" case c[i].kind of def, use: @@ -540,13 +540,17 @@ proc genTry(c: var Con; n: PNode) = c.gen(fin.sons[0]) doAssert(c.forks.len == oldLen) +template genNoReturn(c: var Con; n: PNode) = + # leave the graph + c.code.add Instr(n: n, kind: goto, dest: high(int) - c.code.len) + proc genRaise(c: var Con; n: PNode) = genJoins(c, n) gen(c, n.sons[0]) if c.inTryStmt > 0: c.tryStmtFixups.add c.gotoI(n) else: - c.code.add Instr(n: n, kind: goto, dest: high(int) - c.code.len) + genNoReturn(c, n) proc genImplicitReturn(c: var Con) = if c.owner.kind in {skProc, skFunc, skMethod, skIterator, skConverter} and resultPos < c.owner.ast.len: @@ -558,7 +562,7 @@ proc genReturn(c: var Con; n: PNode) = gen(c, n.sons[0]) else: genImplicitReturn(c) - c.code.add Instr(n: n, kind: goto, dest: high(int) - c.code.len) + genNoReturn(c, n) const InterestingSyms = {skVar, skResult, skLet, skParam} @@ -612,9 +616,6 @@ proc genMagic(c: var Con; n: PNode; m: TMagic) = of mNew, mNewFinalize: genDef(c, n[1]) for i in 2..<n.len: gen(c, n[i]) - of mExit: - genCall(c, n) - c.code.add Instr(n: n, kind: goto, dest: high(int) - c.code.len) else: genCall(c, n) @@ -639,6 +640,8 @@ proc gen(c: var Con; n: PNode) = genMagic(c, n, s.magic) else: genCall(c, n) + if sfNoReturn in n.sons[0].sym.flags: + genNoReturn(c, n) else: genCall(c, n) of nkCharLit..nkNilLit: discard |