summary refs log tree commit diff stats
path: root/lib
diff options
context:
space:
mode:
authorAndreas Rumpf <rumpf_a@web.de>2018-11-27 00:26:43 +0100
committerAndreas Rumpf <rumpf_a@web.de>2018-11-27 00:36:29 +0100
commit89907647090390d846dbfc3e31b19dd6deac746e (patch)
tree234e7fbc1f421e6e2127ba3af14d26cbdcf677c5 /lib
parent413580bc0444fc9d8e01b6af01433f8c08d2d298 (diff)
downloadNim-89907647090390d846dbfc3e31b19dd6deac746e.tar.gz
some progress on --gc:destructors
Diffstat (limited to 'lib')
-rw-r--r--lib/core/seqs.nim35
1 files changed, 18 insertions, 17 deletions
diff --git a/lib/core/seqs.nim b/lib/core/seqs.nim
index 1981998df..c62a05904 100644
--- a/lib/core/seqs.nim
+++ b/lib/core/seqs.nim
@@ -82,7 +82,7 @@ type
     cap: int
     region: Allocator
 
-proc newSeqPayload(cap, elemSize: int): pointer {.compilerRtl, noSideEffect.} =
+proc newSeqPayload(cap, elemSize: int): pointer {.compilerRtl.} =
   # we have to use type erasure here as Nim does not support generic
   # compilerProcs. Oh well, this will all be inlined anyway.
   if cap <= 0:
@@ -96,22 +96,23 @@ proc newSeqPayload(cap, elemSize: int): pointer {.compilerRtl, noSideEffect.} =
 
 proc prepareSeqAdd(len: int; p: pointer; addlen, elemSize: int): pointer {.
     compilerRtl, noSideEffect.} =
-  if len+addlen <= len:
-    result = p
-  elif p == nil:
-    result = newSeqPayload(len+addlen, elemSize)
-  else:
-    # Note: this means we cannot support things that have internal pointers as
-    # they get reallocated here. This needs to be documented clearly.
-    var p = cast[ptr PayloadBase](p)
-    let region = if p.region == nil: getLocalAllocator() else: p.region
-    let cap = max(resize(p.cap), len+addlen)
-    var q = cast[ptr PayloadBase](region.realloc(region, p,
-      sizeof(int) + sizeof(Allocator) + elemSize * p.cap,
-      sizeof(int) + sizeof(Allocator) + elemSize * cap))
-    q.region = region
-    q.cap = cap
-    result = q
+  {.noSideEffect.}:
+    if len+addlen <= len:
+      result = p
+    elif p == nil:
+      result = newSeqPayload(len+addlen, elemSize)
+    else:
+      # Note: this means we cannot support things that have internal pointers as
+      # they get reallocated here. This needs to be documented clearly.
+      var p = cast[ptr PayloadBase](p)
+      let region = if p.region == nil: getLocalAllocator() else: p.region
+      let cap = max(resize(p.cap), len+addlen)
+      var q = cast[ptr PayloadBase](region.realloc(region, p,
+        sizeof(int) + sizeof(Allocator) + elemSize * p.cap,
+        sizeof(int) + sizeof(Allocator) + elemSize * cap))
+      q.region = region
+      q.cap = cap
+      result = q
 
 proc shrink*[T](x: var seq[T]; newLen: Natural) =
   sysAssert newLen <= x.len, "invalid newLen parameter for 'shrink'"