summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libguile/gc.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/libguile/gc.c b/libguile/gc.c
index 2223c004a..809e43d56 100644
--- a/libguile/gc.c
+++ b/libguile/gc.c
@@ -690,9 +690,11 @@ finalizer_trampoline (GC_PTR ptr, GC_PTR data)
scm_is_pair (finalizers);
finalizers = SCM_CDR (finalizers))
{
+ SCM (* finalize) (SCM, SCM);
SCM f = SCM_CAR (finalizers);
- scm_call_2 (SCM_CAR (f), obj, SCM_CDR (f));
+ finalize = (SCM (*) (SCM, SCM)) SCM2PTR (SCM_CAR (f));
+ finalize (obj, SCM_CDR (f));
}
}
@@ -717,8 +719,10 @@ scm_gc_register_finalizer (SCM obj, SCM (*finalizer) (SCM, SCM),
GC_finalization_proc old_finalizer;
GC_PTR old_finalization_data;
- finalization_subr = scm_c_make_gsubr ("%%finalizer", 2, 0, 0,
- finalizer);
+ /* XXX: We don't use real `subrs' here because (i) it would add unnecessary
+ overhead and (ii) it creates a bootstrap problem (because SMOBs may rely
+ on this, and SMOBs are initialized before `gsubrs'). */
+ finalization_subr = PTR2SCM (finalizer);
finalization_data = scm_cons (scm_cons (finalization_subr, data),
SCM_EOL);
if (ordered)