summary refs log tree commit diff stats
path: root/compiler/dfa.nim
diff options
context:
space:
mode:
authorcooldome <cdome@bk.ru>2019-01-28 07:32:14 +0000
committerAndreas Rumpf <rumpf_a@web.de>2019-01-28 08:32:14 +0100
commit690f21043d7c1cad321e116fdc666b2951ba1da3 (patch)
treea4e512fbb6cba321b4f3c30fc22b68143018225b /compiler/dfa.nim
parent5fa8a61a238c08bca12da272f71692f2f103b6d8 (diff)
downloadNim-690f21043d7c1cad321e116fdc666b2951ba1da3.tar.gz
isLastRead regression fix (#10463)
* fixes #10462

* add a test
Diffstat (limited to 'compiler/dfa.nim')
-rw-r--r--compiler/dfa.nim15
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