mirror of
https://github.com/bellard/quickjs.git
synced 2024-11-22 21:58:12 +08:00
Fix Map hash bug
- `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:
parent
b70e764427
commit
27928ce491
@ -46963,7 +46963,7 @@ static uint32_t map_hash_key(JSContext *ctx, JSValueConst 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_FLOAT64:
|
case JS_TAG_FLOAT64:
|
||||||
d = JS_VALUE_GET_FLOAT64(key);
|
d = JS_VALUE_GET_FLOAT64(key);
|
||||||
@ -46973,7 +46973,7 @@ static uint32_t map_hash_key(JSContext *ctx, JSValueConst 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; /* XXX: bignum support */
|
h = 0; /* XXX: bignum support */
|
||||||
break;
|
break;
|
||||||
|
@ -671,6 +671,20 @@ 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.set(1n, 1n);
|
||||||
|
assert(a.get(1n), 1n);
|
||||||
|
assert(a.get(2n**1000n - (2n**1000n - 1n)), 1n);
|
||||||
|
|
||||||
a = new Map();
|
a = new Map();
|
||||||
tab = [];
|
tab = [];
|
||||||
for(i = 0; i < n; i++) {
|
for(i = 0; i < n; i++) {
|
||||||
|
Loading…
Reference in New Issue
Block a user