summaryrefslogtreecommitdiff
path: root/Libraries/LibJS/Runtime/ArrayConstructor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Libraries/LibJS/Runtime/ArrayConstructor.cpp')
-rw-r--r--Libraries/LibJS/Runtime/ArrayConstructor.cpp17
1 files changed, 13 insertions, 4 deletions
diff --git a/Libraries/LibJS/Runtime/ArrayConstructor.cpp b/Libraries/LibJS/Runtime/ArrayConstructor.cpp
index 65da8387c6..cab2a3f755 100644
--- a/Libraries/LibJS/Runtime/ArrayConstructor.cpp
+++ b/Libraries/LibJS/Runtime/ArrayConstructor.cpp
@@ -1,5 +1,6 @@
/*
* Copyright (c) 2020, Andreas Kling <kling@serenityos.org>
+ * Copyright (c) 2020, Linus Groh <mail@linusgroh.de>
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
@@ -29,6 +30,7 @@
#include <LibJS/Interpreter.h>
#include <LibJS/Runtime/Array.h>
#include <LibJS/Runtime/ArrayConstructor.h>
+#include <LibJS/Runtime/Error.h>
#include <LibJS/Runtime/GlobalObject.h>
#include <LibJS/Runtime/Shape.h>
@@ -50,14 +52,21 @@ Value ArrayConstructor::call(Interpreter& interpreter)
if (interpreter.argument_count() <= 0)
return Array::create(interpreter.global_object());
- if (interpreter.argument_count() == 1) {
+ if (interpreter.argument_count() == 1 && interpreter.argument(0).is_number()) {
+ auto array_length_value = interpreter.argument(0);
+ if (!array_length_value.is_integer() || array_length_value.to_i32() < 0) {
+ interpreter.throw_exception<TypeError>("Invalid array length");
+ return {};
+ }
auto* array = Array::create(interpreter.global_object());
- array->elements().resize(interpreter.argument(0).to_i32());
+ array->elements().resize(array_length_value.to_i32());
return array;
}
- // FIXME: Handle "new Array(element0, element1, ...)"
- ASSERT_NOT_REACHED();
+ auto* array = Array::create(interpreter.global_object());
+ for (size_t i = 0; i < interpreter.argument_count(); ++i)
+ array->elements().append(interpreter.argument(i));
+ return array;
}
Value ArrayConstructor::construct(Interpreter& interpreter)