From 0830c8237400a4e16ae6bd689233c79625a00f64 Mon Sep 17 00:00:00 2001 From: ringabout <43030857+ringabout@users.noreply.github.com> Date: Sun, 11 Jan 2026 21:25:43 +0800 Subject: [PATCH] progress --- compiler/lambdalifting.nim | 5 ----- compiler/transf.nim | 20 +++++++++----------- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/compiler/lambdalifting.nim b/compiler/lambdalifting.nim index 42c6c5b0ab..3e74c6b9cb 100644 --- a/compiler/lambdalifting.nim +++ b/compiler/lambdalifting.nim @@ -686,11 +686,6 @@ proc liftCapturedVars(n: PNode; owner: PSym; d: var DetectionPass; s.transformedBody = newTree(nkStmtList, rawClosureCreation(s, d, c, n.info), body) finishClosureCreation(s, d, c, n.info, s.transformedBody) - if isIterator(s) and s.closureBody == nil: - if sfInjectDestructors in s.flags: - body = injectDestructorCalls(d.graph, d.idgen, s, body) - let closureBody = transformClosureIterator(d.graph, d.idgen, s, body) - s.closureBody = closureBody c.inContainer = oldInContainer if s.typ.callConv == ccClosure: diff --git a/compiler/transf.nim b/compiler/transf.nim index 9d529cefa0..ce42b684cd 100644 --- a/compiler/transf.nim +++ b/compiler/transf.nim @@ -38,7 +38,7 @@ type proc transformBody*(g: ModuleGraph; idgen: IdGenerator; prc: PSym; flags: TransformFlags): PNode -import closureiters, lambdalifting +import closureiters, lambdalifting, lambdautils type PTransCon = ref object # part of TContext; stackable @@ -125,17 +125,10 @@ proc transformSymAux(c: PTransf, n: PNode): PNode = if s.typ != nil and s.typ.callConv == ccClosure: var body: PNode = nil if s.kind in routineKinds: - body = transformBody(c.graph, c.idgen, s, {useCache}+c.flags) + discard transformBody(c.graph, c.idgen, s, {useCache}+c.flags) if s.kind == skIterator: - if c.tooEarly: - return n - else: - if s.closureBody == nil: - if sfInjectDestructors in s.flags: - body = injectDestructorCalls(c.graph, c.idgen, s, body) - let closureBody = transformClosureIterator(c.graph, c.idgen, s, body) - s.closureBody = closureBody - return liftIterSym(c.graph, n, c.idgen, getCurrOwner(c)) + if c.tooEarly: return n + else: return liftIterSym(c.graph, n, c.idgen, getCurrOwner(c)) elif s.kind in {skProc, skFunc, skConverter, skMethod} and not c.tooEarly: # top level .closure procs are still somewhat supported for 'Nake': return makeClosure(c.graph, c.idgen, s, nil, n.info) @@ -1326,6 +1319,11 @@ proc transformBody*(g: ModuleGraph; idgen: IdGenerator; prc: PSym; flags: Transf liftDefer(c, result) result = liftLocalsIfRequested(prc, result, g.cache, g.config, c.idgen) + if prc.isIterator: + if sfInjectDestructors in prc.flags: + result = injectDestructorCalls(c.graph, c.idgen, prc, result) + result = g.transformClosureIterator(c.idgen, prc, result) + prc.closureBody = result incl(result.flags, nfTransf)