From 01fd6ce04582e9714d592a3bcb9825792cca81dc Mon Sep 17 00:00:00 2001 From: Linus Groh Date: Fri, 8 May 2020 16:23:56 +0100 Subject: LibJS: Support multiple arguments in Array constructor --- Libraries/LibJS/Runtime/ArrayConstructor.cpp | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) (limited to 'Libraries/LibJS/Runtime/ArrayConstructor.cpp') 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 + * Copyright (c) 2020, Linus Groh * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,6 +30,7 @@ #include #include #include +#include #include #include @@ -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("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) -- cgit v1.2.3