Fix Map hash bug (#281)

- `map_hash_key` must generate the same key for JS_INT and JS_FLOAT64
   with the same value
- add test cases in tests/test_builtin.js
This commit is contained in:
Charlie Gordon 2024-02-23 11:57:43 +01:00 committed by GitHub
parent 2d1473efbc
commit 47e07b25aa
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 12 additions and 2 deletions

View file

@ -44377,7 +44377,7 @@ static uint32_t map_hash_key(JSContext *ctx, JSValue key)
h = (uintptr_t)JS_VALUE_GET_PTR(key) * 3163; h = (uintptr_t)JS_VALUE_GET_PTR(key) * 3163;
break; break;
case JS_TAG_INT: case JS_TAG_INT:
d = JS_VALUE_GET_INT(key) * 3163; d = JS_VALUE_GET_INT(key);
goto hash_float64; goto hash_float64;
case JS_TAG_BIG_INT: case JS_TAG_BIG_INT:
a = JS_GetBigInt(key); a = JS_GetBigInt(key);
@ -44391,7 +44391,7 @@ static uint32_t map_hash_key(JSContext *ctx, JSValue key)
hash_float64: hash_float64:
u.d = d; u.d = d;
h = (u.u32[0] ^ u.u32[1]) * 3163; h = (u.u32[0] ^ u.u32[1]) * 3163;
break; return h ^= JS_TAG_FLOAT64;
default: default:
h = 0; h = 0;
break; break;

View file

@ -737,6 +737,16 @@ function test_map()
{ {
var a, i, n, tab, o, v; var a, i, n, tab, o, v;
n = 1000; n = 1000;
a = new Map();
for (var i = 0; i < n; i++) {
a.set(i, i);
}
a.set(-2147483648, 1);
assert(a.get(-2147483648), 1);
assert(a.get(-2147483647 - 1), 1);
assert(a.get(-2147483647.5 - 0.5), 1);
a = new Map(); a = new Map();
tab = []; tab = [];
for(i = 0; i < n; i++) { for(i = 0; i < n; i++) {