summaryrefslogtreecommitdiff
path: root/Libraries/LibJS
diff options
context:
space:
mode:
authorLinus Groh <mail@linusgroh.de>2020-03-28 21:02:45 +0000
committerAndreas Kling <kling@serenityos.org>2020-03-28 22:18:11 +0100
commitc209ea1985087ac135cbbd40635de13d5cf701c6 (patch)
tree20f65d460922d1fa55b7d33569390f11143c1e21 /Libraries/LibJS
parentc5cf740830e6c89c8845eab70b7767a84fca8666 (diff)
downloadserenity-c209ea1985087ac135cbbd40635de13d5cf701c6.zip
LibJS: Implement Array.prototype.{shift,pop}
Diffstat (limited to 'Libraries/LibJS')
-rw-r--r--Libraries/LibJS/Runtime/Array.cpp15
-rw-r--r--Libraries/LibJS/Runtime/Array.h2
-rw-r--r--Libraries/LibJS/Runtime/ArrayPrototype.cpp12
-rw-r--r--Libraries/LibJS/Tests/Array.prototype.pop.js19
-rw-r--r--Libraries/LibJS/Tests/Array.prototype.shift.js19
5 files changed, 66 insertions, 1 deletions
diff --git a/Libraries/LibJS/Runtime/Array.cpp b/Libraries/LibJS/Runtime/Array.cpp
index df048c2389..6d3149f423 100644
--- a/Libraries/LibJS/Runtime/Array.cpp
+++ b/Libraries/LibJS/Runtime/Array.cpp
@@ -47,6 +47,20 @@ Array::~Array()
{
}
+Value Array::shift()
+{
+ if (m_elements.size() == 0)
+ return js_undefined();
+ return Value(m_elements.take_first());
+}
+
+Value Array::pop()
+{
+ if (m_elements.size() == 0)
+ return js_undefined();
+ return Value(m_elements.take_last());
+}
+
void Array::push(Value value)
{
m_elements.append(value);
@@ -82,5 +96,4 @@ bool Array::put_own_property(Object& this_object, const FlyString& property_name
}
return Object::put_own_property(this_object, property_name, value);
}
-
}
diff --git a/Libraries/LibJS/Runtime/Array.h b/Libraries/LibJS/Runtime/Array.h
index 4e9a56abae..e43e845526 100644
--- a/Libraries/LibJS/Runtime/Array.h
+++ b/Libraries/LibJS/Runtime/Array.h
@@ -39,6 +39,8 @@ public:
const Vector<Value>& elements() const { return m_elements; }
Vector<Value>& elements() { return m_elements; }
+ Value shift();
+ Value pop();
void push(Value);
private:
diff --git a/Libraries/LibJS/Runtime/ArrayPrototype.cpp b/Libraries/LibJS/Runtime/ArrayPrototype.cpp
index 2aed718142..996d28096d 100644
--- a/Libraries/LibJS/Runtime/ArrayPrototype.cpp
+++ b/Libraries/LibJS/Runtime/ArrayPrototype.cpp
@@ -35,6 +35,18 @@ namespace JS {
ArrayPrototype::ArrayPrototype()
{
+ put_native_function("shift", [](Object* this_object, const Vector<Value>&) -> Value {
+ ASSERT(this_object);
+ ASSERT(this_object->is_array());
+ return static_cast<Array*>(this_object)->shift();
+ });
+
+ put_native_function("pop", [](Object* this_object, const Vector<Value>&) -> Value {
+ ASSERT(this_object);
+ ASSERT(this_object->is_array());
+ return static_cast<Array*>(this_object)->pop();
+ });
+
put_native_function("push", [](Object* this_object, const Vector<Value>& arguments) -> Value {
if (arguments.is_empty())
return js_undefined();
diff --git a/Libraries/LibJS/Tests/Array.prototype.pop.js b/Libraries/LibJS/Tests/Array.prototype.pop.js
new file mode 100644
index 0000000000..4cb895f5ab
--- /dev/null
+++ b/Libraries/LibJS/Tests/Array.prototype.pop.js
@@ -0,0 +1,19 @@
+function assert(x) { if (!x) throw 1; }
+
+try {
+ var a = [1, 2, 3];
+ var value = a.pop();
+ assert(value === 3);
+ assert(a.length === 2);
+ assert(a[0] === 1);
+ assert(a[1] === 2);
+
+ var a = [];
+ var value = a.pop();
+ assert(value === undefined);
+ assert(a.length === 0);
+
+ console.log("PASS");
+} catch (e) {
+ console.log("FAIL: " + e);
+}
diff --git a/Libraries/LibJS/Tests/Array.prototype.shift.js b/Libraries/LibJS/Tests/Array.prototype.shift.js
new file mode 100644
index 0000000000..1494556299
--- /dev/null
+++ b/Libraries/LibJS/Tests/Array.prototype.shift.js
@@ -0,0 +1,19 @@
+function assert(x) { if (!x) throw 1; }
+
+try {
+ var a = [1, 2, 3];
+ var value = a.shift();
+ assert(value === 1);
+ assert(a.length === 2);
+ assert(a[0] === 2);
+ assert(a[1] === 3);
+
+ var a = [];
+ var value = a.shift();
+ assert(value === undefined);
+ assert(a.length === 0);
+
+ console.log("PASS");
+} catch (e) {
+ console.log("FAIL: " + e);
+}