summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rwxr-xr-xlib/system/gc.nim3
-rwxr-xr-xlib/system/sysstr.nim7
2 files changed, 8 insertions, 2 deletions
diff --git a/lib/system/gc.nim b/lib/system/gc.nim
index e09596981..bc3474adf 100755
--- a/lib/system/gc.nim
+++ b/lib/system/gc.nim
@@ -346,6 +346,7 @@ when traceGC:
     cfprintf(cstdout, "Allocations: %ld; freed: %ld\n", a, f)
 
 template gcTrace(cell, state: expr): stmt {.immediate.} =
+  when logGC: writeCell($state, cell)
   when traceGC: traceCell(cell, state)
 
 template WithHeapLock(blk: stmt): stmt =
@@ -994,7 +995,7 @@ proc gcMark(gch: var TGcHeap, p: pointer) {.inline.} =
     var objStart = cast[PCell](interiorAllocatedPtr(gch.region, cell))
     if objStart != nil:
       # mark the cell:
-      if objStart.isBitDown(rcReallyDead):
+      if objStart.color != rcReallyDead:
         if gcDebugging:
           # writeCell("marking ", objStart)
         else:
diff --git a/lib/system/sysstr.nim b/lib/system/sysstr.nim
index bd830d213..55223d6c6 100755
--- a/lib/system/sysstr.nim
+++ b/lib/system/sysstr.nim
@@ -213,7 +213,12 @@ proc setLengthSeq(seq: PGenericSeq, elemSize, newLen: int): PGenericSeq {.
           doDecRef(gch.tempStack.d[i], LocalHeap, MaybeCyclic)
         gch.tempStack.len = len0
                           
-    # and set the memory to nil:
+    # XXX: zeroing out the memory can still result in crashes if a wiped-out
+    # cell is aliased by another pointer (ie proc paramter or a let variable).
+    # This is a tought problem, because even if we don't zeroMem here, in the
+    # presense of user defined destructors, the user will expect the cell to be
+    # "destroyed" thus creating the same problem. We can destoy the cell in the
+    # finalizer of the sequence, but this makes destruction non-deterministic.
     zeroMem(cast[pointer](cast[TAddress](result) +% GenericSeqSize +%
            (newLen*%elemSize)), (result.len-%newLen) *% elemSize)
   result.len = newLen