summaryrefslogtreecommitdiffstats
path: root/gc.c
diff options
context:
space:
mode:
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c30
1 files changed, 17 insertions, 13 deletions
diff --git a/gc.c b/gc.c
index 32411a62..b61fd90b 100644
--- a/gc.c
+++ b/gc.c
@@ -147,33 +147,34 @@ static void finalize(obj_t *obj)
{
switch (obj->t.type) {
case CONS:
- break;
+ return;
case STR:
if (!opt_gc_debug) {
free(obj->st.str);
obj->st.str = 0;
}
- break;
+ return;
case CHR:
case NUM:
case SYM:
case FUN:
- break;
+ return;
case VEC:
if (!opt_gc_debug) {
free(obj->v.vec-2);
obj->v.vec = 0;
}
- break;
+ return;
case LCONS:
- break;
+ case LSTR:
+ return;
case COBJ:
if (obj->co.ops->destroy)
obj->co.ops->destroy(obj);
- break;
- default:
- assert (0 && "corrupt type field");
+ return;
}
+
+ assert (0 && "corrupt type field");
}
static void mark_obj(obj_t *obj)
@@ -208,7 +209,7 @@ tail_call:
mark_obj_tail(obj->st.len);
case CHR:
case NUM:
- break;
+ return;
case SYM:
mark_obj(obj->s.name);
mark_obj_tail(obj->s.val);
@@ -216,7 +217,7 @@ tail_call:
mark_obj(obj->f.env);
if (obj->f.functype == FINTERP)
mark_obj_tail(obj->f.f.interp_fun);
- break;
+ return;
case VEC:
{
obj_t *alloc_size = obj->v.vec[-2];
@@ -229,18 +230,21 @@ tail_call:
for (i = 0; i < fp; i++)
mark_obj(obj->v.vec[i]);
}
- break;
+ return;
case LCONS:
mark_obj(obj->lc.func);
mark_obj(obj->lc.car);
mark_obj_tail(obj->lc.cdr);
+ case LSTR:
+ mark_obj(obj->ls.prefix);
+ mark_obj_tail(obj->ls.list);
case COBJ:
if (obj->co.ops->mark)
obj->co.ops->mark(obj);
mark_obj_tail(obj->co.cls);
- default:
- assert (0 && "corrupt type field");
}
+
+ assert (0 && "corrupt type field");
}
static int in_heap(obj_t *ptr)