summaryrefslogtreecommitdiff
path: root/Userland
diff options
context:
space:
mode:
authorLinus Groh <mail@linusgroh.de>2021-06-06 23:25:33 +0100
committerLinus Groh <mail@linusgroh.de>2021-06-06 23:25:33 +0100
commit1c906b07a4d3a3b70f255fda2348d507ec123df8 (patch)
tree09349a87bf656b384caf37d7f12017181db6e5ff /Userland
parente7bfd34ea722a3aef2d3d099b1e3b36d261059d4 (diff)
downloadserenity-1c906b07a4d3a3b70f255fda2348d507ec123df8.zip
LibJS: Add length parameter to Array::create()
This is now a bit closer to the spec's 10.4.2.2 ArrayCreate - it will throw a RangeError if the requested length exceeds 2^32 - 1, so anyone passing in a custom value (defaults to zero for same behaviour as before) will need an exception check at the call site.
Diffstat (limited to 'Userland')
-rw-r--r--Userland/Libraries/LibJS/Runtime/Array.cpp13
-rw-r--r--Userland/Libraries/LibJS/Runtime/Array.h2
2 files changed, 12 insertions, 3 deletions
diff --git a/Userland/Libraries/LibJS/Runtime/Array.cpp b/Userland/Libraries/LibJS/Runtime/Array.cpp
index 1fc8a89954..d8ab3b4236 100644
--- a/Userland/Libraries/LibJS/Runtime/Array.cpp
+++ b/Userland/Libraries/LibJS/Runtime/Array.cpp
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
+ * Copyright (c) 2020-2021, Linus Groh <linusg@serenityos.org>
*
* SPDX-License-Identifier: BSD-2-Clause
*/
@@ -11,9 +12,17 @@
namespace JS {
-Array* Array::create(GlobalObject& global_object)
+// 10.4.2.2 ArrayCreate, https://tc39.es/ecma262/#sec-arraycreate
+Array* Array::create(GlobalObject& global_object, size_t length)
{
- return global_object.heap().allocate<Array>(global_object, *global_object.array_prototype());
+ if (length > NumericLimits<u32>::max()) {
+ auto& vm = global_object.vm();
+ vm.throw_exception<RangeError>(global_object, ErrorType::InvalidLength, "array");
+ return nullptr;
+ }
+ auto* array = global_object.heap().allocate<Array>(global_object, *global_object.array_prototype());
+ array->indexed_properties().set_array_like_size(length);
+ return array;
}
// 7.3.17 CreateArrayFromList, https://tc39.es/ecma262/#sec-createarrayfromlist
diff --git a/Userland/Libraries/LibJS/Runtime/Array.h b/Userland/Libraries/LibJS/Runtime/Array.h
index 58b4b19c8b..ea204a02bb 100644
--- a/Userland/Libraries/LibJS/Runtime/Array.h
+++ b/Userland/Libraries/LibJS/Runtime/Array.h
@@ -14,7 +14,7 @@ class Array : public Object {
JS_OBJECT(Array, Object);
public:
- static Array* create(GlobalObject&);
+ static Array* create(GlobalObject&, size_t length = 0);
static Array* create_from(GlobalObject&, const Vector<Value>&);
explicit Array(Object& prototype);