mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 14:28:12 +00:00
LibJS: Split out NumberToBigInt from the BigInt constructor
This is supposed to be its own AO, but since it was only used in one place, we inlined it. Now that it's also being used in the Temporal proposal (Date.prototype.toTemporalInstant() specifically), it makes sense to have it as a standalone function. A small difference is that we now construct the SignedBigInteger without casting to i32 but instead take the (known to be integral) double and cast it to i64. Not perfect, but slightly better. Also clean up the BigInt constructor a bit while we're here and sprinkle some spec comments.
This commit is contained in:
parent
3e8574a9a8
commit
cc64efac44
3 changed files with 37 additions and 17 deletions
|
@ -1,11 +1,11 @@
|
|||
/*
|
||||
* Copyright (c) 2020, Linus Groh <linusg@serenityos.org>
|
||||
* Copyright (c) 2020-2021, Linus Groh <linusg@serenityos.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include <AK/String.h>
|
||||
#include <LibCrypto/BigInt/SignedBigInteger.h>
|
||||
#include <LibJS/Runtime/BigInt.h>
|
||||
#include <LibJS/Runtime/BigIntConstructor.h>
|
||||
#include <LibJS/Runtime/BigIntObject.h>
|
||||
#include <LibJS/Runtime/Error.h>
|
||||
|
@ -42,20 +42,22 @@ BigIntConstructor::~BigIntConstructor()
|
|||
// 21.2.1.1 BigInt ( value ), https://tc39.es/ecma262/#sec-bigint-constructor-number-value
|
||||
Value BigIntConstructor::call()
|
||||
{
|
||||
auto primitive = vm().argument(0).to_primitive(global_object(), Value::PreferredType::Number);
|
||||
if (vm().exception())
|
||||
auto& vm = this->vm();
|
||||
auto& global_object = this->global_object();
|
||||
|
||||
auto value = vm.argument(0);
|
||||
|
||||
// 2. Let prim be ? ToPrimitive(value, number).
|
||||
auto primitive = value.to_primitive(global_object, Value::PreferredType::Number);
|
||||
if (vm.exception())
|
||||
return {};
|
||||
if (primitive.is_number()) {
|
||||
if (!primitive.is_integral_number()) {
|
||||
vm().throw_exception<RangeError>(global_object(), ErrorType::BigIntIntArgument);
|
||||
return {};
|
||||
}
|
||||
return js_bigint(heap(), Crypto::SignedBigInteger { primitive.as_i32() });
|
||||
}
|
||||
auto* bigint = vm().argument(0).to_bigint(global_object());
|
||||
if (vm().exception())
|
||||
return {};
|
||||
return bigint;
|
||||
|
||||
// 3. If Type(prim) is Number, return ? NumberToBigInt(prim).
|
||||
if (primitive.is_number())
|
||||
return number_to_bigint(global_object, primitive);
|
||||
|
||||
// 4. Otherwise, return ? ToBigInt(value).
|
||||
return value.to_bigint(global_object);
|
||||
}
|
||||
|
||||
// 21.2.1.1 BigInt ( value ), https://tc39.es/ecma262/#sec-bigint-constructor-number-value
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue