LibJS: Call Array.prototype.find() 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:08:01 +01:00 committed by Andreas Kling
parent ad8abce8a5
commit 823cc7bc1c
Notes: sideshowbarker 2024-07-19 07:13:05 +09:00
3 changed files with 27 additions and 7 deletions

View file

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

View file

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

View file

@ -9,7 +9,7 @@ try {
callbackCalled++;
a.pop();
});
assert(callbackCalled === 3);
assert(callbackCalled === 5);
callbackCalled = 0;
a = [1, 2, 3, 4, 5];