From 322ec19d3cede3e4d74c209e8155b4faba21f5f5 Mon Sep 17 00:00:00 2001 From: Michael Livshin Date: Thu, 11 Jan 2001 21:03:18 +0000 Subject: [PATCH] * objects.h (SCM_SET_ENTITY_SETTER): new macro. SCM_ENTITY_SETTER casts its result, so doesn't yield an lvalue per ANSI C. * goops.c (s_scm_sys_set_object_setter_x): use SCM_SET_ENTITY_SETTER. (clear_method_cache): use SCM_SET_ENTITY_PROCEDURE. * gc.h (SCM_GC_SET_CARD_BVEC): new macro. SCM_GC_CARD_BVEC casts its result, so doesn't yield an lvalue per ANSI C. (SCM_GC_SET_CARD_FLAGS): ditto for SCM_GC_GET_CARD_FLAGS. (SCM_GC_CLR_CARD_FLAGS): redefined in terms of SCM_GC_SET_CARD_FLAGS. (SCM_GC_SET_CARD_FLAG, SCM_GC_CLR_CARD_FLAGS): ditto. * gc.c (INIT_CARD): use the explicit setter macro to set the bvec. --- libguile/ChangeLog | 20 ++++++++++++++++++++ libguile/gc.c | 2 +- libguile/gc.h | 13 +++++++++---- libguile/goops.c | 5 +++-- libguile/objects.h | 2 ++ 5 files changed, 35 insertions(+), 7 deletions(-) diff --git a/libguile/ChangeLog b/libguile/ChangeLog index ac082ca0f..8c286e6d9 100644 --- a/libguile/ChangeLog +++ b/libguile/ChangeLog @@ -1,3 +1,23 @@ +2001-01-11 Michael Livshin + + from Matthias Köppe: + + * objects.h (SCM_SET_ENTITY_SETTER): new macro. SCM_ENTITY_SETTER + casts its result, so doesn't yield an lvalue per ANSI C. + + * goops.c (s_scm_sys_set_object_setter_x): use + SCM_SET_ENTITY_SETTER. + (clear_method_cache): use SCM_SET_ENTITY_PROCEDURE. + + * gc.h (SCM_GC_SET_CARD_BVEC): new macro. SCM_GC_CARD_BVEC casts + its result, so doesn't yield an lvalue per ANSI C. + (SCM_GC_SET_CARD_FLAGS): ditto for SCM_GC_GET_CARD_FLAGS. + (SCM_GC_CLR_CARD_FLAGS): redefined in terms of + SCM_GC_SET_CARD_FLAGS. + (SCM_GC_SET_CARD_FLAG, SCM_GC_CLR_CARD_FLAGS): ditto. + + * gc.c (INIT_CARD): use the explicit setter macro to set the bvec. + 2001-01-08 Gary Houston * validate.h (SCM_VALIDATE_SUBSTRING_SPEC_COPY): new macro. diff --git a/libguile/gc.c b/libguile/gc.c index d6767651d..5d4aa0063 100644 --- a/libguile/gc.c +++ b/libguile/gc.c @@ -2026,7 +2026,7 @@ int scm_n_heap_segs = 0; #define INIT_CARD(card, span) \ do { \ - SCM_GC_CARD_BVEC (card) = get_bvec (); \ + SCM_GC_SET_CARD_BVEC (card, get_bvec ()); \ if ((span) == 2) \ SCM_GC_SET_CARD_DOUBLECELL (card); \ } while (0) diff --git a/libguile/gc.h b/libguile/gc.h index 893c262e7..18852624a 100644 --- a/libguile/gc.h +++ b/libguile/gc.h @@ -94,14 +94,19 @@ typedef scm_cell * SCM_CELLPTR; SCM_PTR_LT ((scm_cell *) (x), SCM_GC_CELL_CARD (x) + SCM_GC_CARD_N_HEADER_CELLS) #define SCM_GC_CARD_BVEC(card) ((scm_c_bvec_limb_t *) ((card)->word_0)) +#define SCM_GC_SET_CARD_BVEC(card, bvec) \ + ((card)->word_0 = (scm_bits_t) (bvec)) #define SCM_GC_GET_CARD_FLAGS(card) ((long) ((card)->word_1)) -#define SCM_GC_SET_CARD_FLAGS(card, flags) (SCM_GC_GET_CARD_FLAGS (card) = (flags)) -#define SCM_GC_CLR_CARD_FLAGS(card) (SCM_GC_GET_CARD_FLAGS (card) = 0L) +#define SCM_GC_SET_CARD_FLAGS(card, flags) \ + ((card)->word_1 = (scm_bits_t) (flags)) +#define SCM_GC_CLR_CARD_FLAGS(card) (SCM_GC_SET_CARD_FLAGS (card, 0L)) #define SCM_GC_GET_CARD_FLAG(card, shift) (SCM_GC_GET_CARD_FLAGS (card) & (1L << (shift))) -#define SCM_GC_SET_CARD_FLAG(card, shift) (SCM_GC_GET_CARD_FLAGS (card) |= (1L << (shift))) -#define SCM_GC_CLR_CARD_FLAG(card, shift) (SCM_GC_GET_CARD_FLAGS (card) &= ~(1L << (shift))) +#define SCM_GC_SET_CARD_FLAG(card, shift) \ + (SCM_GC_SET_CARD_FLAGS (card, SCM_GC_GET_CARD_FLAGS(card) | (1L << (shift)))) +#define SCM_GC_CLR_CARD_FLAG(card, shift) \ + (SCM_GC_SET_CARD_FLAGS (card, SCM_GC_GET_CARD_FLAGS(card) & ~(1L << (shift)))) #define SCM_GC_CARDF_DOUBLECELL 0 diff --git a/libguile/goops.c b/libguile/goops.c index 0c4ffa6e9..4d7ce1484 100644 --- a/libguile/goops.c +++ b/libguile/goops.c @@ -1366,7 +1366,7 @@ SCM_DEFINE (scm_sys_set_object_setter_x, "%set-object-setter!", 2, 0, 0, SCM_ARG1, FUNC_NAME); if (SCM_I_ENTITYP (obj)) - SCM_ENTITY_SETTER (obj) = setter; + SCM_SET_ENTITY_SETTER (obj, setter); else SCM_OPERATOR_CLASS (obj)->setter = setter; return SCM_UNSPECIFIED; @@ -1545,7 +1545,8 @@ scm_make_method_cache (SCM gf) static void clear_method_cache (SCM gf) { - SCM_ENTITY_PROCEDURE (gf) = scm_make_method_cache (gf); + SCM cache = scm_make_method_cache (gf); + SCM_SET_ENTITY_PROCEDURE (gf, cache); SCM_SLOT (gf, scm_si_used_by) = SCM_BOOL_F; } diff --git a/libguile/objects.h b/libguile/objects.h index aa5836e9f..110158a8e 100644 --- a/libguile/objects.h +++ b/libguile/objects.h @@ -94,6 +94,8 @@ #define SCM_SET_ENTITY_PROCEDURE(obj,v) \ (SCM_STRUCT_DATA (obj) [scm_struct_i_procedure] = SCM_UNPACK (v)) #define SCM_ENTITY_SETTER(obj) (SCM_PACK (SCM_STRUCT_DATA (obj)[scm_struct_i_setter])) +#define SCM_SET_ENTITY_SETTER(obj, v) \ + (SCM_STRUCT_DATA (obj) [scm_struct_i_setter] = SCM_UNPACK (v)) #define SCM_SET_CLASS_DESTRUCTOR(c, d) SCM_SET_VTABLE_DESTRUCTOR (c, d) #define SCM_SET_CLASS_INSTANCE_SIZE(c, s) \ -- 2.20.1