mirror of
https://git.savannah.gnu.org/git/guile.git
synced 2025-06-30 06:50:31 +02:00
Fix `hash' for pointer objects.
Previously all pointer objects would hash to the same value. * libguile/hash.c (scm_hasher): Add case for `scm_tc7_pointer'.
This commit is contained in:
parent
183f784947
commit
3854d5fd23
1 changed files with 11 additions and 0 deletions
|
@ -135,6 +135,17 @@ scm_hasher(SCM obj, unsigned long n, size_t d)
|
||||||
}
|
}
|
||||||
case scm_tc7_symbol:
|
case scm_tc7_symbol:
|
||||||
return scm_i_symbol_hash (obj) % n;
|
return scm_i_symbol_hash (obj) % n;
|
||||||
|
case scm_tc7_pointer:
|
||||||
|
{
|
||||||
|
/* Pointer objects are typically used to store addresses of heap
|
||||||
|
objects. On most platforms, these are at least 3-byte
|
||||||
|
aligned (on x86_64-*-gnu, `malloc' returns 4-byte aligned
|
||||||
|
addresses), so get rid of the least significant bits. */
|
||||||
|
scm_t_uintptr significant_bits;
|
||||||
|
|
||||||
|
significant_bits = (scm_t_uintptr) SCM_POINTER_VALUE (obj) >> 4UL;
|
||||||
|
return (size_t) significant_bits % n;
|
||||||
|
}
|
||||||
case scm_tc7_wvect:
|
case scm_tc7_wvect:
|
||||||
case scm_tc7_vector:
|
case scm_tc7_vector:
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue