Implement Array.prototype.map/filter correctly
authorLars Knoll <lars.knoll@digia.com>
Thu, 17 Jan 2013 20:58:24 +0000 (21:58 +0100)
committerSimon Hausmann <simon.hausmann@digia.com>
Thu, 17 Jan 2013 21:41:44 +0000 (22:41 +0100)
Fixes another 260 test cases.

Change-Id: I4f6299119c1859dced1fd2f50c3e5d7f0ed133ed
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
qv4ecmaobjects.cpp
tests/TestExpectations

index da16f7c..fc4cd92 100644 (file)
@@ -2076,49 +2076,64 @@ Value ArrayPrototype::method_forEach(ExecutionContext *ctx)
 
 Value ArrayPrototype::method_map(ExecutionContext *ctx)
 {
-    ArrayObject *instance = ctx->thisObject.asArrayObject();
-    if (!instance)
-        ctx->throwUnimplemented(QStringLiteral("Array.prototype.map"));
+    Object *instance = __qmljs_to_object(ctx->thisObject, ctx).objectValue();
+
+    uint len = getLength(ctx, instance);
+
+    FunctionObject *callback = ctx->argument(0).asFunctionObject();
+    if (!callback)
+        __qmljs_throw_type_error(ctx);
 
-    Value callback = ctx->argument(0);
     Value thisArg = ctx->argument(1);
-    ArrayObject *a = ctx->engine->newArrayObject(ctx)->asArrayObject();
-    a->array.setLengthUnchecked(instance->array.length());
-    for (quint32 k = 0; k < instance->array.length(); ++k) {
-        Value v = instance->__get__(ctx, k);
-        if (v.isUndefined())
+
+    ArrayObject *a = ctx->engine->newArrayObject(ctx);
+    a->array.setLength(len);
+
+    for (uint k = 0; k < len; ++k) {
+        bool exists;
+        Value v = instance->__get__(ctx, k, &exists);
+        if (!exists)
             continue;
+
         Value args[3];
         args[0] = v;
         args[1] = Value::fromDouble(k);
         args[2] = ctx->thisObject;
-        Value r = __qmljs_call_value(ctx, thisArg, callback, args, 3);
-        a->array.set(k, r);
+        Value mapped = callback->call(ctx, thisArg, args, 3);
+        a->array.set(k, mapped);
     }
     return Value::fromObject(a);
 }
 
 Value ArrayPrototype::method_filter(ExecutionContext *ctx)
 {
-    ArrayObject *instance = ctx->thisObject.asArrayObject();
-    if (!instance)
-        ctx->throwUnimplemented(QStringLiteral("Array.prototype.filter"));
+    Object *instance = __qmljs_to_object(ctx->thisObject, ctx).objectValue();
+
+    uint len = getLength(ctx, instance);
+
+    FunctionObject *callback = ctx->argument(0).asFunctionObject();
+    if (!callback)
+        __qmljs_throw_type_error(ctx);
 
-    Value callback = ctx->argument(0);
     Value thisArg = ctx->argument(1);
-    ArrayObject *a = ctx->engine->newArrayObject(ctx)->asArrayObject();
-    for (quint32 k = 0; k < instance->array.length(); ++k) {
-        Value v = instance->__get__(ctx, k);
-        if (v.isUndefined())
+
+    ArrayObject *a = ctx->engine->newArrayObject(ctx);
+
+    uint to = 0;
+    for (uint k = 0; k < len; ++k) {
+        bool exists;
+        Value v = instance->__get__(ctx, k, &exists);
+        if (!exists)
             continue;
+
         Value args[3];
         args[0] = v;
         args[1] = Value::fromDouble(k);
         args[2] = ctx->thisObject;
-        Value r = __qmljs_call_value(ctx, thisArg, callback, args, 3);
-        if (__qmljs_to_boolean(r, ctx)) {
-            const uint index = a->array.length();
-            a->array.set(index, v);
+        Value selected = callback->call(ctx, thisArg, args, 3);
+        if (__qmljs_to_boolean(selected, ctx)) {
+            a->array.set(to, v);
+            ++to;
         }
     }
     return Value::fromObject(a);
index c60b3ac..2591b7c 100644 (file)
@@ -729,258 +729,14 @@ S15.4.4.13_A4_T2 failing
 15.4.4.18-1-10 failing
 15.4.4.18-1-13 failing
 15.4.4.18-5-17 failing
-15.4.4.19-1-1 failing
 15.4.4.19-1-10 failing
-15.4.4.19-1-11 failing
-15.4.4.19-1-12 failing
 15.4.4.19-1-13 failing
-15.4.4.19-1-14 failing
-15.4.4.19-1-15 failing
-15.4.4.19-1-2 failing
-15.4.4.19-1-3 failing
-15.4.4.19-1-4 failing
-15.4.4.19-1-5 failing
-15.4.4.19-1-6 failing
-15.4.4.19-1-7 failing
-15.4.4.19-1-8 failing
-15.4.4.19-1-9 failing
-15.4.4.19-2-1 failing
-15.4.4.19-2-10 failing
-15.4.4.19-2-11 failing
-15.4.4.19-2-12 failing
-15.4.4.19-2-13 failing
-15.4.4.19-2-14 failing
-15.4.4.19-2-15 failing
-15.4.4.19-2-17 failing
-15.4.4.19-2-18 failing
-15.4.4.19-2-19 failing
-15.4.4.19-2-3 failing
-15.4.4.19-2-5 failing
-15.4.4.19-2-6 failing
-15.4.4.19-2-7 failing
-15.4.4.19-2-8 failing
-15.4.4.19-2-9 failing
-15.4.4.19-3-1 failing
-15.4.4.19-3-10 failing
-15.4.4.19-3-11 failing
-15.4.4.19-3-12 failing
-15.4.4.19-3-13 failing
-15.4.4.19-3-14 failing
-15.4.4.19-3-15 failing
-15.4.4.19-3-16 failing
-15.4.4.19-3-17 failing
-15.4.4.19-3-18 failing
-15.4.4.19-3-19 failing
-15.4.4.19-3-2 failing
-15.4.4.19-3-20 failing
-15.4.4.19-3-21 failing
-15.4.4.19-3-22 failing
-15.4.4.19-3-23 failing
-15.4.4.19-3-24 failing
-15.4.4.19-3-25 failing
-15.4.4.19-3-28 failing
-15.4.4.19-3-29 failing
-15.4.4.19-3-3 failing
-15.4.4.19-3-4 failing
-15.4.4.19-3-5 failing
-15.4.4.19-3-6 failing
-15.4.4.19-3-7 failing
-15.4.4.19-3-8 failing
-15.4.4.19-3-9 failing
-15.4.4.19-4-1 failing
-15.4.4.19-4-15 failing
-15.4.4.19-4-3 failing
-15.4.4.19-4-4 failing
-15.4.4.19-4-5 failing
-15.4.4.19-4-6 failing
-15.4.4.19-4-7 failing
-15.4.4.19-4-8 failing
-15.4.4.19-4-9 failing
 15.4.4.19-5-1 failing
 15.4.4.19-5-17 failing
-15.4.4.19-8-1 failing
-15.4.4.19-8-5 failing
-15.4.4.19-8-8 failing
-15.4.4.19-8-b-10 failing
-15.4.4.19-8-b-12 failing
-15.4.4.19-8-b-15 failing
-15.4.4.19-8-b-2 failing
-15.4.4.19-8-b-3 failing
-15.4.4.19-8-b-4 failing
-15.4.4.19-8-b-6 failing
-15.4.4.19-8-b-8 failing
-15.4.4.19-8-c-i-1 failing
-15.4.4.19-8-c-i-11 failing
-15.4.4.19-8-c-i-13 failing
-15.4.4.19-8-c-i-15 failing
-15.4.4.19-8-c-i-17 failing
-15.4.4.19-8-c-i-18 failing
-15.4.4.19-8-c-i-19 failing
-15.4.4.19-8-c-i-20 failing
-15.4.4.19-8-c-i-21 failing
-15.4.4.19-8-c-i-22 failing
-15.4.4.19-8-c-i-23 failing
-15.4.4.19-8-c-i-25 failing
-15.4.4.19-8-c-i-26 failing
-15.4.4.19-8-c-i-27 failing
-15.4.4.19-8-c-i-29 failing
-15.4.4.19-8-c-i-3 failing
-15.4.4.19-8-c-i-30 failing
-15.4.4.19-8-c-i-5 failing
-15.4.4.19-8-c-i-7 failing
-15.4.4.19-8-c-i-9 failing
-15.4.4.19-8-c-ii-16 failing
-15.4.4.19-8-c-ii-17 failing
-15.4.4.19-8-c-ii-18 failing
-15.4.4.19-8-c-ii-19 failing
-15.4.4.19-8-c-ii-20 failing
-15.4.4.19-8-c-ii-21 failing
-15.4.4.19-8-c-ii-22 failing
-15.4.4.19-8-c-ii-23 failing
-15.4.4.19-8-c-ii-6 failing
-15.4.4.19-8-c-ii-8 failing
-15.4.4.19-8-c-iii-2 failing
-15.4.4.19-8-c-iii-3 failing
-15.4.4.19-8-c-iii-4 failing
-15.4.4.19-8-c-iii-5 failing
-15.4.4.19-9-10 failing
-15.4.4.19-9-11 failing
-15.4.4.19-9-12 failing
-15.4.4.19-9-3 failing
-15.4.4.19-9-5 failing
-15.4.4.19-9-6 failing
-15.4.4.19-9-7 failing
-15.4.4.19-9-8 failing
-15.4.4.19-9-9 failing
-15.4.4.20-1-1 failing
 15.4.4.20-1-10 failing
-15.4.4.20-1-11 failing
-15.4.4.20-1-12 failing
 15.4.4.20-1-13 failing
-15.4.4.20-1-14 failing
-15.4.4.20-1-15 failing
-15.4.4.20-1-2 failing
-15.4.4.20-1-3 failing
-15.4.4.20-1-4 failing
-15.4.4.20-1-5 failing
-15.4.4.20-1-6 failing
-15.4.4.20-1-7 failing
-15.4.4.20-1-8 failing
-15.4.4.20-1-9 failing
-15.4.4.20-10-3 failing
-15.4.4.20-2-1 failing
-15.4.4.20-2-10 failing
-15.4.4.20-2-11 failing
-15.4.4.20-2-12 failing
-15.4.4.20-2-13 failing
-15.4.4.20-2-14 failing
-15.4.4.20-2-15 failing
-15.4.4.20-2-17 failing
-15.4.4.20-2-18 failing
-15.4.4.20-2-19 failing
-15.4.4.20-2-3 failing
-15.4.4.20-2-5 failing
-15.4.4.20-2-6 failing
-15.4.4.20-2-7 failing
-15.4.4.20-2-8 failing
-15.4.4.20-2-9 failing
-15.4.4.20-3-1 failing
-15.4.4.20-3-10 failing
-15.4.4.20-3-11 failing
-15.4.4.20-3-12 failing
-15.4.4.20-3-13 failing
-15.4.4.20-3-14 failing
-15.4.4.20-3-15 failing
-15.4.4.20-3-16 failing
-15.4.4.20-3-17 failing
-15.4.4.20-3-18 failing
-15.4.4.20-3-19 failing
-15.4.4.20-3-2 failing
-15.4.4.20-3-20 failing
-15.4.4.20-3-21 failing
-15.4.4.20-3-22 failing
-15.4.4.20-3-23 failing
-15.4.4.20-3-24 failing
-15.4.4.20-3-25 failing
-15.4.4.20-3-28 failing
-15.4.4.20-3-29 failing
-15.4.4.20-3-3 failing
-15.4.4.20-3-4 failing
-15.4.4.20-3-5 failing
-15.4.4.20-3-6 failing
-15.4.4.20-3-7 failing
-15.4.4.20-3-8 failing
-15.4.4.20-3-9 failing
-15.4.4.20-4-1 failing
-15.4.4.20-4-15 failing
-15.4.4.20-4-3 failing
-15.4.4.20-4-4 failing
-15.4.4.20-4-5 failing
-15.4.4.20-4-6 failing
-15.4.4.20-4-7 failing
-15.4.4.20-4-8 failing
-15.4.4.20-4-9 failing
 15.4.4.20-5-17 failing
-15.4.4.20-6-2 failing
-15.4.4.20-6-3 failing
-15.4.4.20-6-4 failing
-15.4.4.20-6-5 failing
-15.4.4.20-6-6 failing
-15.4.4.20-6-7 failing
-15.4.4.20-6-8 failing
-15.4.4.20-9-1 failing
-15.4.4.20-9-5 failing
-15.4.4.20-9-8 failing
-15.4.4.20-9-9 failing
-15.4.4.20-9-b-10 failing
-15.4.4.20-9-b-12 failing
-15.4.4.20-9-b-15 failing
-15.4.4.20-9-b-2 failing
-15.4.4.20-9-b-3 failing
-15.4.4.20-9-b-4 failing
-15.4.4.20-9-b-6 failing
-15.4.4.20-9-b-8 failing
-15.4.4.20-9-c-i-1 failing
-15.4.4.20-9-c-i-11 failing
-15.4.4.20-9-c-i-13 failing
-15.4.4.20-9-c-i-15 failing
-15.4.4.20-9-c-i-17 failing
-15.4.4.20-9-c-i-18 failing
-15.4.4.20-9-c-i-19 failing
-15.4.4.20-9-c-i-20 failing
-15.4.4.20-9-c-i-21 failing
-15.4.4.20-9-c-i-22 failing
-15.4.4.20-9-c-i-23 failing
-15.4.4.20-9-c-i-25 failing
-15.4.4.20-9-c-i-26 failing
-15.4.4.20-9-c-i-27 failing
-15.4.4.20-9-c-i-29 failing
-15.4.4.20-9-c-i-3 failing
-15.4.4.20-9-c-i-30 failing
-15.4.4.20-9-c-i-5 failing
-15.4.4.20-9-c-i-7 failing
-15.4.4.20-9-c-i-9 failing
-15.4.4.20-9-c-ii-16 failing
-15.4.4.20-9-c-ii-17 failing
-15.4.4.20-9-c-ii-18 failing
-15.4.4.20-9-c-ii-19 failing
-15.4.4.20-9-c-ii-20 failing
-15.4.4.20-9-c-ii-21 failing
-15.4.4.20-9-c-ii-22 failing
-15.4.4.20-9-c-ii-23 failing
-15.4.4.20-9-c-ii-6 failing
-15.4.4.20-9-c-ii-7 failing
-15.4.4.20-9-c-ii-8 failing
-15.4.4.20-9-c-iii-1-1 failing
-15.4.4.20-9-c-iii-1-2 failing
-15.4.4.20-9-c-iii-1-3 failing
-15.4.4.20-9-c-iii-1-4 failing
-15.4.4.20-9-c-iii-2 failing
 15.4.4.20-9-c-iii-24 failing
-15.4.4.20-9-c-iii-29 failing
-15.4.4.20-9-c-iii-3 failing
-15.4.4.20-9-c-iii-4 failing
-15.4.4.20-9-c-iii-5 failing
 15.4.4.21-1-1 failing
 15.4.4.21-1-10 failing
 15.4.4.21-1-11 failing
@@ -1956,7 +1712,5 @@ S15.4.4.13_A1_T2 failing
 15.4.4.17-7-c-i-6 failing
 
 # Regressions introduced with https://codereview.qt-project.org/#change,45044
-15.4.4.19-8-b-1 failing
-15.4.4.20-9-b-1 failing
 15.4.4.21-8-b-iii-1-6 failing
-15.4.4.22-9-9 failing
+15.4.4.22-9-9 failing
\ No newline at end of file