@@ -65,14 +65,24 @@ proc addLocalVar(g: ModuleGraph; varSection, varInit: PNode; owner: PSym; typ: P
6565 vpart[2 ] = if varInit.isNil: v else : vpart[1 ]
6666 varSection.add vpart
6767 if varInit != nil :
68- if useShallowCopy and typeNeedsNoDeepCopy (typ) or optTinyRtti in g.config.globalOptions:
69- varInit.add newFastAsgnStmt (newSymNode (result ), v)
70- else :
71- let deepCopyCall = newNodeI (nkCall, varInit.info, 3 )
72- deepCopyCall[0 ] = newSymNode (getSysMagic (g, varSection.info, " deepCopy" , mDeepCopy))
73- deepCopyCall[1 ] = newSymNode (result )
74- deepCopyCall[2 ] = v
75- varInit.add deepCopyCall
68+ if g.config.selectedGC in {gcArc, gcOrc}:
69+ if typ.attachedOps[attachedAsgn] != nil :
70+ var call = newNode (nkCall)
71+ call.add newSymNode (typ.attachedOps[attachedAsgn])
72+ call.add genAddrOf (newSymNode (result ), tyVar)
73+ call.add v
74+ varInit.add call
75+ else :
76+ varInit.add newFastAsgnStmt (newSymNode (result ), v)
77+ else :
78+ if useShallowCopy and typeNeedsNoDeepCopy (typ) or optTinyRtti in g.config.globalOptions:
79+ varInit.add newFastAsgnStmt (newSymNode (result ), v)
80+ else :
81+ let deepCopyCall = newNodeI (nkCall, varInit.info, 3 )
82+ deepCopyCall[0 ] = newSymNode (getSysMagic (g, varSection.info, " deepCopy" , mDeepCopy))
83+ deepCopyCall[1 ] = newSymNode (result )
84+ deepCopyCall[2 ] = v
85+ varInit.add deepCopyCall
7686
7787discard """
7888We generate roughly this:
0 commit comments