Improve BigInt hashing (#38)
Fixes: https://github.com/quickjs-ng/quickjs/issues/35
This commit is contained in:
parent
8d62210e7d
commit
7b64da2325
2 changed files with 31 additions and 1 deletions
|
@ -43301,6 +43301,7 @@ static uint32_t map_hash_key(JSContext *ctx, JSValueConst key)
|
|||
uint32_t h;
|
||||
double d;
|
||||
JSFloat64Union u;
|
||||
bf_t *a;
|
||||
|
||||
switch(tag) {
|
||||
case JS_TAG_BOOL:
|
||||
|
@ -43316,6 +43317,10 @@ static uint32_t map_hash_key(JSContext *ctx, JSValueConst key)
|
|||
case JS_TAG_INT:
|
||||
d = JS_VALUE_GET_INT(key) * 3163;
|
||||
goto hash_float64;
|
||||
case JS_TAG_BIG_INT:
|
||||
a = JS_GetBigInt(key);
|
||||
h = hash_string8((void *)a->tab, a->len * sizeof(*a->tab), 0);
|
||||
break;
|
||||
case JS_TAG_FLOAT64:
|
||||
d = JS_VALUE_GET_FLOAT64(key);
|
||||
/* normalize the NaN */
|
||||
|
@ -43326,7 +43331,7 @@ static uint32_t map_hash_key(JSContext *ctx, JSValueConst key)
|
|||
h = (u.u32[0] ^ u.u32[1]) * 3163;
|
||||
break;
|
||||
default:
|
||||
h = 0; /* XXX: bigint support */
|
||||
h = 0;
|
||||
break;
|
||||
}
|
||||
h ^= tag;
|
||||
|
|
|
@ -110,5 +110,30 @@ function test_bigint2()
|
|||
assertThrows(SyntaxError, () => { BigInt(" 123 r") } );
|
||||
}
|
||||
|
||||
function test_bigint_map()
|
||||
{
|
||||
var m = new Map();
|
||||
assert(m.size, 0);
|
||||
|
||||
for (let i = 0n; i < 1337n; i++) {
|
||||
const r = m.set(i, i.toString());
|
||||
assert(r, m);
|
||||
}
|
||||
assert(m.size, 1337);
|
||||
|
||||
for (let i = 0n; i < 1337n; i++) {
|
||||
const r = m.get(i);
|
||||
assert(r, i.toString());
|
||||
}
|
||||
assert(m.get(1337n), undefined);
|
||||
assert(m.size, 1337);
|
||||
|
||||
for (let i = 0n; i < 1337n; i++)
|
||||
assert(m.delete(i));
|
||||
assert(!m.delete(1337n));
|
||||
assert(m.size, 0);
|
||||
}
|
||||
|
||||
test_bigint1();
|
||||
test_bigint2();
|
||||
test_bigint_map();
|
||||
|
|
Loading…
Reference in a new issue