diff options
author | Yuriy Glukhov <yuriy.glukhov@gmail.com> | 2018-05-04 16:39:59 +0300 |
---|---|---|
committer | Yuriy Glukhov <yuriy.glukhov@gmail.com> | 2018-05-09 22:25:28 +0300 |
commit | ac86b8ce615cbd55074dfd27f42ed0368d84b1fd (patch) | |
tree | e844532f3bb99ea8e05091ab85e8ee380a40e09e /compiler | |
parent | ce634909281ffc8efbc7d192f557ffe38f49e740 (diff) | |
download | Nim-ac86b8ce615cbd55074dfd27f42ed0368d84b1fd.tar.gz |
Cleanup
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/closureiters.nim | 80 |
1 files changed, 31 insertions, 49 deletions
diff --git a/compiler/closureiters.nim b/compiler/closureiters.nim index 504f70347..a8e7e0274 100644 --- a/compiler/closureiters.nim +++ b/compiler/closureiters.nim @@ -123,14 +123,10 @@ # STATE2: # Finally # yield 2 # if :unrollFinally: # This node is created by `newEndFinallyNode` -# when nearestFinally == 0: # Pseudocode. The `when` is not emitted in reality -# if :curExc.isNil: -# return :tmpResult -# else: -# raise +# if :curExc.isNil: +# return :tmpResult # else: -# :state = nearestFinally -# break :stateLoop +# raise # state = -1 # Goto next state. In this case we just exit # break :stateLoop @@ -427,15 +423,10 @@ proc lowerStmtListExpr(ctx: var Ctx, n: PNode): PNode = proc newEndFinallyNode(ctx: var Ctx): PNode = # Generate the following code: # if :unrollFinally: - # when nearestFinally == 0: # Pseudocode. The `when` is not emitted in reality # if :curExc.isNil: # return :tmpResult # else: # raise - # else: - # goto nearestFinally - # :state = nearestFinally - # break :stateLoop result = newNode(nkIfStmt) @@ -443,44 +434,35 @@ proc newEndFinallyNode(ctx: var Ctx): PNode = elifBranch.add(ctx.newUnrollFinallyAccess()) result.add(elifBranch) - var ifBody: PNode - - if ctx.nearestFinally == 0 or true: - ifBody = newNode(nkIfStmt) - let branch = newNode(nkElifBranch) - - let cmp = newNode(nkCall) - cmp.add(getSysMagic("==", mEqRef).newSymNode) - let curExc = ctx.newCurExcAccess() - let nilnode = newNode(nkNilLit) - nilnode.typ = curExc.typ - cmp.add(curExc) - cmp.add(nilnode) - cmp.typ = getSysType(tyBool) - branch.add(cmp) - - var retStmt = newNode(nkReturnStmt) - if true: - var a = newNode(nkAsgn) - addSon(a, newSymNode(getClosureIterResult(ctx.fn))) - addSon(a, ctx.newTmpResultAccess()) - retStmt.add(a) - else: - retStmt.add(emptyNode) - branch.add(retStmt) - - let elseBranch = newNode(nkElse) - let raiseStmt = newNode(nkRaiseStmt) - - # The C++ backend requires `getCurrentException` here. - raiseStmt.add(callCodegenProc("getCurrentException", emptyNode)) - elseBranch.add(raiseStmt) + let ifBody = newNode(nkIfStmt) + let branch = newNode(nkElifBranch) - ifBody.add(branch) - ifBody.add(elseBranch) - else: - ifBody = newNode(nkGotoState) - ifBody.add(newIntLit(ctx.nearestFinally)) + let cmp = newNode(nkCall) + cmp.add(getSysMagic("==", mEqRef).newSymNode) + let curExc = ctx.newCurExcAccess() + let nilnode = newNode(nkNilLit) + nilnode.typ = curExc.typ + cmp.add(curExc) + cmp.add(nilnode) + cmp.typ = getSysType(tyBool) + branch.add(cmp) + + let retStmt = newNode(nkReturnStmt) + let asgn = newNode(nkAsgn) + addSon(asgn, newSymNode(getClosureIterResult(ctx.fn))) + addSon(asgn, ctx.newTmpResultAccess()) + retStmt.add(asgn) + branch.add(retStmt) + + let elseBranch = newNode(nkElse) + let raiseStmt = newNode(nkRaiseStmt) + + # The C++ backend requires `getCurrentException` here. + raiseStmt.add(callCodegenProc("getCurrentException", emptyNode)) + elseBranch.add(raiseStmt) + + ifBody.add(branch) + ifBody.add(elseBranch) elifBranch.add(ifBody) |