diff options
author | Araq <rumpf_a@web.de> | 2020-09-20 09:01:42 +0200 |
---|---|---|
committer | Andreas Rumpf <rumpf_a@web.de> | 2020-09-20 10:43:57 +0200 |
commit | 33be7c6f5ef1a9e54d037682984f563c8ee11fcb (patch) | |
tree | f147553dd982de0313be33bba8ce2d24429ccfa4 /lib/system | |
parent | ebb632ccba0d786b90684e4da2b393cfae04a24c (diff) | |
download | Nim-33be7c6f5ef1a9e54d037682984f563c8ee11fcb.tar.gz |
arc: =deepcopy fixes
Diffstat (limited to 'lib/system')
-rw-r--r-- | lib/system/deepcopy.nim | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/lib/system/deepcopy.nim b/lib/system/deepcopy.nim index 5905b5785..b9dc594fa 100644 --- a/lib/system/deepcopy.nim +++ b/lib/system/deepcopy.nim @@ -140,7 +140,10 @@ proc genericDeepCopyAux(dest, src: pointer, mt: PNimType; tab: var PtrTable) = unsureAsgnRef(cast[PPointer](dest), s2) elif mt.base.deepcopy != nil: let z = mt.base.deepcopy(s2) - unsureAsgnRef(cast[PPointer](dest), z) + when defined(nimSeqsV2): + cast[PPointer](dest)[] = z + else: + unsureAsgnRef(cast[PPointer](dest), z) else: let z = tab.get(s2) if z == nil: @@ -157,10 +160,16 @@ proc genericDeepCopyAux(dest, src: pointer, mt: PNimType; tab: var PtrTable) = let x = usrToCell(s2) let realType = x.typ sysAssert realType == mt, " types do differ" - # this version should work for any possible GC: - let typ = if mt.base.kind == tyObject: cast[ptr PNimType](s2)[] else: mt.base - let z = when defined(nimSeqsV2): nimNewObj(typ.size) else: newObj(mt, typ.size) - unsureAsgnRef(cast[PPointer](dest), z) + when defined(nimSeqsV2): + let typ = if mt.base.kind == tyObject: cast[PNimType](cast[ptr PNimTypeV2](s2)[].typeInfoV1) + else: mt.base + let z = nimNewObj(typ.size) + cast[PPointer](dest)[] = z + else: + # this version should work for any other GC: + let typ = if mt.base.kind == tyObject: cast[ptr PNimType](s2)[] else: mt.base + let z = newObj(mt, typ.size) + unsureAsgnRef(cast[PPointer](dest), z) tab.put(s2, z) genericDeepCopyAux(z, s2, typ, tab) else: |