summary refs log tree commit diff stats
path: root/compiler
diff options
context:
space:
mode:
authorYuriy Glukhov <yuriy.glukhov@gmail.com>2019-08-16 17:26:00 +0200
committerYuriy Glukhov <yuriy.glukhov@gmail.com>2019-08-16 17:26:00 +0200
commit721ca3e83087c6c4a7299102d04ba912d4f8dbae (patch)
tree6bc456090f8292644b8fa467929e52c45c733851 /compiler
parentd31404ac27503e87ae82544d7efa984f565199f7 (diff)
downloadNim-721ca3e83087c6c4a7299102d04ba912d4f8dbae.tar.gz
Reset closure iter exception before rethrowing
Diffstat (limited to 'compiler')
-rw-r--r--compiler/closureiters.nim11
1 files changed, 5 insertions, 6 deletions
diff --git a/compiler/closureiters.nim b/compiler/closureiters.nim
index c60ce96a2..c140b5464 100644
--- a/compiler/closureiters.nim
+++ b/compiler/closureiters.nim
@@ -90,9 +90,6 @@
 #  :unrollFinally = true
 #  goto nearestFinally (or -1 if not exists)
 #
-# Every finally block calls closureIterEndFinally() upon its successful
-# completion.
-#
 # Example:
 #
 # try:
@@ -126,6 +123,7 @@
 #     if :curExc.isNil:
 #       return :tmpResult
 #     else:
+#       closureIterSetupExc(nil)
 #       raise
 #   state = -1 # Goto next state. In this case we just exit
 #   break :stateLoop
@@ -809,10 +807,11 @@ proc newEndFinallyNode(ctx: var Ctx, info: TLineInfo): PNode =
   let retStmt = newTree(nkReturnStmt, asgn)
   let branch = newTree(nkElifBranch, cmp, retStmt)
 
-  # The C++ backend requires `getCurrentException` here.
-  let raiseStmt = newTree(nkRaiseStmt, ctx.g.callCodegenProc("getCurrentException"))
+  let nullifyExc = newTree(nkCall, newSymNode(ctx.g.getCompilerProc("closureIterSetupExc")), nilnode)
+  nullifyExc.info = info
+  let raiseStmt = newTree(nkRaiseStmt, curExc)
   raiseStmt.info = info
-  let elseBranch = newTree(nkElse, raiseStmt)
+  let elseBranch = newTree(nkElse, newTree(nkStmtList, nullifyExc, raiseStmt))
 
   let ifBody = newTree(nkIfStmt, branch, elseBranch)
   let elifBranch = newTree(nkElifBranch, ctx.newUnrollFinallyAccess(info), ifBody)