diff options
author | Rob Browning <rlb@defaultvalue.org> | 2023-03-12 14:26:10 -0500 |
---|---|---|
committer | Rob Browning <rlb@defaultvalue.org> | 2023-03-18 13:24:43 -0500 |
commit | ffb95239aacf86d8dc622a438bdaacfac4a66efc (patch) | |
tree | d49911a0abac917a73b6ec6e0e2c0ec0ade6f426 /libguile/symbols.c | |
parent | f0df1ed0fdca7a63cffda5e53c968e814b7b06ec (diff) | |
download | guile-ffb95239aacf86d8dc622a438bdaacfac4a66efc.tar.gz |
scm_i_utf8_string_hash: compute u8 chars not bytes
Noticed while investigating a migration to utf-8 strings. After making
changes that routed non-ascii symbol hashing through this function,
encoding-iso88597.test began intermittently failing because it would
traverse trailing garbage when u8_strnlen reported 8 chars instead of 4.
Change the scm_i_str2symbol and scm_i_str2uninterned_symbol internal
hash type to unsigned long to explicitly match the scm_i_string_hash
result type.
* libguile/hash.c (scm_i_utf8_string_hash): Call u8_mbsnlen not u8_strnlen.
* libguile/symbols.c (scm_i_str2symbol, scm_i_str2uninterned_symbol):
Use unsigned long for scm_i_string_hash result.
* test-suite/standalone/.gitignore: Add test-hashing.
* test-suite/standalone/Makefile.am: Add test-hashing.
* test-suite/standalone/test-hashing.c: Add.
Diffstat (limited to 'libguile/symbols.c')
-rw-r--r-- | libguile/symbols.c | 4 |
1 files changed, 2 insertions, 2 deletions
diff --git a/libguile/symbols.c b/libguile/symbols.c index 02be7c1c4..086abf585 100644 --- a/libguile/symbols.c +++ b/libguile/symbols.c @@ -239,7 +239,7 @@ static SCM scm_i_str2symbol (SCM str) { SCM symbol; - size_t raw_hash = scm_i_string_hash (str); + unsigned long raw_hash = scm_i_string_hash (str); symbol = lookup_interned_symbol (str, raw_hash); if (scm_is_true (symbol)) @@ -261,7 +261,7 @@ scm_i_str2symbol (SCM str) static SCM scm_i_str2uninterned_symbol (SCM str) { - size_t raw_hash = scm_i_string_hash (str); + unsigned long raw_hash = scm_i_string_hash (str); return scm_i_make_symbol (str, SCM_I_F_SYMBOL_UNINTERNED, raw_hash); } |