Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

make sink operator optional #13068

Merged
merged 8 commits into from
Jan 17, 2020
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
fix one regression
  • Loading branch information
cooldome committed Jan 14, 2020
commit 812d31cb313a40cddbc8490a87f97fb8eff48e3e
20 changes: 13 additions & 7 deletions compiler/injectdestructors.nim
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,6 @@ proc genSink(c: var Con; dest, ri: PNode): PNode =
proc genCopyNoCheck(c: Con; dest, ri: PNode): PNode =
let t = dest.typ.skipTypes({tyGenericInst, tyAlias, tySink})
result = genOp(c, t, attachedAsgn, dest, ri)
result.add ri

proc genCopy(c: var Con; dest, ri: PNode): PNode =
let t = dest.typ
Expand Down Expand Up @@ -342,7 +341,9 @@ proc passCopyToSink(n: PNode; c: var Con): PNode =
# out of loops we need to mark it as 'wasMoved'.
result.add genWasMoved(tmp, c)
if hasDestructor(n.typ):
result.add genCopy(c, tmp, p(n, c, normal))
var m = genCopy(c, tmp, n)
m.add p(n, c, normal)
result.add m
if isLValue(n) and not isClosureEnv(n):
message(c.graph.config, n.info, hintPerformance,
("passing '$1' to a sink parameter introduces an implicit copy; " &
Expand Down Expand Up @@ -622,7 +623,8 @@ proc p(n: PNode; c: var Con; mode: ProcessMode): PNode =
result.add call
else:
let tmp = getTemp(c, n[0].typ, n.info)
let m = genCopyNoCheck(c, tmp, p(n[0], c, normal))
var m = genCopyNoCheck(c, tmp, n[0])
m.add p(n[0], c, normal)
result = newTree(nkStmtList, genWasMoved(tmp, c), m)
var toDisarm = n[0]
if toDisarm.kind == nkStmtListExpr: toDisarm = toDisarm.lastSon
Expand Down Expand Up @@ -667,11 +669,13 @@ proc moveOrCopy(dest, ri: PNode; c: var Con): PNode =
var snk = genSink(c, dest, ri)
result = newTree(nkStmtList, snk, genWasMoved(ri, c))
else:
result = genCopy(c, dest, p(ri, c, consumed))
result = genCopy(c, dest, ri)
result.add p(ri, c, consumed)
of nkBracket:
# array constructor
if ri.len > 0 and isDangerousSeq(ri.typ):
result = genCopy(c, dest, p(ri, c, consumed))
result = genCopy(c, dest, ri)
result.add p(ri, c, consumed)
else:
result = genSink(c, dest, p(ri, c, consumed))
of nkObjConstr, nkTupleConstr, nkClosure, nkCharLit..nkNilLit:
Expand All @@ -688,7 +692,8 @@ proc moveOrCopy(dest, ri: PNode; c: var Con): PNode =
let snk = genSink(c, dest, ri)
result = newTree(nkStmtList, snk, genWasMoved(ri, c))
else:
result = genCopy(c, dest, p(ri, c, consumed))
result = genCopy(c, dest, ri)
result.add p(ri, c, consumed)
of nkHiddenSubConv, nkHiddenStdConv, nkConv:
when false:
result = moveOrCopy(dest, ri[1], c)
Expand All @@ -715,7 +720,8 @@ proc moveOrCopy(dest, ri: PNode; c: var Con): PNode =
let snk = genSink(c, dest, ri)
result = newTree(nkStmtList, snk, genWasMoved(ri, c))
else:
result = genCopy(c, dest, p(ri, c, consumed))
result = genCopy(c, dest, ri)
result.add p(ri, c, consumed)

proc computeUninit(c: var Con) =
if not c.uninitComputed:
Expand Down