summaryrefslogtreecommitdiff
path: root/libguile/hash.c
diff options
context:
space:
mode:
authorAndy Wingo <wingo@pobox.com>2017-09-26 21:56:31 +0200
committerAndy Wingo <wingo@pobox.com>2017-09-26 21:56:31 +0200
commit214e887dbdece2e7608b02dd1ce5b31e710266cc (patch)
tree57aa16c3c15dfc2a39cfc858127504771e6ec5aa /libguile/hash.c
parentf32500acca82f13824e0d6d06836411f9d0c9c01 (diff)
downloadguile-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.c33
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;
}