diff --git a/libguile/ChangeLog b/libguile/ChangeLog index 8f90ef731..c682a447c 100644 --- a/libguile/ChangeLog +++ b/libguile/ChangeLog @@ -1,3 +1,20 @@ +2000-04-12 Dirk Herrmann + + * gc.c (scm_gc_sweep): Simplify the computation of freed memory + size for msymbols. + + * symbols.h (SCM_SLOTS, SCM_SYMBOL_FUNC, SCM_SYMBOL_PROPS, + SCM_SYMBOL_HASH): The msymbol slots are now a field of scm_bits_t + values. + + * symbols.h (SCM_SET_SYMBOL_FUNC, SCM_SET_SYMBOL_PROPS): New + macros. + + symbols.c (scm_intern_obarray_soft, msymbolize, scm_symbol_fset_x, + scm_symbol_pset_x): Use them. + + * symbols.c (scm_symbol_hash): Unpack to access SCM raw data. + 2000-04-12 Dirk Herrmann * ports.c (scm_port_print): The port data is read as raw data. @@ -16,7 +33,7 @@ * objects.h (SCM_SET_ENTITY_PROCEDURE): New macro. - * objects.c (scm_set_object_procedure_x): Use it. + objects.c (scm_set_object_procedure_x): Use it. * struct.c (scm_struct_init): Unused variable 'data' removed. @@ -31,7 +48,7 @@ * struct.h (SCM_SET_STRUCT_LAYOUT): New macro. - * struct.c (scm_make_vtable_vtable): Use it. + struct.c (scm_make_vtable_vtable): Use it. 2000-04-11 Dirk Herrmann diff --git a/libguile/gc.c b/libguile/gc.c index 4b8239996..9ff841aab 100644 --- a/libguile/gc.c +++ b/libguile/gc.c @@ -1747,9 +1747,8 @@ scm_gc_sweep () case scm_tc7_msymbol: if (SCM_GC8MARKP (scmptr)) goto c8mrkcontinue; - m += ( SCM_LENGTH (scmptr) - + 1 - + sizeof (SCM) * ((SCM *)SCM_CHARS (scmptr) - SCM_SLOTS(scmptr))); + m += (SCM_LENGTH (scmptr) + 1 + + (SCM_CHARS (scmptr) - (char *) SCM_SLOTS (scmptr))); scm_must_free ((char *)SCM_SLOTS (scmptr)); break; case scm_tc7_contin: diff --git a/libguile/symbols.c b/libguile/symbols.c index e6afce65c..e02a8f567 100644 --- a/libguile/symbols.c +++ b/libguile/symbols.c @@ -289,7 +289,7 @@ scm_intern_obarray_soft (const char *name,scm_sizet len,SCM obarray,int softness SCM_SETLENGTH (lsym, (long) len, scm_tc7_msymbol); SCM_SYMBOL_HASH (lsym) = scm_hash; - SCM_SYMBOL_PROPS (lsym) = SCM_EOL; + SCM_SET_SYMBOL_PROPS (lsym, SCM_EOL); if (SCM_FALSEP (obarray)) { SCM answer; @@ -704,7 +704,7 @@ msymbolize (SCM s) SCM_SETLENGTH (s, SCM_LENGTH (s), scm_tc7_msymbol); SCM_SETCDR (string, SCM_EOL); SCM_SETCAR (string, SCM_EOL); - SCM_SYMBOL_PROPS (s) = SCM_EOL; + SCM_SET_SYMBOL_PROPS (s, SCM_EOL); /* If it's a tc7_ssymbol, it comes from scm_symhash */ SCM_SYMBOL_HASH (s) = scm_strhash (SCM_UCHARS (s), (scm_sizet) SCM_LENGTH (s), @@ -752,7 +752,7 @@ SCM_DEFINE (scm_symbol_fset_x, "symbol-fset!", 2, 0, 0, if (SCM_TYP7(s) == scm_tc7_ssymbol) msymbolize (s); SCM_ALLOW_INTS; - SCM_SYMBOL_FUNC (s) = val; + SCM_SET_SYMBOL_FUNC (s, val); return SCM_UNSPECIFIED; } #undef FUNC_NAME @@ -767,7 +767,7 @@ SCM_DEFINE (scm_symbol_pset_x, "symbol-pset!", 2, 0, 0, SCM_DEFER_INTS; if (SCM_TYP7(s) == scm_tc7_ssymbol) msymbolize (s); - SCM_SYMBOL_PROPS (s) = val; + SCM_SET_SYMBOL_PROPS (s, val); SCM_ALLOW_INTS; return SCM_UNSPECIFIED; } @@ -783,7 +783,7 @@ SCM_DEFINE (scm_symbol_hash, "symbol-hash", 1, 0, 0, SCM_VALIDATE_SYMBOL (1,s); if (SCM_TYP7(s) == scm_tc7_ssymbol) msymbolize (s); - return SCM_MAKINUM ((unsigned long)s ^ SCM_SYMBOL_HASH (s)); + return SCM_MAKINUM (SCM_UNPACK (s) ^ SCM_SYMBOL_HASH (s)); } #undef FUNC_NAME diff --git a/libguile/symbols.h b/libguile/symbols.h index a5af63c6d..aab8b90f3 100644 --- a/libguile/symbols.h +++ b/libguile/symbols.h @@ -87,11 +87,13 @@ extern int scm_symhash_dim; #define SCM_UCHARS(x) ((unsigned char *) (SCM_CELL_WORD_1 (x))) #define SCM_SETCHARS(x, v) (SCM_SET_CELL_WORD_1 ((x), (scm_bits_t) (v))) -#define SCM_SYMBOL_SLOTS 4 -#define SCM_SLOTS(x) ((SCM *) (* ((SCM *) SCM_CHARS (x) - 1))) -#define SCM_SYMBOL_FUNC(X) (SCM_SLOTS (X)[0]) -#define SCM_SYMBOL_PROPS(X) (SCM_SLOTS (X)[1]) -#define SCM_SYMBOL_HASH(X) (*(unsigned long*) (&SCM_SLOTS (X)[2])) +#define SCM_SYMBOL_SLOTS 4 +#define SCM_SLOTS(x) ((scm_bits_t *) (* ((scm_bits_t *) SCM_CHARS (x) - 1))) +#define SCM_SYMBOL_FUNC(X) (SCM_PACK (SCM_SLOTS (X) [0])) +#define SCM_SET_SYMBOL_FUNC(X, v) (SCM_SLOTS (X) [0] = SCM_UNPACK (v)) +#define SCM_SYMBOL_PROPS(X) (SCM_PACK (SCM_SLOTS (X) [1])) +#define SCM_SET_SYMBOL_PROPS(X, v) (SCM_SLOTS (X) [1] = SCM_UNPACK (v)) +#define SCM_SYMBOL_HASH(X) (SCM_SLOTS (X) [2]) #define SCM_ROSTRINGP(x) (SCM_NIMP(x) && ((SCM_TYP7S(x)==scm_tc7_string) \ || (SCM_TYP7S(x) == scm_tc7_ssymbol)))