diff --git a/Userland/Libraries/LibJS/Runtime/ArrayPrototype.cpp b/Userland/Libraries/LibJS/Runtime/ArrayPrototype.cpp index 378657b773..595571d801 100644 --- a/Userland/Libraries/LibJS/Runtime/ArrayPrototype.cpp +++ b/Userland/Libraries/LibJS/Runtime/ArrayPrototype.cpp @@ -531,7 +531,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::concat) if (!spreadable.is_undefined()) return spreadable.to_boolean(); - return object->is_array(); + return val.is_array(global_object); }; auto append_to_new_array = [&vm, &is_concat_spreadable, &new_array, &global_object, &n](Value arg) { @@ -546,7 +546,7 @@ JS_DEFINE_NATIVE_FUNCTION(ArrayPrototype::concat) if (vm.exception()) return; - if (length + k > MAX_ARRAY_LIKE_INDEX) { + if (n + length > MAX_ARRAY_LIKE_INDEX) { vm.throw_exception(global_object, ErrorType::ArrayMaxSize); return; } diff --git a/Userland/Libraries/LibJS/Tests/builtins/Array/Array.prototype.concat.js b/Userland/Libraries/LibJS/Tests/builtins/Array/Array.prototype.concat.js index c19b0ec13f..1681dab46c 100644 --- a/Userland/Libraries/LibJS/Tests/builtins/Array/Array.prototype.concat.js +++ b/Userland/Libraries/LibJS/Tests/builtins/Array/Array.prototype.concat.js @@ -40,4 +40,14 @@ describe("normal behavior", () => { expect(concatenated[4]).toBe(1); expect(concatenated[5]).toEqual([2, 3]); }); + + test("Proxy is concatenated as array", () => { + var proxy = new Proxy([9, 8], {}); + var concatenated = array.concat(proxy); + expect(array).toHaveLength(1); + expect(concatenated).toHaveLength(3); + expect(concatenated[0]).toBe("hello"); + expect(concatenated[1]).toBe(9); + expect(concatenated[2]).toBe(8); + }); });