diff --git a/libguile/bytevectors.c b/libguile/bytevectors.c index 96b9ab66f..9999b23e4 100644 --- a/libguile/bytevectors.c +++ b/libguile/bytevectors.c @@ -333,7 +333,7 @@ scm_c_shrink_bytevector (SCM bv, size_t c_new_len) SCM_BYTEVECTOR_SET_LENGTH (bv, c_new_len); if (SCM_BYTEVECTOR_CONTIGUOUS_P (bv)) - new_bv = PTR2SCM (scm_gc_realloc (SCM2PTR (bv), + new_bv = SCM_PACK_POINTER (scm_gc_realloc (SCM_HEAP_OBJECT_BASE (bv), c_len + SCM_BYTEVECTOR_HEADER_BYTES, c_new_len + SCM_BYTEVECTOR_HEADER_BYTES, SCM_GC_BYTEVECTOR)); diff --git a/libguile/fluids.c b/libguile/fluids.c index 7f0e70424..661f06ca7 100644 --- a/libguile/fluids.c +++ b/libguile/fluids.c @@ -160,7 +160,7 @@ new_fluid () SCM_SET_CELL_WORD_1 (fluid, (scm_t_bits) n); GC_GENERAL_REGISTER_DISAPPEARING_LINK (&allocated_fluids[n], - SCM2PTR (fluid)); + SCM_HEAP_OBJECT_BASE (fluid)); scm_dynwind_end (); diff --git a/libguile/foreign.c b/libguile/foreign.c index 783411897..e431c5010 100644 --- a/libguile/foreign.c +++ b/libguile/foreign.c @@ -152,7 +152,7 @@ scm_from_pointer (void *ptr, scm_t_pointer_finalizer finalizer) /* Register a finalizer for the newly created instance. */ GC_finalization_proc prev_finalizer; GC_PTR prev_finalizer_data; - GC_REGISTER_FINALIZER_NO_ORDER (SCM2PTR (ret), + GC_REGISTER_FINALIZER_NO_ORDER (SCM_HEAP_OBJECT_BASE (ret), pointer_finalizer_trampoline, finalizer, &prev_finalizer, @@ -317,7 +317,7 @@ SCM_DEFINE (scm_set_pointer_finalizer_x, "set-pointer-finalizer!", 2, 0, 0, SCM_SET_CELL_WORD_0 (pointer, SCM_CELL_WORD_0 (pointer) | (1 << 16UL)); - GC_REGISTER_FINALIZER_NO_ORDER (SCM2PTR (pointer), + GC_REGISTER_FINALIZER_NO_ORDER (SCM_HEAP_OBJECT_BASE (pointer), pointer_finalizer_trampoline, c_finalizer, &prev_finalizer, diff --git a/libguile/gc.h b/libguile/gc.h index b4b725c23..a7f3b7343 100644 --- a/libguile/gc.h +++ b/libguile/gc.h @@ -45,12 +45,13 @@ typedef struct scm_t_cell * in debug mode. In particular these macros will even work for free cells, * which should never be encountered by user code. */ -#define SCM_GC_CELL_OBJECT(x, n) (((SCM *)SCM2PTR (x)) [n]) -#define SCM_GC_CELL_WORD(x, n) (SCM_UNPACK (SCM_GC_CELL_OBJECT ((x), (n)))) +#define SCM_GC_CELL_OBJECT(x, n) (SCM_PACK (SCM_HEAP_OBJECT_BASE (x)[n])) +#define SCM_GC_CELL_WORD(x, n) (SCM_HEAP_OBJECT_BASE (x)[n]) -#define SCM_GC_SET_CELL_OBJECT(x, n, v) ((((SCM *)SCM2PTR (x)) [n]) = (v)) +#define SCM_GC_SET_CELL_OBJECT(x, n, v) \ + (SCM_HEAP_OBJECT_BASE (x)[n] = SCM_UNPACK (v)) #define SCM_GC_SET_CELL_WORD(x, n, v) \ - (SCM_GC_SET_CELL_OBJECT ((x), (n), SCM_PACK (v))) + (SCM_HEAP_OBJECT_BASE (x)[n] = (v)) #define SCM_GC_CELL_TYPE(x) (SCM_GC_CELL_OBJECT ((x), 0)) @@ -96,7 +97,8 @@ typedef struct scm_t_cell #define SCM_SET_CELL_OBJECT_2(x, v) SCM_SET_CELL_OBJECT ((x), 2, (v)) #define SCM_SET_CELL_OBJECT_3(x, v) SCM_SET_CELL_OBJECT ((x), 3, (v)) -#define SCM_CELL_OBJECT_LOC(x, n) (SCM_VALIDATE_CELL((x), &SCM_GC_CELL_OBJECT ((x), (n)))) +#define SCM_CELL_WORD_LOC(x, n) (SCM_VALIDATE_CELL((x), &SCM_GC_CELL_WORD ((x), (n)))) +#define SCM_CELL_OBJECT_LOC(x, n) ((SCM *) SCM_CELL_WORD_LOC (x, n)) #define SCM_CARLOC(x) (SCM_CELL_OBJECT_LOC ((x), 0)) #define SCM_CDRLOC(x) (SCM_CELL_OBJECT_LOC ((x), 1)) diff --git a/libguile/guardians.c b/libguile/guardians.c index 42acf1e20..dfc533233 100644 --- a/libguile/guardians.c +++ b/libguile/guardians.c @@ -218,6 +218,8 @@ scm_i_guard (SCM guardian, SCM obj) SCM_EOL); finalizer_data = scm_cons (SCM_BOOL_F, guardians_for_obj); + /* FIXME: should be SCM_HEAP_OBJECT_BASE, but will the finalizer + strip the tag bits of pairs or structs? */ GC_REGISTER_FINALIZER_NO_ORDER (SCM_UNPACK_POINTER (obj), finalize_guarded, SCM_UNPACK_POINTER (finalizer_data), &prev_finalizer, &prev_data); diff --git a/libguile/macros.c b/libguile/macros.c index 556e60f57..bf351e4c1 100644 --- a/libguile/macros.c +++ b/libguile/macros.c @@ -103,7 +103,7 @@ SCM_DEFINE (scm_make_syntax_transformer, "make-syntax-transformer", 3, 0, 0, SCM_VALIDATE_SYMBOL (2, type); z = scm_words (scm_tc16_macro, 5); - SCM_SET_SMOB_DATA_N (z, 1, prim); + SCM_SET_SMOB_DATA_N (z, 1, (scm_t_bits)prim); SCM_SET_SMOB_OBJECT_N (z, 2, name); SCM_SET_SMOB_OBJECT_N (z, 3, type); SCM_SET_SMOB_OBJECT_N (z, 4, binding); diff --git a/libguile/numbers.h b/libguile/numbers.h index 08b04cfd8..96843c189 100644 --- a/libguile/numbers.h +++ b/libguile/numbers.h @@ -128,9 +128,9 @@ typedef scm_t_int32 scm_t_wchar; #define SCM_REALP(x) (SCM_HAS_TYP16 (x, scm_tc16_real)) #define SCM_COMPLEXP(x) (SCM_HAS_TYP16 (x, scm_tc16_complex)) -#define SCM_REAL_VALUE(x) (((scm_t_double *) SCM2PTR (x))->real) -#define SCM_COMPLEX_REAL(x) (((scm_t_complex *) SCM2PTR (x))->real) -#define SCM_COMPLEX_IMAG(x) (((scm_t_complex *) SCM2PTR (x))->imag) +#define SCM_REAL_VALUE(x) (((scm_t_double *) SCM_HEAP_OBJECT_BASE (x))->real) +#define SCM_COMPLEX_REAL(x) (((scm_t_complex *) SCM_HEAP_OBJECT_BASE (x))->real) +#define SCM_COMPLEX_IMAG(x) (((scm_t_complex *) SCM_HEAP_OBJECT_BASE (x))->imag) /* Each bignum is just an mpz_t stored in a double cell starting at word 1. */ #define SCM_I_BIG_MPZ(x) (*((mpz_t *) (SCM_CELL_OBJECT_LOC((x),1)))) diff --git a/libguile/ports.c b/libguile/ports.c index 3a942f7b8..b6b3aa955 100644 --- a/libguile/ports.c +++ b/libguile/ports.c @@ -525,7 +525,8 @@ register_finalizer_for_port (SCM port) /* Register a finalizer for PORT so that its iconv CDs get freed and optionally its type's `free' function gets called. */ - GC_REGISTER_FINALIZER_NO_ORDER (SCM2PTR (port), finalize_port, 0, + GC_REGISTER_FINALIZER_NO_ORDER (SCM_HEAP_OBJECT_BASE (port), + finalize_port, 0, &prev_finalizer, &prev_finalization_data); } diff --git a/libguile/smob.c b/libguile/smob.c index d7f1fb0e1..ad58301b0 100644 --- a/libguile/smob.c +++ b/libguile/smob.c @@ -604,7 +604,7 @@ scm_i_new_smob (scm_t_bits tc, scm_t_bits data) GC_finalization_proc prev_finalizer; GC_PTR prev_finalizer_data; - GC_REGISTER_FINALIZER_NO_ORDER (SCM2PTR (ret), + GC_REGISTER_FINALIZER_NO_ORDER (SCM_HEAP_OBJECT_BASE (ret), finalize_smob, NULL, &prev_finalizer, &prev_finalizer_data); } @@ -638,7 +638,7 @@ scm_i_new_double_smob (scm_t_bits tc, scm_t_bits data1, GC_finalization_proc prev_finalizer; GC_PTR prev_finalizer_data; - GC_REGISTER_FINALIZER_NO_ORDER (SCM2PTR (ret), + GC_REGISTER_FINALIZER_NO_ORDER (SCM_HEAP_OBJECT_BASE (ret), finalize_smob, NULL, &prev_finalizer, &prev_finalizer_data); } diff --git a/libguile/struct.c b/libguile/struct.c index 7f8f75d0b..cb046a1a2 100644 --- a/libguile/struct.c +++ b/libguile/struct.c @@ -446,7 +446,7 @@ scm_i_alloc_struct (scm_t_bits *vtable_data, int n_words) /* Register a finalizer for the newly created instance. */ GC_finalization_proc prev_finalizer; GC_PTR prev_finalizer_data; - GC_REGISTER_FINALIZER_NO_ORDER (SCM2PTR (ret), + GC_REGISTER_FINALIZER_NO_ORDER (SCM_HEAP_OBJECT_BASE (ret), struct_finalizer_trampoline, NULL, &prev_finalizer, diff --git a/libguile/tags.h b/libguile/tags.h index d781dfd88..54b74e0a2 100644 --- a/libguile/tags.h +++ b/libguile/tags.h @@ -391,6 +391,17 @@ typedef union SCM { struct { scm_t_bits n; } n; } SCM; #define scm_tc3_tc7_2 7 +/* As we have seen, heap objects have a tag in their three lowest bits. + If you have a heap object and want the pointer to the start of the + object, perhaps for GC purposes, you need to mask off the low bits, + which is what SCM_HEAP_OBJECT_BASE does. + + Note that you can avoid this macro if you know the specific type of + the object (pair, struct, or other). + */ +#define SCM_HEAP_OBJECT_BASE(x) ((scm_t_bits*)((SCM_UNPACK (x)) & ~7)) + + /* Definitions for tc7: */ #define SCM_ITAG7(x) (127 & SCM_UNPACK (x)) diff --git a/libguile/weak-set.c b/libguile/weak-set.c index 6e2e8ab86..626b29086 100644 --- a/libguile/weak-set.c +++ b/libguile/weak-set.c @@ -521,7 +521,7 @@ weak_set_add_x (scm_t_weak_set *set, unsigned long hash, if (SCM_HEAP_OBJECT_P (obj)) SCM_I_REGISTER_DISAPPEARING_LINK ((GC_PTR) &entries[k].key, - (GC_PTR) SCM2PTR (obj)); + (GC_PTR) SCM_HEAP_OBJECT_BASE (obj)); return obj; } @@ -684,7 +684,7 @@ scm_c_register_weak_gc_callback (SCM obj, void (*callback) (SCM)) weak[0] = SCM_UNPACK_POINTER (obj); weak[1] = (void*)callback; - GC_GENERAL_REGISTER_DISAPPEARING_LINK (weak, SCM2PTR (obj)); + GC_GENERAL_REGISTER_DISAPPEARING_LINK (weak, SCM_HEAP_OBJECT_BASE (obj)); #ifdef HAVE_GC_SET_START_CALLBACK scm_c_hook_add (&scm_after_gc_c_hook, weak_gc_hook, weak, 0); diff --git a/libguile/weak-table.c b/libguile/weak-table.c index e6e7f2e00..3ec113ab7 100644 --- a/libguile/weak-table.c +++ b/libguile/weak-table.c @@ -131,13 +131,13 @@ register_disappearing_links (scm_t_weak_entry *entry, && (kind == SCM_WEAK_TABLE_KIND_KEY || kind == SCM_WEAK_TABLE_KIND_BOTH)) SCM_I_REGISTER_DISAPPEARING_LINK ((GC_PTR) &entry->key, - (GC_PTR) SCM2PTR (k)); + (GC_PTR) SCM_HEAP_OBJECT_BASE (k)); if (SCM_UNPACK (v) && SCM_HEAP_OBJECT_P (v) && (kind == SCM_WEAK_TABLE_KIND_VALUE || kind == SCM_WEAK_TABLE_KIND_BOTH)) SCM_I_REGISTER_DISAPPEARING_LINK ((GC_PTR) &entry->value, - (GC_PTR) SCM2PTR (v)); + (GC_PTR) SCM_HEAP_OBJECT_BASE (v)); } static void @@ -302,7 +302,7 @@ mark_weak_key_table (GC_word *addr, struct GC_ms_entry *mark_stack_ptr, if (entries[k].hash && entries[k].key) { SCM value = SCM_PACK (entries[k].value); - mark_stack_ptr = GC_MARK_AND_PUSH ((GC_word*) SCM2PTR (value), + mark_stack_ptr = GC_MARK_AND_PUSH ((GC_word*) SCM_HEAP_OBJECT_BASE (value), mark_stack_ptr, mark_stack_limit, NULL); } @@ -321,7 +321,7 @@ mark_weak_value_table (GC_word *addr, struct GC_ms_entry *mark_stack_ptr, if (entries[k].hash && entries[k].value) { SCM key = SCM_PACK (entries[k].key); - mark_stack_ptr = GC_MARK_AND_PUSH ((GC_word*) SCM2PTR (key), + mark_stack_ptr = GC_MARK_AND_PUSH ((GC_word*) SCM_HEAP_OBJECT_BASE (key), mark_stack_ptr, mark_stack_limit, NULL); } @@ -784,7 +784,7 @@ scm_c_register_weak_gc_callback (SCM obj, void (*callback) (SCM)) weak[0] = SCM_UNPACK_POINTER (obj); weak[1] = (void*)callback; - GC_GENERAL_REGISTER_DISAPPEARING_LINK (weak, SCM2PTR (obj)); + GC_GENERAL_REGISTER_DISAPPEARING_LINK (weak, SCM_HEAP_OBJECT_BASE (obj)); #ifdef HAVE_GC_TABLE_START_CALLBACK scm_c_hook_add (&scm_after_gc_c_hook, weak_gc_hook, weak, 0); diff --git a/libguile/weak-vector.c b/libguile/weak-vector.c index 23bc386d4..f829d3617 100644 --- a/libguile/weak-vector.c +++ b/libguile/weak-vector.c @@ -177,7 +177,7 @@ scm_c_weak_vector_set_x (SCM wv, size_t k, SCM x) if (SCM_HEAP_OBJECT_P (x)) SCM_I_REGISTER_DISAPPEARING_LINK ((GC_PTR) &elts[k], - (GC_PTR) SCM2PTR (x)); + (GC_PTR) SCM_HEAP_OBJECT_BASE (x)); }