mirror of
https://github.com/nim-lang/Nim.git
synced 2026-04-20 06:20:38 +00:00
desparate stuff
This commit is contained in:
@@ -17,7 +17,7 @@ import
|
||||
ast, astalgo, msgs, renderer, magicsys, types, idents,
|
||||
options, lowerings, modulegraphs,
|
||||
lineinfos, parampatterns, sighashes, liftdestructors, optimizer,
|
||||
varpartitions, aliasanalysis, dfa, wordrecg
|
||||
varpartitions, aliasanalysis, dfa, wordrecg, lambdalifting
|
||||
|
||||
import std/[strtabs, tables, strutils, intsets]
|
||||
|
||||
@@ -879,9 +879,24 @@ proc p(n: PNode; c: var Con; s: var Scope; mode: ProcessMode; tmpFlags = {sfSing
|
||||
|
||||
result = copyTree(n)
|
||||
for i in ord(n.kind == nkClosure)..<n.len:
|
||||
# nkClosure env (i=1): must not consume; it's shared with lexical refs
|
||||
# (e.g. hash(inner) after `let inner2 = inner` needs the env).
|
||||
let mClosure = if n.kind == nkClosure and i == 1: normal else: m
|
||||
# nkClosure env (i=1): Critical for closure environment lifetime.
|
||||
# - Fresh nkObjConstr: Use mode `m` (parent decides - may sink into new env)
|
||||
# - Current proc's :envP param: Force `normal` (shared across closure calls)
|
||||
# - Other cases: Force `normal` (conservative - may be shared/aliased)
|
||||
let mClosure = if n.kind == nkClosure and i == 1:
|
||||
let envNode = n[1].skipConv
|
||||
if envNode.kind == nkSym:
|
||||
let ep = getEnvParam(c.owner)
|
||||
if ep != nil and envNode.sym.id == ep.id:
|
||||
# Current scope's env param - reused across closure invocations, don't consume
|
||||
normal
|
||||
else:
|
||||
# Other symbol (local var, param, temp) - use parent mode (may sink if last use)
|
||||
m
|
||||
else:
|
||||
# nkObjConstr or other constructs - use parent mode
|
||||
m
|
||||
else: m
|
||||
if n[i].kind == nkExprColonExpr:
|
||||
result[i][1] = p(n[i][1], c, s, mClosure)
|
||||
elif n[i].kind == nkRange:
|
||||
|
||||
Reference in New Issue
Block a user