1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 05:27:46 +00:00

LibJS: Call Array.prototype.findIndex() callback for empty elements

If the array value at the current index is empty, the callback will
be called with undefined as value.
This commit is contained in:
Linus Groh 2020-04-28 18:10:40 +01:00 committed by Andreas Kling
parent 823cc7bc1c
commit 3152559422
3 changed files with 27 additions and 7 deletions

View file

@ -489,12 +489,12 @@ Value ArrayPrototype::find_index(Interpreter& interpreter)
auto array_size = array->elements().size(); auto array_size = array->elements().size();
for (size_t i = 0; i < array_size; ++i) { for (size_t i = 0; i < array_size; ++i) {
if (i >= array->elements().size()) auto value = js_undefined();
break; if (i < array->elements().size()) {
value = array->elements().at(i);
auto value = array->elements().at(i); if (value.is_empty())
if (value.is_empty()) value = js_undefined();
continue; }
MarkedValueList arguments(interpreter.heap()); MarkedValueList arguments(interpreter.heap());
arguments.append(value); arguments.append(value);

View file

@ -23,6 +23,26 @@ try {
assert(array.findIndex(value => value > 100) === -1); assert(array.findIndex(value => value > 100) === -1);
assert([].findIndex(value => value === 1) === -1); assert([].findIndex(value => value === 1) === -1);
var callbackCalled = 0;
var callback = () => { callbackCalled++; };
[].findIndex(callback)
assert(callbackCalled === 0);
[1, 2, 3].findIndex(callback);
assert(callbackCalled === 3);
callbackCalled = 0;
[1, , , "foo", , undefined, , ,].findIndex(callback);
assert(callbackCalled === 8);
callbackCalled = 0;
[1, , , "foo", , undefined, , ,].findIndex(value => {
callbackCalled++;
return value === undefined;
});
assert(callbackCalled === 2);
console.log("PASS"); console.log("PASS");
} catch (e) { } catch (e) {
console.log("FAIL: " + e); console.log("FAIL: " + e);

View file

@ -17,7 +17,7 @@ try {
callbackCalled++; callbackCalled++;
a.pop(); a.pop();
}); });
assert(callbackCalled === 3); assert(callbackCalled === 5);
console.log("PASS"); console.log("PASS");
} catch (e) { } catch (e) {