LibJS: Add Array.prototype.unshift()

This commit is contained in:
Linus Groh 2020-04-13 16:46:27 +01:00 committed by Andreas Kling
parent 5da1a40ccf
commit 29253bf932
Notes: sideshowbarker 2024-07-19 07:36:28 +09:00
3 changed files with 42 additions and 0 deletions

View file

@ -41,6 +41,7 @@ ArrayPrototype::ArrayPrototype()
put_native_function("push", push, 1);
put_native_function("shift", shift, 0);
put_native_function("toString", to_string, 0);
put_native_function("unshift", unshift, 1);
put("length", Value(0));
}
@ -70,6 +71,16 @@ Value ArrayPrototype::push(Interpreter& interpreter)
return Value(array->length());
}
Value ArrayPrototype::unshift(Interpreter& interpreter)
{
auto* array = array_from(interpreter);
if (!array)
return {};
for (size_t i = 0; i < interpreter.argument_count(); ++i)
array->elements().insert(i, interpreter.argument(i));
return Value(array->length());
}
Value ArrayPrototype::pop(Interpreter& interpreter)
{
auto* array = array_from(interpreter);

View file

@ -42,6 +42,7 @@ private:
static Value push(Interpreter&);
static Value shift(Interpreter&);
static Value to_string(Interpreter&);
static Value unshift(Interpreter&);
};
}

View file

@ -0,0 +1,30 @@
load("test-common.js");
try {
assert(Array.prototype.unshift.length === 1);
var a = ["hello"];
var length = a.unshift();
assert(length === 1);
assert(a.length === 1);
assert(a[0] === "hello");
length = a.unshift("friends");
assert(length === 2);
assert(a.length === 2);
assert(a[0] === "friends");
assert(a[1] === "hello");
length = a.unshift(1, 2, 3);
assert(length === 5);
assert(a.length === 5);
assert(a[0] === 1);
assert(a[1] === 2);
assert(a[2] === 3);
assert(a[3] === "friends");
assert(a[4] === "hello");
console.log("PASS");
} catch (e) {
console.log("FAIL: " + e);
}