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-11 Michael Livshin <mlivshin@bigfoot.com>
+
+ 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 <ghouston@arglist.com>
* validate.h (SCM_VALIDATE_SUBSTRING_SPEC_COPY): new macro.
#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)
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
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;
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;
}
#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) \