Skip to content

Commit 142571f

Browse files
committed
sem: pass only a single AST to semOverloadedCall
Instead of handling the necessary copying at the callsite, do it in the `semOverloadedCall`. In addition, use a shallow copy of `n` for the accumulator, so that the intermediate results don't leak into the input AST.
1 parent 8358842 commit 142571f

File tree

6 files changed

+13
-11
lines changed

6 files changed

+13
-11
lines changed

compiler/sem/pragmas.nim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1031,7 +1031,7 @@ proc semCustomPragma(c: PContext, n: PNode, invalid: InvalidPragmaHandler): PNod
10311031
result = invalid(c, n)
10321032
return
10331033

1034-
let r = c.semOverloadedCall(c, callNode, callNode, {skTemplate}, {efNoUndeclared})
1034+
let r = c.semOverloadedCall(c, callNode, {skTemplate}, {efNoUndeclared})
10351035
if r.isError:
10361036
return r
10371037
elif r.isNil or sfCustomPragma notin r[0].sym.flags:

compiler/sem/semcall.nim

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -278,12 +278,14 @@ proc semGenericArgs(c: PContext, n: PNode): PNode =
278278
if hasError:
279279
result = c.config.wrapError(result)
280280

281-
proc resolveOverloads(c: PContext, n, nOrig: PNode,
281+
proc resolveOverloads(c: PContext, nOrig: PNode,
282282
filter: TSymKinds, flags: TExprFlags,
283283
errors: var seq[SemCallMismatch]): TCandidate =
284-
addInNimDebugUtils(c.config, "resolveOverloads", n, filter, errors, result)
284+
addInNimDebugUtils(c.config, "resolveOverloads", nOrig, filter, errors, result)
285285
var
286286
alt: TCandidate
287+
# `n` itself will be modified, so create a shallow copy first
288+
n = copyNodeWithKids(nOrig)
287289
f = n[0]
288290

289291
case f.kind
@@ -584,12 +586,12 @@ proc semResolvedCall(c: PContext, x: TCandidate,
584586
result.typ = finalCallee.typ[0]
585587
result = updateDefaultParams(c.config, result)
586588

587-
proc semOverloadedCall(c: PContext, n, nOrig: PNode,
589+
proc semOverloadedCall(c: PContext, n: PNode,
588590
filter: TSymKinds, flags: TExprFlags): PNode =
589591
addInNimDebugUtils(c.config, "semOverloadedCall", n, result)
590592
var errors: seq[SemCallMismatch]
591593

592-
var r = resolveOverloads(c, n, nOrig, filter, flags, errors)
594+
var r = resolveOverloads(c, n, filter, flags, errors)
593595
emitDiagnostics(c, r) # always emit all captured diags for the match
594596
if r.state == csMatch:
595597
# this may be triggered, when the explain pragma is used
@@ -764,7 +766,7 @@ proc searchForBorrowProc(c: PContext, startScope: PScope, fn: PSym): PSym =
764766
call.add(newNodeIT(nkEmpty, fn.info, x))
765767
if hasDistinct:
766768
let filter = if fn.kind in {skProc, skFunc}: {skProc, skFunc} else: {fn.kind}
767-
var resolved = semOverloadedCall(c, call, call, filter, {})
769+
var resolved = semOverloadedCall(c, call, filter, {})
768770
if resolved != nil:
769771
result = resolved[0].sym
770772
if not compareTypes(result.typ[0], fn.typ[0], dcEqIgnoreDistinct):

compiler/sem/semdata.nim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,7 @@ type
619619
semConstBoolExpr*: proc (c: PContext, n: PNode): PNode {.nimcall.} # XXX bite the bullet
620620
## read to break cyclic dependencies, init in sem during module open and
621621
## read in pragmas
622-
semOverloadedCall*: proc (c: PContext, n, nOrig: PNode,
622+
semOverloadedCall*: proc (c: PContext, n: PNode,
623623
filter: TSymKinds, flags: TExprFlags): PNode {.nimcall.}
624624
## read to break cyclic dependencies, init in sem during module open and
625625
## read in pragmas and semtypinst

compiler/sem/semexprs.nim

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,10 +1140,10 @@ proc semOverloadedCallAnalyseEffects(c: PContext, n: PNode,
11401140
# to 'skIterator' anymore; skIterator is preferred in sigmatch already
11411141
# for typeof support.
11421142
# for ``typeof(countup(1,3))``, see ``tests/ttoseq``.
1143-
result = semOverloadedCall(c, n, copyNodeWithKids(n),
1143+
result = semOverloadedCall(c, n,
11441144
{skProc, skFunc, skMethod, skConverter, skMacro, skTemplate, skIterator}, flags)
11451145
else:
1146-
result = semOverloadedCall(c, n, copyNodeWithKids(n),
1146+
result = semOverloadedCall(c, n,
11471147
{skProc, skFunc, skMethod, skConverter, skMacro, skTemplate}, flags)
11481148

11491149
if result != nil and result.kind != nkError:

compiler/sem/semstmts.nim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ proc tryMacroPragma(c: PContext, pragmas: ptr PNode, i: int,
548548
x.add(operand) # the definition AST the pragma appears on
549549

550550
# recursion assures that this works for multiple macro annotations too:
551-
let r = semOverloadedCall(c, x, copyNodeWithKids(x), {skMacro, skTemplate}, {efNoUndeclared})
551+
let r = semOverloadedCall(c, x, {skMacro, skTemplate}, {efNoUndeclared})
552552
if r.isNil:
553553
# restore the old list of pragmas since we couldn't process this one
554554
pragmas[] = n

compiler/sem/semtypinst.nim

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -287,7 +287,7 @@ proc reResolveCallsWithTypedescParams(c: PContext, n: PNode): PNode =
287287
if isTypeParam(n[i]): needsFixing = true
288288
if needsFixing:
289289
n[0] = newSymNode(n[0].sym.owner)
290-
return c.semOverloadedCall(c, n, n, {skProc, skFunc}, {})
290+
return c.semOverloadedCall(c, n, {skProc, skFunc}, {})
291291

292292
for i in 0..<n.safeLen:
293293
n[i] = reResolveCallsWithTypedescParams(c, n[i])

0 commit comments

Comments
 (0)