summaryrefslogtreecommitdiff
path: root/libguile/hash.c
diff options
context:
space:
mode:
Diffstat (limited to 'libguile/hash.c')
-rw-r--r--libguile/hash.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/libguile/hash.c b/libguile/hash.c
index 5123c2c15..9036d06db 100644
--- a/libguile/hash.c
+++ b/libguile/hash.c
@@ -120,20 +120,27 @@ scm_hasher(SCM obj, unsigned long n, size_t d)
case scm_tc7_wvect:
case scm_tc7_vector:
{
- size_t len = SCM_VECTOR_LENGTH(obj);
- SCM const *data = SCM_VELTS(obj);
+ size_t len = SCM_SIMPLE_VECTOR_LENGTH (obj);
if (len > 5)
{
size_t i = d/2;
unsigned long h = 1;
- while (i--) h = ((h << 8) + (scm_hasher (data[h % len], n, 2))) % n;
+ while (i--)
+ {
+ SCM elt = SCM_SIMPLE_VECTOR_REF (obj, h % len);
+ h = ((h << 8) + (scm_hasher (elt, n, 2))) % n;
+ }
return h;
}
else
{
size_t i = len;
unsigned long h = (n)-1;
- while (i--) h = ((h << 8) + (scm_hasher (data[i], n, d/len))) % n;
+ while (i--)
+ {
+ SCM elt = SCM_SIMPLE_VECTOR_REF (obj, h % len);
+ h = ((h << 8) + (scm_hasher (elt, n, d/len))) % n;
+ }
return h;
}
}