From e24305f1e15f63256528e0a9649464919eae83c6 Mon Sep 17 00:00:00 2001 From: Araq Date: Fri, 29 Mar 2013 16:36:24 +0100 Subject: [PATCH] bugfix: mark&sweep GC --- lib/system/alloc.nim | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/lib/system/alloc.nim b/lib/system/alloc.nim index 7b52780fed..744c26d36c 100644 --- a/lib/system/alloc.nim +++ b/lib/system/alloc.nim @@ -312,20 +312,22 @@ proc chunkUnused(c: PChunk): bool {.inline.} = iterator allObjects(m: TMemRegion): pointer {.inline.} = for s in elements(m.chunkStarts): - let c = cast[PChunk](s shl PageShift) - if not chunkUnused(c): - if isSmallChunk(c): - var c = cast[PSmallChunk](c) - - let size = c.size - var a = cast[TAddress](addr(c.data)) - let limit = a + c.acc - while a <% limit: - yield cast[pointer](a) - a = a +% size - else: - let c = cast[PBigChunk](c) - yield addr(c.data) + # we need to check here again as it could have been modified: + if s in m.chunkStarts: + let c = cast[PChunk](s shl PageShift) + if not chunkUnused(c): + if isSmallChunk(c): + var c = cast[PSmallChunk](c) + + let size = c.size + var a = cast[TAddress](addr(c.data)) + let limit = a + c.acc + while a <% limit: + yield cast[pointer](a) + a = a +% size + else: + let c = cast[PBigChunk](c) + yield addr(c.data) proc isCell(p: pointer): bool {.inline.} = result = cast[ptr TFreeCell](p).zeroField >% 1