summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libguile/bytevectors.c2
-rw-r--r--libguile/fluids.c2
-rw-r--r--libguile/foreign.c4
-rw-r--r--libguile/gc.h12
-rw-r--r--libguile/guardians.c2
-rw-r--r--libguile/macros.c2
-rw-r--r--libguile/numbers.h6
-rw-r--r--libguile/ports.c3
-rw-r--r--libguile/smob.c4
-rw-r--r--libguile/struct.c2
-rw-r--r--libguile/tags.h11
-rw-r--r--libguile/weak-set.c4
-rw-r--r--libguile/weak-table.c10
-rw-r--r--libguile/weak-vector.c2
14 files changed, 41 insertions, 25 deletions
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));
}