From cd35f9664ce5d3113c6678d7719b98902a4fa0d3 Mon Sep 17 00:00:00 2001 From: Araq Date: Thu, 20 Jun 2019 11:19:54 +0200 Subject: [PATCH] [refactoring] closureiters.nim: style change (cherry picked from commit c83914b4357f4413b15057fb61d20e7770d7ca6e) --- compiler/closureiters.nim | 260 +++++++++++++++++++------------------- 1 file changed, 129 insertions(+), 131 deletions(-) diff --git a/compiler/closureiters.nim b/compiler/closureiters.nim index 6f6bad942f..d1f2a6cd68 100644 --- a/compiler/closureiters.nim +++ b/compiler/closureiters.nim @@ -854,156 +854,155 @@ proc transformReturnsInTry(ctx: var Ctx, n: PNode): PNode = proc transformClosureIteratorBody(ctx: var Ctx, n: PNode, gotoOut: PNode): PNode = result = n - case n.kind: - of nkSkip: - discard + case n.kind + of nkSkip: discard - of nkStmtList, nkStmtListExpr: - result = addGotoOut(result, gotoOut) - for i in 0 ..< n.len: - if n[i].hasYields: - # Create a new split - let go = newNodeI(nkGotoState, n[i].info) - n[i] = ctx.transformClosureIteratorBody(n[i], go) + of nkStmtList, nkStmtListExpr: + result = addGotoOut(result, gotoOut) + for i in 0 ..< n.len: + if n[i].hasYields: + # Create a new split + let go = newNodeI(nkGotoState, n[i].info) + n[i] = ctx.transformClosureIteratorBody(n[i], go) - let s = newNodeI(nkStmtList, n[i + 1].info) - for j in i + 1 ..< n.len: - s.add(n[j]) + let s = newNodeI(nkStmtList, n[i + 1].info) + for j in i + 1 ..< n.len: + s.add(n[j]) - n.sons.setLen(i + 1) - discard ctx.newState(s, go) - if ctx.transformClosureIteratorBody(s, gotoOut) != s: - internalError(ctx.g.config, "transformClosureIteratorBody != s") - break + n.sons.setLen(i + 1) + discard ctx.newState(s, go) + if ctx.transformClosureIteratorBody(s, gotoOut) != s: + internalError(ctx.g.config, "transformClosureIteratorBody != s") + break - of nkYieldStmt: - result = newNodeI(nkStmtList, n.info) - result.add(n) - result.add(gotoOut) + of nkYieldStmt: + result = newNodeI(nkStmtList, n.info) + result.add(n) + result.add(gotoOut) - of nkElse, nkElseExpr: - result[0] = addGotoOut(result[0], gotoOut) - result[0] = ctx.transformClosureIteratorBody(result[0], gotoOut) + of nkElse, nkElseExpr: + result[0] = addGotoOut(result[0], gotoOut) + result[0] = ctx.transformClosureIteratorBody(result[0], gotoOut) - of nkElifBranch, nkElifExpr, nkOfBranch: - result[^1] = addGotoOut(result[^1], gotoOut) - result[^1] = ctx.transformClosureIteratorBody(result[^1], gotoOut) - - of nkIfStmt, nkCaseStmt: - for i in 0 ..< n.len: - n[i] = ctx.transformClosureIteratorBody(n[i], gotoOut) - if n[^1].kind != nkElse: - # We don't have an else branch, but every possible branch has to end with - # gotoOut, so add else here. - let elseBranch = newTree(nkElse, gotoOut) - n.add(elseBranch) - - of nkWhileStmt: - # while e: - # s - # -> - # BEGIN_STATE: - # if e: - # s - # goto BEGIN_STATE - # else: - # goto OUT - - result = newNodeI(nkGotoState, n.info) - - let s = newNodeI(nkStmtList, n.info) - discard ctx.newState(s, result) - let ifNode = newNodeI(nkIfStmt, n.info) - let elifBranch = newNodeI(nkElifBranch, n.info) - elifBranch.add(n[0]) - - var body = addGotoOut(n[1], result) - - body = ctx.transformBreaksAndContinuesInWhile(body, result, gotoOut) - body = ctx.transformClosureIteratorBody(body, result) - - elifBranch.add(body) - ifNode.add(elifBranch) + of nkElifBranch, nkElifExpr, nkOfBranch: + result[^1] = addGotoOut(result[^1], gotoOut) + result[^1] = ctx.transformClosureIteratorBody(result[^1], gotoOut) + of nkIfStmt, nkCaseStmt: + for i in 0 ..< n.len: + n[i] = ctx.transformClosureIteratorBody(n[i], gotoOut) + if n[^1].kind != nkElse: + # We don't have an else branch, but every possible branch has to end with + # gotoOut, so add else here. let elseBranch = newTree(nkElse, gotoOut) - ifNode.add(elseBranch) - s.add(ifNode) + n.add(elseBranch) - of nkBlockStmt: - result[1] = addGotoOut(result[1], gotoOut) - result[1] = ctx.transformBreaksInBlock(result[1], result[0], gotoOut) - result[1] = ctx.transformClosureIteratorBody(result[1], gotoOut) + of nkWhileStmt: + # while e: + # s + # -> + # BEGIN_STATE: + # if e: + # s + # goto BEGIN_STATE + # else: + # goto OUT - of nkTryStmt, nkHiddenTryStmt: - # See explanation above about how this works - ctx.hasExceptions = true + result = newNodeI(nkGotoState, n.info) - result = newNodeI(nkGotoState, n.info) - var tryBody = toStmtList(n[0]) - var exceptBody = ctx.collectExceptState(n) - var finallyBody = newTree(nkStmtList, getFinallyNode(ctx, n)) - finallyBody = ctx.transformReturnsInTry(finallyBody) - finallyBody.add(ctx.newEndFinallyNode(finallyBody.info)) + let s = newNodeI(nkStmtList, n.info) + discard ctx.newState(s, result) + let ifNode = newNodeI(nkIfStmt, n.info) + let elifBranch = newNodeI(nkElifBranch, n.info) + elifBranch.add(n[0]) - # The following index calculation is based on the knowledge how state - # indexes are assigned - let tryIdx = ctx.states.len - var exceptIdx, finallyIdx: int - if exceptBody.kind != nkEmpty: - exceptIdx = -(tryIdx + 1) - finallyIdx = tryIdx + 2 - else: - exceptIdx = tryIdx + 1 - finallyIdx = tryIdx + 1 + var body = addGotoOut(n[1], result) - let outToFinally = newNodeI(nkGotoState, finallyBody.info) + body = ctx.transformBreaksAndContinuesInWhile(body, result, gotoOut) + body = ctx.transformClosureIteratorBody(body, result) - block: # Create initial states. - let oldExcHandlingState = ctx.curExcHandlingState - ctx.curExcHandlingState = exceptIdx - let realTryIdx = ctx.newState(tryBody, result) - assert(realTryIdx == tryIdx) + elifBranch.add(body) + ifNode.add(elifBranch) - if exceptBody.kind != nkEmpty: - ctx.curExcHandlingState = finallyIdx - let realExceptIdx = ctx.newState(exceptBody, nil) - assert(realExceptIdx == -exceptIdx) + let elseBranch = newTree(nkElse, gotoOut) + ifNode.add(elseBranch) + s.add(ifNode) - ctx.curExcHandlingState = oldExcHandlingState - let realFinallyIdx = ctx.newState(finallyBody, outToFinally) - assert(realFinallyIdx == finallyIdx) + of nkBlockStmt: + result[1] = addGotoOut(result[1], gotoOut) + result[1] = ctx.transformBreaksInBlock(result[1], result[0], gotoOut) + result[1] = ctx.transformClosureIteratorBody(result[1], gotoOut) - block: # Subdivide the states - let oldNearestFinally = ctx.nearestFinally - ctx.nearestFinally = finallyIdx + of nkTryStmt, nkHiddenTryStmt: + # See explanation above about how this works + ctx.hasExceptions = true - let oldExcHandlingState = ctx.curExcHandlingState - - ctx.curExcHandlingState = exceptIdx - - if ctx.transformReturnsInTry(tryBody) != tryBody: - internalError(ctx.g.config, "transformReturnsInTry != tryBody") - if ctx.transformClosureIteratorBody(tryBody, outToFinally) != tryBody: - internalError(ctx.g.config, "transformClosureIteratorBody != tryBody") - - ctx.curExcHandlingState = finallyIdx - ctx.addElseToExcept(exceptBody) - if ctx.transformReturnsInTry(exceptBody) != exceptBody: - internalError(ctx.g.config, "transformReturnsInTry != exceptBody") - if ctx.transformClosureIteratorBody(exceptBody, outToFinally) != exceptBody: - internalError(ctx.g.config, "transformClosureIteratorBody != exceptBody") - - ctx.curExcHandlingState = oldExcHandlingState - ctx.nearestFinally = oldNearestFinally - if ctx.transformClosureIteratorBody(finallyBody, gotoOut) != finallyBody: - internalError(ctx.g.config, "transformClosureIteratorBody != finallyBody") - - of nkGotoState, nkForStmt: - internalError(ctx.g.config, "closure iter " & $n.kind) + result = newNodeI(nkGotoState, n.info) + var tryBody = toStmtList(n[0]) + var exceptBody = ctx.collectExceptState(n) + var finallyBody = newTree(nkStmtList, getFinallyNode(ctx, n)) + finallyBody = ctx.transformReturnsInTry(finallyBody) + finallyBody.add(ctx.newEndFinallyNode(finallyBody.info)) + # The following index calculation is based on the knowledge how state + # indexes are assigned + let tryIdx = ctx.states.len + var exceptIdx, finallyIdx: int + if exceptBody.kind != nkEmpty: + exceptIdx = -(tryIdx + 1) + finallyIdx = tryIdx + 2 else: - for i in 0 ..< n.len: - n[i] = ctx.transformClosureIteratorBody(n[i], gotoOut) + exceptIdx = tryIdx + 1 + finallyIdx = tryIdx + 1 + + let outToFinally = newNodeI(nkGotoState, finallyBody.info) + + block: # Create initial states. + let oldExcHandlingState = ctx.curExcHandlingState + ctx.curExcHandlingState = exceptIdx + let realTryIdx = ctx.newState(tryBody, result) + assert(realTryIdx == tryIdx) + + if exceptBody.kind != nkEmpty: + ctx.curExcHandlingState = finallyIdx + let realExceptIdx = ctx.newState(exceptBody, nil) + assert(realExceptIdx == -exceptIdx) + + ctx.curExcHandlingState = oldExcHandlingState + let realFinallyIdx = ctx.newState(finallyBody, outToFinally) + assert(realFinallyIdx == finallyIdx) + + block: # Subdivide the states + let oldNearestFinally = ctx.nearestFinally + ctx.nearestFinally = finallyIdx + + let oldExcHandlingState = ctx.curExcHandlingState + + ctx.curExcHandlingState = exceptIdx + + if ctx.transformReturnsInTry(tryBody) != tryBody: + internalError(ctx.g.config, "transformReturnsInTry != tryBody") + if ctx.transformClosureIteratorBody(tryBody, outToFinally) != tryBody: + internalError(ctx.g.config, "transformClosureIteratorBody != tryBody") + + ctx.curExcHandlingState = finallyIdx + ctx.addElseToExcept(exceptBody) + if ctx.transformReturnsInTry(exceptBody) != exceptBody: + internalError(ctx.g.config, "transformReturnsInTry != exceptBody") + if ctx.transformClosureIteratorBody(exceptBody, outToFinally) != exceptBody: + internalError(ctx.g.config, "transformClosureIteratorBody != exceptBody") + + ctx.curExcHandlingState = oldExcHandlingState + ctx.nearestFinally = oldNearestFinally + if ctx.transformClosureIteratorBody(finallyBody, gotoOut) != finallyBody: + internalError(ctx.g.config, "transformClosureIteratorBody != finallyBody") + + of nkGotoState, nkForStmt: + internalError(ctx.g.config, "closure iter " & $n.kind) + + else: + for i in 0 ..< n.len: + n[i] = ctx.transformClosureIteratorBody(n[i], gotoOut) proc stateFromGotoState(n: PNode): int = assert(n.kind == nkGotoState) @@ -1149,7 +1148,6 @@ proc newCatchBody(ctx: var Ctx, info: TLineInfo): PNode {.inline.} = # :state = exceptionTable[:state] block: - # exceptionTable[:state] let getNextState = newTree(nkBracketExpr, ctx.createExceptionTable(),