summary refs log tree commit diff stats
path: root/lib/system/repr.nim
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2019-02-21 07:57:29 +0100
committerAndreas Rumpf <rumpf_a@web.de>2019-02-21 07:57:29 +0100
commit43d570c17810fa9d8ab7605f3ce4dfd2120fdd63 (patch)
treeab7bd623e896251e71311e3cf12e4d9e21777c1a /lib/system/repr.nim
parent6c10d331db8c00accc7ac2884ac46c89ef72cc3b (diff)
downloadNim-43d570c17810fa9d8ab7605f3ce4dfd2120fdd63.tar.gz
gc:destructors: make system/repr compile
Diffstat (limited to 'lib/system/repr.nim')
-rw-r--r--lib/system/repr.nim17
1 files changed, 16 insertions, 1 deletions
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, "]"