diff --git a/src/memory.c b/src/memory.c index d2fd514..693369d 100644 --- a/src/memory.c +++ b/src/memory.c @@ -83,6 +83,7 @@ struct ucl_object *ucl_special_create(struct ucl* ucl, ucl_lisp special) static struct ucl_object* ucl_object_alloc(struct ucl* ucl) { struct ucl_object *obj = ucl_arena_get(ucl->obj_arena); assert(obj != NULL); + obj->flags = 0; return obj; } @@ -123,11 +124,11 @@ void ucl_object_delete(struct ucl* state, struct ucl_object *obj) { } static void ucl_object_mark(struct ucl_object *obj) { - if (obj == NULL || obj->reachable) { + if (obj == NULL || obj->flags & UCL_OBJ_FLAG_REACHABLE) { return; } - obj->reachable = 1; + obj->flags |= 1; if (obj->type == UCL_TYPE_CELL) { ucl_object_mark(obj->cell.car); ucl_object_mark(obj->cell.cdr); @@ -144,13 +145,13 @@ static void ucl_scope_mark(struct ucl_arena * arena, void *obj) { static void ucl_gc_unmark(struct ucl_arena * arena, void *obj) { (void) arena; struct ucl_object *object = (struct ucl_object *) obj; - object->reachable = 0; + object->flags &= ~UCL_OBJ_FLAG_REACHABLE; } static void ucl_gc_sweep(struct ucl_arena * arena, void *obj) { (void) arena; struct ucl_object *object = (struct ucl_object *) obj; - if (object->reachable == 0) { + if (!(object->flags &UCL_OBJ_FLAG_REACHABLE)) { ucl_object_delete_internal(arena, object); } } diff --git a/src/types.h b/src/types.h index 8fc41ce..25317f7 100644 --- a/src/types.h +++ b/src/types.h @@ -40,7 +40,7 @@ struct ucl_object { ucl_lisp special; }; enum ucl_type type; - char reachable; + char flags; }; struct ucl_scope {