diff --git a/nova_vm/src/ecmascript/builtins/numbers_and_dates/bigint_objects/bigint_constructor.rs b/nova_vm/src/ecmascript/builtins/numbers_and_dates/bigint_objects/bigint_constructor.rs index ed4b661e7..977ae8467 100644 --- a/nova_vm/src/ecmascript/builtins/numbers_and_dates/bigint_objects/bigint_constructor.rs +++ b/nova_vm/src/ecmascript/builtins/numbers_and_dates/bigint_objects/bigint_constructor.rs @@ -204,26 +204,36 @@ impl BigIntConstructor { let bigint = to_big_int(agent, bigint.get(agent), gc.reborrow()) .unbind()? .bind(gc.nogc()); - match bigint { - BigInt::BigInt(int) => { - let int = &agent[int].data; - let modulus = 2i64.pow(bits); - Ok( - BigInt::from_num_bigint(agent, ((int % modulus) + modulus) % modulus) - .into_value(), - ) - } - BigInt::SmallBigInt(int) => { - let int = int.into_i64(); - if let Some(modulo) = 2i64 - .checked_pow(bits) - .and_then(|base| int.checked_rem_euclid(base)) - { + + match 2i64.checked_pow(bits) { + Some(modulus) => match bigint { + BigInt::BigInt(int) => { + let int = &agent[int].data; + Ok( + BigInt::from_num_bigint(agent, ((int % modulus) + modulus) % modulus) + .into_value(), + ) + } + BigInt::SmallBigInt(int) => { + let int = int.into_i64(); + let modulo = int.rem_euclid(modulus); Ok(BigInt::from(SmallBigInt::try_from(modulo).unwrap()).into_value()) - } else { - let modulus = num_bigint::BigInt::from(2).pow(bits); - let result = ((int % modulus.clone()) + modulus.clone()) % modulus; - Ok(BigInt::from_num_bigint(agent, result).into_value()) + } + }, + None => { + let modulus = + num_bigint::BigInt::from_bytes_le(num_bigint::Sign::Plus, &[2]).pow(bits); + match bigint { + BigInt::BigInt(int) => { + let int = &agent[int].data; + let result = ((int % &modulus) + &modulus) % &modulus; + Ok(BigInt::from_num_bigint(agent, result).into_value()) + } + BigInt::SmallBigInt(int) => { + let int = int.into_i64(); + let result = ((int % &modulus) + &modulus) % &modulus; + Ok(BigInt::from_num_bigint(agent, result).into_value()) + } } } } diff --git a/tests/expectations.json b/tests/expectations.json index ac1dab8c1..23062b13f 100644 --- a/tests/expectations.json +++ b/tests/expectations.json @@ -249,7 +249,6 @@ "built-ins/Atomics/waitAsync/bigint/true-for-timeout.js": "FAIL", "built-ins/Atomics/waitAsync/returns-result-object-value-is-promise-resolves-to-timed-out.js": "FAIL", "built-ins/Atomics/waitAsync/true-for-timeout.js": "FAIL", - "built-ins/BigInt/asUintN/arithmetic.js": "CRASH", "built-ins/Boolean/proto-from-ctor-realm.js": "FAIL", "built-ins/DataView/proto-from-ctor-realm-sab.js": "FAIL", "built-ins/DataView/proto-from-ctor-realm.js": "FAIL", diff --git a/tests/metrics.json b/tests/metrics.json index 7c7b2c4da..571f0129b 100644 --- a/tests/metrics.json +++ b/tests/metrics.json @@ -1,8 +1,8 @@ { "results": { - "crash": 73, + "crash": 72, "fail": 7643, - "pass": 39638, + "pass": 39639, "skip": 3325, "timeout": 17, "unresolved": 37