Ver código fonte

LibJS: Support multiple arguments in Array.prototype.push()

Linus Groh 5 anos atrás
pai
commit
5da1a40ccf

+ 4 - 5
Libraries/LibJS/Runtime/ArrayPrototype.cpp

@@ -37,9 +37,9 @@ namespace JS {
 
 ArrayPrototype::ArrayPrototype()
 {
-    put_native_function("shift", shift);
-    put_native_function("pop", pop);
+    put_native_function("pop", pop, 0);
     put_native_function("push", push, 1);
+    put_native_function("shift", shift, 0);
     put_native_function("toString", to_string, 0);
     put("length", Value(0));
 }
@@ -65,9 +65,8 @@ Value ArrayPrototype::push(Interpreter& interpreter)
     auto* array = array_from(interpreter);
     if (!array)
         return {};
-    if (!interpreter.argument_count())
-        return js_undefined();
-    array->elements().append(interpreter.argument(0));
+    for (size_t i = 0; i < interpreter.argument_count(); ++i)
+        array->elements().append(interpreter.argument(i));
     return Value(array->length());
 }
 

+ 1 - 1
Libraries/LibJS/Runtime/ArrayPrototype.h

@@ -38,9 +38,9 @@ public:
 private:
     virtual const char* class_name() const override { return "ArrayPrototype"; }
 
+    static Value pop(Interpreter&);
     static Value push(Interpreter&);
     static Value shift(Interpreter&);
-    static Value pop(Interpreter&);
     static Value to_string(Interpreter&);
 };
 

+ 30 - 0
Libraries/LibJS/Tests/Array.prototype.push.js

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