diff options
Diffstat (limited to 'libguile/smob.h')
-rw-r--r-- | libguile/smob.h | 73 |
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); |