diff options
Diffstat (limited to 'compiler/closureiters.nim')
-rw-r--r-- | compiler/closureiters.nim | 81 |
1 files changed, 50 insertions, 31 deletions
diff --git a/compiler/closureiters.nim b/compiler/closureiters.nim index 86b63e34b..5568fd37b 100644 --- a/compiler/closureiters.nim +++ b/compiler/closureiters.nim @@ -155,6 +155,10 @@ type nearestFinally: int # Index of the nearest finally block. For try/except it # is their finally. For finally it is parent finally. Otherwise -1 +const + nkSkip = { nkEmpty..nkNilLit, nkTemplateDef, nkTypeSection, nkStaticStmt, + nkCommentStmt } + procDefs + proc newStateAccess(ctx: var Ctx): PNode = if ctx.stateVarSym.isNil: result = rawIndirectAccess(newSymNode(getEnvParam(ctx.fn)), @@ -247,8 +251,7 @@ proc hasYields(n: PNode): bool = case n.kind of nkYieldStmt: result = true - of nkCharLit..nkUInt64Lit, nkFloatLit..nkFloat128Lit, nkStrLit..nkTripleStrLit, - nkSym, nkIdent, procDefs, nkTemplateDef: + of nkSkip: discard else: for c in n: @@ -259,8 +262,7 @@ proc hasYields(n: PNode): bool = proc transformBreaksAndContinuesInWhile(ctx: var Ctx, n: PNode, before, after: PNode): PNode = result = n case n.kind - of nkCharLit..nkUInt64Lit, nkFloatLit..nkFloat128Lit, nkStrLit..nkTripleStrLit, - nkSym, nkIdent, procDefs, nkTemplateDef: + of nkSkip: discard of nkWhileStmt: discard # Do not recurse into nested whiles of nkContinueStmt: @@ -279,8 +281,7 @@ proc transformBreaksAndContinuesInWhile(ctx: var Ctx, n: PNode, before, after: P proc transformBreaksInBlock(ctx: var Ctx, n: PNode, label, after: PNode): PNode = result = n case n.kind - of nkCharLit..nkUInt64Lit, nkFloatLit..nkFloat128Lit, nkStrLit..nkTripleStrLit, - nkSym, nkIdent, procDefs, nkTemplateDef: + of nkSkip: discard of nkBlockStmt, nkWhileStmt: inc ctx.blockLevel @@ -380,8 +381,7 @@ proc getFinallyNode(n: PNode): PNode = proc hasYieldsInExpressions(n: PNode): bool = case n.kind - of nkCharLit..nkUInt64Lit, nkFloatLit..nkFloat128Lit, nkStrLit..nkTripleStrLit, - nkSym, nkIdent, procDefs, nkTemplateDef: + of nkSkip: discard of nkStmtListExpr: if isEmptyType(n.typ): @@ -397,18 +397,17 @@ proc hasYieldsInExpressions(n: PNode): bool = proc exprToStmtList(n: PNode): tuple[s, res: PNode] = assert(n.kind == nkStmtListExpr) + result.s = newNodeI(nkStmtList, n.info) + result.s.sons = @[] - var parent = n - var lastSon = n[^1] + var n = n + while n.kind == nkStmtListExpr: + result.s.sons.add(n.sons) + result.s.sons.setLen(result.s.sons.len - 1) # delete last son + n = n[^1] - while lastSon.kind == nkStmtListExpr: - parent = lastSon - lastSon = lastSon[^1] + result.res = n - result.s = newNodeI(nkStmtList, n.info) - result.s.sons = parent.sons - result.s.sons.setLen(result.s.sons.len - 1) # delete last son - result.res = lastSon proc newEnvVarAsgn(ctx: Ctx, s: PSym, v: PNode): PNode = result = newTree(nkFastAsgn, ctx.newEnvVarAccess(s), v) @@ -433,8 +432,7 @@ proc newNotCall(g: ModuleGraph; e: PNode): PNode = proc lowerStmtListExprs(ctx: var Ctx, n: PNode, needsSplit: var bool): PNode = result = n case n.kind - of nkCharLit..nkUInt64Lit, nkFloatLit..nkFloat128Lit, nkStrLit..nkTripleStrLit, - nkSym, nkIdent, procDefs, nkTemplateDef: + of nkSkip: discard of nkYieldStmt: @@ -443,7 +441,6 @@ proc lowerStmtListExprs(ctx: var Ctx, n: PNode, needsSplit: var bool): PNode = n[i] = ctx.lowerStmtListExprs(n[i], ns) if ns: - assert(n[0].kind == nkStmtListExpr) result = newNodeI(nkStmtList, n.info) let (st, ex) = exprToStmtList(n[0]) result.add(st) @@ -663,7 +660,6 @@ proc lowerStmtListExprs(ctx: var Ctx, n: PNode, needsSplit: var bool): PNode = c[^1] = ctx.lowerStmtListExprs(c[^1], ns) if ns: needsSplit = true - assert(c[^1].kind == nkStmtListExpr) let (st, ex) = exprToStmtList(c[^1]) result.add(st) c[^1] = ex @@ -736,6 +732,33 @@ proc lowerStmtListExprs(ctx: var Ctx, n: PNode, needsSplit: var bool): PNode = n[0] = newSymNode(ctx.g.getSysSym(n[0].info, "true")) n[1] = newBody + + of nkDotExpr: + var ns = false + n[0] = ctx.lowerStmtListExprs(n[0], ns) + if ns: + needsSplit = true + result = newNodeI(nkStmtListExpr, n.info) + result.typ = n.typ + let (st, ex) = exprToStmtList(n[0]) + result.add(st) + n[0] = ex + result.add(n) + + of nkBlockExpr: + var ns = false + n[1] = ctx.lowerStmtListExprs(n[1], ns) + if ns: + needsSplit = true + result = newNodeI(nkStmtListExpr, n.info) + result.typ = n.typ + let (st, ex) = exprToStmtList(n[1]) + n.kind = nkBlockStmt + n.typ = nil + n[1] = st + result.add(n) + result.add(ex) + else: for i in 0 ..< n.len: n[i] = ctx.lowerStmtListExprs(n[i], needsSplit) @@ -797,8 +820,7 @@ proc transformReturnsInTry(ctx: var Ctx, n: PNode): PNode = let goto = newTree(nkGotoState, ctx.g.newIntLit(n.info, ctx.nearestFinally)) result.add(goto) - of nkCharLit..nkUInt64Lit, nkFloatLit..nkFloat128Lit, nkStrLit..nkTripleStrLit, - nkSym, nkIdent, procDefs, nkTemplateDef: + of nkSkip: discard else: for i in 0 ..< n.len: @@ -807,8 +829,7 @@ proc transformReturnsInTry(ctx: var Ctx, n: PNode): PNode = proc transformClosureIteratorBody(ctx: var Ctx, n: PNode, gotoOut: PNode): PNode = result = n case n.kind: - of nkCharLit..nkUInt64Lit, nkFloatLit..nkFloat128Lit, nkStrLit..nkTripleStrLit, - nkSym, nkIdent, procDefs, nkTemplateDef: + of nkSkip: discard of nkStmtList, nkStmtListExpr: @@ -846,8 +867,8 @@ proc transformClosureIteratorBody(ctx: var Ctx, n: PNode, gotoOut: PNode): PNode result[0] = ctx.transformClosureIteratorBody(result[0], gotoOut) of nkElifBranch, nkElifExpr, nkOfBranch: - result[1] = addGotoOut(result[1], gotoOut) - result[1] = ctx.transformClosureIteratorBody(result[1], gotoOut) + result[^1] = addGotoOut(result[^1], gotoOut) + result[^1] = ctx.transformClosureIteratorBody(result[^1], gotoOut) of nkIfStmt, nkCaseStmt: for i in 0 ..< n.len: @@ -1013,8 +1034,7 @@ proc tranformStateAssignments(ctx: var Ctx, n: PNode): PNode = for i in 0 ..< n.len: n[i] = ctx.tranformStateAssignments(n[i]) - of nkCharLit..nkUInt64Lit, nkFloatLit..nkFloat128Lit, nkStrLit..nkTripleStrLit, - nkSym, nkIdent, procDefs, nkTemplateDef: + of nkSkip: discard of nkReturnStmt: @@ -1066,8 +1086,7 @@ proc skipEmptyStates(ctx: Ctx, stateIdx: int): int = proc skipThroughEmptyStates(ctx: var Ctx, n: PNode): PNode = result = n case n.kind - of nkCharLit..nkUInt64Lit, nkFloatLit..nkFloat128Lit, nkStrLit..nkTripleStrLit, - nkSym, nkIdent, procDefs, nkTemplateDef: + of nkSkip: discard of nkGotoState: result = copyTree(n) |