desparate stuff

This commit is contained in:
araq
2026-02-13 23:55:14 +01:00
parent da111462f5
commit 1a511d9032

View File

@@ -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: