diff options
author | Andy Wingo <wingo@pobox.com> | 2017-09-26 21:56:31 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2017-09-26 21:56:31 +0200 |
commit | 214e887dbdece2e7608b02dd1ce5b31e710266cc (patch) | |
tree | 57aa16c3c15dfc2a39cfc858127504771e6ec5aa /libguile/hash.c | |
parent | f32500acca82f13824e0d6d06836411f9d0c9c01 (diff) | |
download | guile-214e887dbdece2e7608b02dd1ce5b31e710266cc.tar.gz |
Struct vtables store bitmask of unboxed fields
* libguile/struct.h (scm_vtable_index_unboxed_fields): Allocate slot for
bitmask of which fields are unboxed.
(SCM_VTABLE_FLAG_SIMPLE, SCM_VTABLE_FLAG_SIMPLE_RW): Remove flags.
Renumber other flags.
(SCM_VTABLE_SIZE, SCM_STRUCT_SIZE): New helpers; long overdue.
(SCM_VTABLE_UNBOXED_FIELDS, SCM_VTABLE_FIELD_IS_UNBOXED):
(SCM_STRUCT_FIELD_IS_UNBOXED): New macros.
* libguile/struct.c (set_vtable_access_fields): Rename from
set_vtable_layout_flags, and initialize the unboxed flags bitmask
instead of computing vtable flags.
(scm_struct_init, scm_c_make_structv, scm_allocate_struct): Simplify.
(scm_i_make_vtable_vtable): Adapt.
(scm_i_struct_equalp, scm_struct_ref, scm_struct_set_x)
(scm_struct_ref_unboxed, scm_struct_set_x_unboxed): Simplify.
* libguile/vm-engine.c (VM_VALIDATE_BOXED_STRUCT_FIELD):
(VM_VALIDATE_UNBOXED_STRUCT_FIELD): Adapt definitions.
(struct-ref, struct-set!, struct-ref/immediate)
(struct-set!/immediate): Simplify definitions.
* libguile/hash.c (scm_i_struct_hash): Simplify.
* libguile/goops.c (scm_sys_clear_fields_x): Simplify.
* libguile/foreign-object.c (scm_make_foreign_object_n):
(scm_foreign_object_unsigned_ref, scm_foreign_object_unsigned_set_x):
Simplify.
Diffstat (limited to 'libguile/hash.c')
-rw-r--r-- | libguile/hash.c | 33 |
1 files changed, 9 insertions, 24 deletions
diff --git a/libguile/hash.c b/libguile/hash.c index 84285aa11..93c6f7aa8 100644 --- a/libguile/hash.c +++ b/libguile/hash.c @@ -227,36 +227,21 @@ static unsigned long scm_raw_ihash (SCM obj, size_t depth); static unsigned long scm_i_struct_hash (SCM obj, size_t depth) { - SCM layout; - scm_t_bits *data; size_t struct_size, field_num; unsigned long hash; - layout = SCM_STRUCT_LAYOUT (obj); - struct_size = scm_i_symbol_length (layout) / 2; - data = SCM_STRUCT_DATA (obj); + struct_size = SCM_STRUCT_SIZE (obj); hash = scm_raw_ihashq (SCM_UNPACK (SCM_STRUCT_VTABLE (obj))); if (depth > 0) - for (field_num = 0; field_num < struct_size; field_num++) - { - int type; - type = scm_i_symbol_ref (layout, field_num * 2); - switch (type) - { - case 'p': - hash ^= scm_raw_ihash (SCM_PACK (data[field_num]), - depth / 2); - break; - case 'u': - hash ^= scm_raw_ihashq (data[field_num]); - break; - default: - abort (); - } - } - - /* FIXME: Tail elements should be taken into account. */ + { + for (field_num = 0; field_num < struct_size; field_num++) + if (SCM_STRUCT_FIELD_IS_UNBOXED (obj, field_num)) + hash ^= scm_raw_ihashq (SCM_STRUCT_DATA_REF (obj, field_num)); + else + hash ^= scm_raw_ihash (SCM_STRUCT_SLOT_REF (obj, field_num), + depth / 2); + } return hash; } |