diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/system.nim | 2 | ||||
-rw-r--r-- | lib/system/repr.nim | 17 |
2 files changed, 17 insertions, 2 deletions
diff --git a/lib/system.nim b/lib/system.nim index 71d1458fd..df7f5e13b 100644 --- a/lib/system.nim +++ b/lib/system.nim @@ -3383,7 +3383,7 @@ when not defined(JS): #and not defined(nimscript): when not defined(nimscript) and hasAlloc: when not defined(gcDestructors): include "system/assign" - include "system/repr" + include "system/repr" when hostOS != "standalone" and not defined(nimscript): proc getCurrentException*(): ref Exception {.compilerRtl, inl, benign.} = diff --git a/lib/system/repr.nim b/lib/system/repr.nim index ff8f92404..68d316b73 100644 --- a/lib/system/repr.nim +++ b/lib/system/repr.nim @@ -160,6 +160,21 @@ when not defined(useNimRtl): reprAux(result, cast[pointer](cast[ByteAddress](p) + i*bs), typ.base, cl) add result, "]" + when defined(gcDestructors): + type + GenericSeq = object + len: int + p: pointer + PGenericSeq = ptr GenericSeq + const payloadOffset = sizeof(int) + sizeof(pointer) + # see seqs.nim: cap: int + # region: Allocator + + template payloadPtr(x: untyped): untyped = cast[PGenericSeq](x).p + else: + const payloadOffset = GenericSeqSize + template payloadPtr(x: untyped): untyped = x + proc reprSequence(result: var string, p: pointer, typ: PNimType, cl: var ReprClosure) = if p == nil: @@ -170,7 +185,7 @@ when not defined(useNimRtl): var bs = typ.base.size for i in 0..cast[PGenericSeq](p).len-1: if i > 0: add result, ", " - reprAux(result, cast[pointer](cast[ByteAddress](p) + GenericSeqSize + i*bs), + reprAux(result, cast[pointer](cast[ByteAddress](payloadPtr(p)) + payloadOffset + i*bs), typ.base, cl) add result, "]" |