From 7229d7bce377fb4b7dd098b92697b589a27a2531 Mon Sep 17 00:00:00 2001 From: metagn Date: Tue, 10 Jun 2025 23:08:38 +0300 Subject: [PATCH 1/2] test disabling copy for orig node in calls --- compiler/semexprs.nim | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 6cc29bd86f26..65b00cbe62c2 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -1114,7 +1114,7 @@ proc semIndirectOp(c: PContext, n: PNode, flags: TExprFlags; expectedType: PType if n.len == 1: return semObjConstr(c, n, flags, expectedType) return semConv(c, n, flags) - let nOrig = n.copyTree + let nOrig = n#.copyTree semOpAux(c, n) if t != nil and t.kind == tyProc: # This is a proc variable, apply normal overload resolution @@ -1179,7 +1179,7 @@ proc semIndirectOp(c: PContext, n: PNode, flags: TExprFlags; expectedType: PType proc semDirectOp(c: PContext, n: PNode, flags: TExprFlags; expectedType: PType = nil): PNode = # this seems to be a hotspot in the compiler! - let nOrig = n.copyTree + let nOrig = n#.copyTree #semLazyOpAux(c, n) result = semOverloadedCallAnalyseEffects(c, n, nOrig, flags, expectedType) if result != nil: result = afterCallActions(c, result, nOrig, flags, expectedType) @@ -1947,7 +1947,7 @@ proc semAsgn(c: PContext, n: PNode; mode=asgnNormal): PNode = of nkDotExpr: # r.f = x # --> `f=` (r, x) - let nOrig = n.copyTree + let nOrig = n#.copyTree var flags = {efLValue} let initialDerefDepth = hiddenDerefDepth(a[0]) a = builtinFieldAccess(c, a, flags) @@ -1981,10 +1981,10 @@ proc semAsgn(c: PContext, n: PNode; mode=asgnNormal): PNode = # a{i} = x --> `{}=`(a, i, x) # no builtin behavior/magic overloads for curly subscript, # try `{}=` overloads first then try `{}` overloads for LHS: - let nOrig = n.copyTree + let nOrig = n#.copyTree result = buildOverloadedSubscripts(n[0], getIdent(c.cache, "{}=")) result.add(n[1]) - result = semOverloadedCallAnalyseEffects(c, result, result.copyTree, {efNoUndeclared}) + result = semOverloadedCallAnalyseEffects(c, result, result#[.copyTree]#, {efNoUndeclared}) if result != nil: result = afterCallActions(c, result, nOrig, {}) return From 84414d3455ecb1c6c454894b289f4a29fc8e4271 Mon Sep 17 00:00:00 2001 From: metagn Date: Wed, 11 Jun 2025 00:04:04 +0300 Subject: [PATCH 2/2] test just shallow copy for asgn --- compiler/semexprs.nim | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim index 65b00cbe62c2..1faf20e73267 100644 --- a/compiler/semexprs.nim +++ b/compiler/semexprs.nim @@ -1947,7 +1947,9 @@ proc semAsgn(c: PContext, n: PNode; mode=asgnNormal): PNode = of nkDotExpr: # r.f = x # --> `f=` (r, x) - let nOrig = n#.copyTree + #let nOrig = #n.copyTree + let nOrig = shallowCopy(n) + for i in 0 ..< n.len: nOrig[i] = n[i] var flags = {efLValue} let initialDerefDepth = hiddenDerefDepth(a[0]) a = builtinFieldAccess(c, a, flags)