summaryrefslogtreecommitdiff
path: root/libguile/smob.h
diff options
context:
space:
mode:
Diffstat (limited to 'libguile/smob.h')
-rw-r--r--libguile/smob.h73
1 files changed, 45 insertions, 28 deletions
diff --git a/libguile/smob.h b/libguile/smob.h
index 780265f1e..05617933b 100644
--- a/libguile/smob.h
+++ b/libguile/smob.h
@@ -25,6 +25,9 @@
#include "libguile/__scm.h"
#include "libguile/print.h"
+#include <gc/gc.h>
+
+
/* This is the internal representation of a smob type */
@@ -51,18 +54,25 @@ SCM_API SCM scm_i_new_smob_with_mark_proc (scm_t_bits tc,
-#define SCM_NEWSMOB(z, tc, data) \
-do \
- { \
- register scm_t_bits _smobnum = SCM_TC2SMOBNUM (tc); \
- z = (scm_smobs[_smobnum].mark \
- ? scm_i_new_smob_with_mark_proc ((tc), (scm_t_bits)(data), \
- 0, 0) \
- : scm_cell (tc, (scm_t_bits)(data))); \
- if (scm_smobs[_smobnum].free) \
- scm_gc_register_finalizer ((z), scm_i_finalize_smob, \
- SCM_BOOL_F, 0); \
- } \
+#define SCM_NEWSMOB(z, tc, data) \
+do \
+ { \
+ register scm_t_bits _smobnum = SCM_TC2SMOBNUM (tc); \
+ z = (scm_smobs[_smobnum].mark \
+ ? scm_i_new_smob_with_mark_proc ((tc), (scm_t_bits)(data), \
+ 0, 0) \
+ : scm_cell (tc, (scm_t_bits)(data))); \
+ if (scm_smobs[_smobnum].free) \
+ { \
+ GC_finalization_proc _prev_finalizer; \
+ GC_PTR _prev_finalizer_data; \
+ \
+ GC_REGISTER_FINALIZER_NO_ORDER (SCM2PTR (z), scm_i_finalize_smob, \
+ NULL, \
+ &_prev_finalizer, \
+ &_prev_finalizer_data); \
+ } \
+ } \
while (0)
#define SCM_RETURN_NEWSMOB(tc, data) \
@@ -80,21 +90,28 @@ while (0)
return __SCM_smob_answer; \
} while (0)
-#define SCM_NEWSMOB3(z, tc, data1, data2, data3) \
-do \
- { \
- register scm_t_bits _smobnum = SCM_TC2SMOBNUM (tc); \
- z = (scm_smobs[_smobnum].mark \
- ? scm_i_new_smob_with_mark_proc (tc, (scm_t_bits)(data1), \
- (scm_t_bits)(data2), \
- (scm_t_bits)(data3)) \
- : scm_double_cell ((tc), (scm_t_bits)(data1), \
- (scm_t_bits)(data2), \
- (scm_t_bits)(data3))); \
- if (scm_smobs[_smobnum].free) \
- scm_gc_register_finalizer ((z), scm_i_finalize_smob, \
- SCM_BOOL_F, 0); \
- } \
+#define SCM_NEWSMOB3(z, tc, data1, data2, data3) \
+do \
+ { \
+ register scm_t_bits _smobnum = SCM_TC2SMOBNUM (tc); \
+ z = (scm_smobs[_smobnum].mark \
+ ? scm_i_new_smob_with_mark_proc (tc, (scm_t_bits)(data1), \
+ (scm_t_bits)(data2), \
+ (scm_t_bits)(data3)) \
+ : scm_double_cell ((tc), (scm_t_bits)(data1), \
+ (scm_t_bits)(data2), \
+ (scm_t_bits)(data3))); \
+ if (scm_smobs[_smobnum].free) \
+ { \
+ GC_finalization_proc _prev_finalizer; \
+ GC_PTR _prev_finalizer_data; \
+ \
+ GC_REGISTER_FINALIZER_NO_ORDER (SCM2PTR (z), scm_i_finalize_smob, \
+ NULL, \
+ &_prev_finalizer, \
+ &_prev_finalizer_data); \
+ } \
+ } \
while (0)
#define SCM_RETURN_NEWSMOB3(tc, data1, data2, data3) \
@@ -139,7 +156,7 @@ SCM_API long scm_numsmob;
SCM_API scm_smob_descriptor scm_smobs[];
SCM_API void scm_i_set_smob_flags (SCM x, scm_t_bits data);
-SCM_API SCM scm_i_finalize_smob (SCM smob, SCM data);
+SCM_API void scm_i_finalize_smob (GC_PTR obj, GC_PTR data);