diff --git a/Libraries/LibJS/Runtime/ArrayPrototype.cpp b/Libraries/LibJS/Runtime/ArrayPrototype.cpp index fbae593b4d..5bafc64720 100644 --- a/Libraries/LibJS/Runtime/ArrayPrototype.cpp +++ b/Libraries/LibJS/Runtime/ArrayPrototype.cpp @@ -526,32 +526,32 @@ Value ArrayPrototype::reverse(Interpreter& interpreter) Value ArrayPrototype::last_index_of(Interpreter& interpreter) { - auto* array = array_from(interpreter); - if (!array) + auto* this_object = interpreter.this_value().to_object(interpreter); + if (!this_object) return {}; - - i32 array_size = static_cast(array->elements().size()); - if (array_size == 0) + i32 length = get_length(interpreter, *this_object); + if (interpreter.exception()) + return {}; + if (length == 0) return Value(-1); - - i32 from_index = array_size - 1; + i32 from_index = length - 1; if (interpreter.argument_count() >= 2) { from_index = interpreter.argument(1).to_i32(interpreter); if (interpreter.exception()) return {}; if (from_index >= 0) - from_index = min(from_index, array_size - 1); + from_index = min(from_index, length - 1); else - from_index = array_size + from_index; + from_index = length + from_index; } - auto search_element = interpreter.argument(0); for (i32 i = from_index; i >= 0; --i) { - auto& element = array->elements().at(i); + auto element = this_object->get_by_index(i); + if (interpreter.exception()) + return {}; if (strict_eq(interpreter, element, search_element)) return Value(i); } - return Value(-1); } diff --git a/Libraries/LibJS/Tests/Array.prototype-generic-functions.js b/Libraries/LibJS/Tests/Array.prototype-generic-functions.js index 7ad699c33a..0fee4adcf3 100644 --- a/Libraries/LibJS/Tests/Array.prototype-generic-functions.js +++ b/Libraries/LibJS/Tests/Array.prototype-generic-functions.js @@ -52,6 +52,16 @@ try { assert(Array.prototype.indexOf.call({ length: 5, 2: "foo", 4: "foo" }, "foo", 3) === 4); } + { + assert(Array.prototype.lastIndexOf.call({}) === -1); + assert(Array.prototype.lastIndexOf.call({ 0: undefined }) === -1); + assert(Array.prototype.lastIndexOf.call({ length: 1, 0: undefined }) === 0); + assert(Array.prototype.lastIndexOf.call({ length: 1, 2: "foo" }, "foo") === -1); + assert(Array.prototype.lastIndexOf.call({ length: 5, 2: "foo" }, "foo") === 2); + assert(Array.prototype.lastIndexOf.call({ length: 5, 2: "foo", 4: "foo" }, "foo") === 4); + assert(Array.prototype.lastIndexOf.call({ length: 5, 2: "foo", 4: "foo" }, "foo", -2) === 2); + } + const o = { length: 5, 0: "foo", 1: "bar", 3: "baz" }; {