Skip to content

Commit

Permalink
fixes #13708 (#13711)
Browse files Browse the repository at this point in the history
* fixes #13708
* differentiate between arc and rest of GC

Co-authored-by: cooldome <ariabushenko@bk.ru>
  • Loading branch information
cooldome and cooldome authored Mar 21, 2020
1 parent b6e04ea commit 586ebb0
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 10 deletions.
4 changes: 2 additions & 2 deletions compiler/lowerings.nim
Original file line number Diff line number Diff line change
Expand Up @@ -312,10 +312,10 @@ proc indirectAccess*(a: PNode, b: PSym, info: TLineInfo): PNode =
proc indirectAccess*(a, b: PSym, info: TLineInfo): PNode =
result = indirectAccess(newSymNode(a), b, info)

proc genAddrOf*(n: PNode): PNode =
proc genAddrOf*(n: PNode, typeKind = tyPtr): PNode =
result = newNodeI(nkAddr, n.info, 1)
result[0] = n
result.typ = newType(tyPtr, n.typ.owner)
result.typ = newType(typeKind, n.typ.owner)
result.typ.rawAddSon(n.typ)

proc genDeref*(n: PNode; k = nkHiddenDeref): PNode =
Expand Down
26 changes: 18 additions & 8 deletions compiler/spawn.nim
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,24 @@ proc addLocalVar(g: ModuleGraph; varSection, varInit: PNode; owner: PSym; typ: P
vpart[2] = if varInit.isNil: v else: vpart[1]
varSection.add vpart
if varInit != nil:
if useShallowCopy and typeNeedsNoDeepCopy(typ) or optTinyRtti in g.config.globalOptions:
varInit.add newFastAsgnStmt(newSymNode(result), v)
else:
let deepCopyCall = newNodeI(nkCall, varInit.info, 3)
deepCopyCall[0] = newSymNode(getSysMagic(g, varSection.info, "deepCopy", mDeepCopy))
deepCopyCall[1] = newSymNode(result)
deepCopyCall[2] = v
varInit.add deepCopyCall
if g.config.selectedGC in {gcArc, gcOrc}:
if typ.attachedOps[attachedAsgn] != nil:
var call = newNode(nkCall)
call.add newSymNode(typ.attachedOps[attachedAsgn])
call.add genAddrOf(newSymNode(result), tyVar)
call.add v
varInit.add call
else:
varInit.add newFastAsgnStmt(newSymNode(result), v)
else:
if useShallowCopy and typeNeedsNoDeepCopy(typ) or optTinyRtti in g.config.globalOptions:
varInit.add newFastAsgnStmt(newSymNode(result), v)
else:
let deepCopyCall = newNodeI(nkCall, varInit.info, 3)
deepCopyCall[0] = newSymNode(getSysMagic(g, varSection.info, "deepCopy", mDeepCopy))
deepCopyCall[1] = newSymNode(result)
deepCopyCall[2] = v
varInit.add deepCopyCall

discard """
We generate roughly this:
Expand Down

0 comments on commit 586ebb0

Please sign in to comment.