diff options
-rw-r--r-- | ChangeLog | 10 | ||||
-rw-r--r-- | gc.c | 8 |
2 files changed, 15 insertions, 3 deletions
@@ -1,5 +1,15 @@ 2012-04-05 Kaz Kylheku <kaz@kylheku.com> + * gc.c (mark_obj, sweep_one, gc_is_reachable): Check for gen > 0 rather + than gen == 0. This allows gen == -1 objects to be considered the + same as gen == 0, and traversed. + (gc_set, gc_mutated): When a gen 0 object is added to the checkobj + array, set its generation to -1. This prevents duplicates in + the checkobj array. Also, it fixes a bug: an vector marked as + mutated was not being traversed due to being in generation 1. + +2012-04-05 Kaz Kylheku <kaz@kylheku.com> + Code cleanup and tweaking. * gc.c (BACKPTR_VEC_SIZE): Preprocessor symbol renamed to @@ -260,7 +260,7 @@ tail_call: t = obj->t.type; #if CONFIG_GEN_GC - if (!full_gc && obj->t.gen != 0) + if (!full_gc && obj->t.gen > 0) return; #endif @@ -433,7 +433,7 @@ static int sweep_one(obj_t *block) #endif #if CONFIG_GEN_GC - if (!full_gc && block->t.gen != 0) + if (!full_gc && block->t.gen > 0) abort(); #endif @@ -602,7 +602,7 @@ int gc_is_reachable(val obj) return 1; #if CONFIG_GEN_GC - if (!full_gc && obj->t.gen != 0) + if (!full_gc && obj->t.gen > 0) return 1; #endif @@ -618,6 +618,7 @@ val gc_set(val *ptr, val obj) if (in_malloc_range((mem_t *) ptr) && is_ptr(obj) && obj->t.gen == 0) { if (checkobj_idx >= CHECKOBJ_VEC_SIZE) gc(); + obj->t.gen = -1; checkobj[checkobj_idx++] = obj; } *ptr = obj; @@ -628,6 +629,7 @@ val gc_mutated(val obj) { if (checkobj_idx >= CHECKOBJ_VEC_SIZE) gc(); + obj->t.gen = -1; return checkobj[checkobj_idx++] = obj; } |