summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibJS/Runtime/BigIntConstructor.cpp
diff options
context:
space:
mode:
authorLinus Groh <mail@linusgroh.de>2021-07-08 00:30:56 +0100
committerLinus Groh <mail@linusgroh.de>2021-07-08 01:25:49 +0100
commitcc64efac44e471a997fea8d0822a54c89f1f6b72 (patch)
treec57a809e2214baa702e184e2a8edce80ffe76d4a /Userland/Libraries/LibJS/Runtime/BigIntConstructor.cpp
parent3e8574a9a814196e0bc694b9ada1b06314bbff67 (diff)
downloadserenity-cc64efac44e471a997fea8d0822a54c89f1f6b72.zip
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.
Diffstat (limited to 'Userland/Libraries/LibJS/Runtime/BigIntConstructor.cpp')
-rw-r--r--Userland/Libraries/LibJS/Runtime/BigIntConstructor.cpp32
1 files changed, 17 insertions, 15 deletions
diff --git a/Userland/Libraries/LibJS/Runtime/BigIntConstructor.cpp b/Userland/Libraries/LibJS/Runtime/BigIntConstructor.cpp
index 19e644186c..dd83b83cf7 100644
--- a/Userland/Libraries/LibJS/Runtime/BigIntConstructor.cpp
+++ b/Userland/Libraries/LibJS/Runtime/BigIntConstructor.cpp
@@ -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())
- 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())
+ 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 {};
- 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