summaryrefslogtreecommitdiffstats
path: root/gc.c
diff options
context:
space:
mode:
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/gc.c b/gc.c
index 9128e9d9..4ead33b7 100644
--- a/gc.c
+++ b/gc.c
@@ -808,18 +808,28 @@ static val gc_wrap(void)
return nil;
}
-val gc_finalize(val obj, val fun)
+val gc_finalize(val obj, val fun, val rev_order_p)
{
type_check(fun, FUN);
+ rev_order_p = default_bool_arg(rev_order_p);
+
if (is_ptr(obj)) {
struct fin_reg *f = coerce(struct fin_reg *, chk_malloc(sizeof *f));
f->obj = obj;
f->fun = fun;
f->reachable = 0;
- f->next = 0;
- *final_tail = f;
- final_tail = &f->next;
+
+ if (rev_order_p) {
+ if (!final_list)
+ final_tail = &f->next;
+ f->next = final_list;
+ final_list = f;
+ } else {
+ f->next = 0;
+ *final_tail = f;
+ final_tail = &f->next;
+ }
}
return obj;
}
@@ -828,7 +838,7 @@ void gc_late_init(void)
{
reg_fun(intern(lit("gc"), system_package), func_n0(gc_wrap));
reg_fun(intern(lit("gc-set-delta"), system_package), func_n1(gc_set_delta));
- reg_fun(intern(lit("finalize"), user_package), func_n2(gc_finalize));
+ reg_fun(intern(lit("finalize"), user_package), func_n3o(gc_finalize, 2));
}
/*