diff options
-rw-r--r-- | libguile/ChangeLog | 11 | ||||
-rw-r--r-- | libguile/objects.h | 4 | ||||
-rw-r--r-- | libguile/struct.c | 2 | ||||
-rw-r--r-- | libguile/struct.h | 11 |
4 files changed, 21 insertions, 7 deletions
diff --git a/libguile/ChangeLog b/libguile/ChangeLog index df8e3b65d..1cd729fdb 100644 --- a/libguile/ChangeLog +++ b/libguile/ChangeLog @@ -1,5 +1,16 @@ 2000-04-11 Dirk Herrmann <D.Herrmann@tu-bs.de> + * objects.h (SCM_OBJ_CLASS_FLAGS, SCM_OBJ_CLASS_REDEF), struct.h + (SCM_STRUCT_VTABLE_DATA, SCM_STRUCT_LAYOUT, SCM_STRUCT_VTABLE, + SCM_STRUCT_PRINTER): The struct vtable data is now an array of + scm_bits_t variables. + + * struct.h (SCM_SET_STRUCT_LAYOUT): New macro. + + * struct.c (scm_make_vtable_vtable): Use it. + +2000-04-11 Dirk Herrmann <D.Herrmann@tu-bs.de> + * symbols.c (scm_sym2vcell, scm_sym2ovcell_soft, scm_sym2ovcell, scm_intern_obarray_soft, scm_sysintern0, scm_string_to_obarray_symbol, scm_intern_symbol, diff --git a/libguile/objects.h b/libguile/objects.h index e567ae386..03aa52b22 100644 --- a/libguile/objects.h +++ b/libguile/objects.h @@ -70,7 +70,7 @@ #define SCM_CLASS_FLAGS(class)\ SCM_UNPACK (SCM_STRUCT_DATA (class)[scm_struct_i_flags]) #define SCM_OBJ_CLASS_FLAGS(obj)\ - SCM_UNPACK (SCM_STRUCT_VTABLE_DATA (obj)[scm_struct_i_flags]) + (SCM_STRUCT_VTABLE_DATA (obj) [scm_struct_i_flags]) #define SCM_SET_CLASS_FLAGS(c, f) (SCM_CLASS_FLAGS (c) |= (f)) #define SCM_CLEAR_CLASS_FLAGS(c, f) (SCM_CLASS_FLAGS (c) &= ~(f)) #define SCM_CLASSF_MASK SCM_STRUCTF_MASK @@ -176,7 +176,7 @@ struct scm_metaclass_operator { #define scm_si_redefined 6 #define scm_si_hashsets 7 #define SCM_CLASS_OF(x) SCM_STRUCT_VTABLE (x) -#define SCM_OBJ_CLASS_REDEF(x) (SCM_STRUCT_VTABLE_DATA(x)[scm_si_redefined]) +#define SCM_OBJ_CLASS_REDEF(x) (SCM_PACK (SCM_STRUCT_VTABLE_DATA (x) [scm_si_redefined])) typedef struct scm_effective_slot_definition { SCM name; diff --git a/libguile/struct.c b/libguile/struct.c index 19f3e790c..bbae48bb9 100644 --- a/libguile/struct.c +++ b/libguile/struct.c @@ -500,7 +500,7 @@ SCM_DEFINE (scm_make_vtable_vtable, "make-vtable-vtable", 2, 0, 1, "make-vtable-vtable"); SCM_SET_CELL_WORD_1 (handle, data); SCM_SETCAR (handle, ((SCM)data) + scm_tc3_cons_gloc); - SCM_STRUCT_LAYOUT (handle) = layout; + SCM_SET_STRUCT_LAYOUT (handle, layout); scm_struct_init (handle, tail_elts, scm_cons (layout, init)); SCM_ALLOW_INTS; return handle; diff --git a/libguile/struct.h b/libguile/struct.h index 56de61c8f..d76b0f968 100644 --- a/libguile/struct.h +++ b/libguile/struct.h @@ -79,10 +79,13 @@ typedef scm_sizet (*scm_struct_free_t) (SCM *vtable, SCM *data); #define SCM_STRUCTP(X) (SCM_NIMP(X) && (SCM_TYP3(X) == scm_tc3_cons_gloc)) #define SCM_STRUCT_DATA(X) ((SCM *) SCM_UNPACK (SCM_CDR (X))) -#define SCM_STRUCT_VTABLE_DATA(X) ((SCM *) (SCM_UNPACK (SCM_CAR (X)) - 1)) -#define SCM_STRUCT_LAYOUT(X) (SCM_STRUCT_VTABLE_DATA(X)[scm_vtable_index_layout]) -#define SCM_STRUCT_VTABLE(X) (SCM_STRUCT_VTABLE_DATA(X)[scm_vtable_index_vtable]) -#define SCM_STRUCT_PRINTER(X) (SCM_STRUCT_VTABLE_DATA(X)[scm_vtable_index_printer]) +#define SCM_STRUCT_VTABLE_DATA(X) ((scm_bits_t *) (SCM_CELL_WORD_0 (X) - 1)) + +#define SCM_STRUCT_LAYOUT(X) (SCM_PACK (SCM_STRUCT_VTABLE_DATA (X) [scm_vtable_index_layout])) +#define SCM_SET_STRUCT_LAYOUT(X, v) (SCM_STRUCT_VTABLE_DATA (X) [scm_vtable_index_layout] = SCM_UNPACK (v)) + +#define SCM_STRUCT_VTABLE(X) (SCM_PACK (SCM_STRUCT_VTABLE_DATA (X) [scm_vtable_index_vtable])) +#define SCM_STRUCT_PRINTER(X) (SCM_PACK (SCM_STRUCT_VTABLE_DATA (X) [scm_vtable_index_printer])) #define SCM_SET_VTABLE_DESTRUCTOR(X, D) (SCM_STRUCT_DATA(X)[scm_struct_i_free] = (SCM) D) /* Efficiency is important in the following macro, since it's used in GC */ #define SCM_LAYOUT_TAILP(X) (((X) & 32) == 0) /* R, W or O */ |