diff options
author | Yuriy Glukhov <yuriy.glukhov@gmail.com> | 2019-08-16 17:26:00 +0200 |
---|---|---|
committer | Yuriy Glukhov <yuriy.glukhov@gmail.com> | 2019-08-16 17:26:00 +0200 |
commit | 721ca3e83087c6c4a7299102d04ba912d4f8dbae (patch) | |
tree | 6bc456090f8292644b8fa467929e52c45c733851 /compiler | |
parent | d31404ac27503e87ae82544d7efa984f565199f7 (diff) | |
download | Nim-721ca3e83087c6c4a7299102d04ba912d4f8dbae.tar.gz |
Reset closure iter exception before rethrowing
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/closureiters.nim | 11 |
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) |