Implement Array.prototype.reduce/reduceRight
authorLars Knoll <lars.knoll@digia.com>
Thu, 17 Jan 2013 21:22:39 +0000 (22:22 +0100)
committerSimon Hausmann <simon.hausmann@digia.com>
Thu, 17 Jan 2013 21:42:52 +0000 (22:42 +0100)
This fixes another 380 test cases

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

index fc4cd92..0ef0d2a 100644 (file)
@@ -2141,60 +2141,90 @@ Value ArrayPrototype::method_filter(ExecutionContext *ctx)
 
 Value ArrayPrototype::method_reduce(ExecutionContext *ctx)
 {
-    ArrayObject *instance = ctx->thisObject.asArrayObject();
-    if (!instance)
-        ctx->throwUnimplemented(QStringLiteral("Array.prototype.reduce"));
-
-    Value callback = ctx->argument(0);
-    Value initialValue = ctx->argument(1);
-    Value acc = initialValue;
-    for (quint32 k = 0; k < instance->array.length(); ++k) {
-        Value v = instance->__get__(ctx, k);
-        if (v.isUndefined())
-            continue;
+    Object *instance = __qmljs_to_object(ctx->thisObject, ctx).objectValue();
 
-        if (acc.isUndefined()) {
-            acc = v;
-            continue;
+    uint len = getLength(ctx, instance);
+
+    FunctionObject *callback = ctx->argument(0).asFunctionObject();
+    if (!callback)
+        __qmljs_throw_type_error(ctx);
+
+    uint k = 0;
+    Value acc;
+    if (ctx->argumentCount > 1) {
+        acc = ctx->argument(1);
+    } else {
+        bool kPresent = false;
+        while (k < len && !kPresent) {
+            Value v = instance->__get__(ctx, k, &kPresent);
+            if (kPresent)
+                acc = v;
+            ++k;
         }
+        if (!kPresent)
+            __qmljs_throw_type_error(ctx);
+    }
 
-        Value args[4];
-        args[0] = acc;
-        args[1] = v;
-        args[2] = Value::fromDouble(k);
-        args[3] = ctx->thisObject;
-        Value r = __qmljs_call_value(ctx, Value::undefinedValue(), callback, args, 4);
-        acc = r;
+    while (k < len) {
+        bool kPresent;
+        Value v = instance->__get__(ctx, k, &kPresent);
+        if (kPresent) {
+            Value args[4];
+            args[0] = acc;
+            args[1] = v;
+            args[2] = Value::fromDouble(k);
+            args[3] = ctx->thisObject;
+            acc = callback->call(ctx, Value::undefinedValue(), args, 4);
+        }
+        ++k;
     }
     return acc;
 }
 
 Value ArrayPrototype::method_reduceRight(ExecutionContext *ctx)
 {
-    ArrayObject *instance = ctx->thisObject.asArrayObject();
-    if (!instance)
-        ctx->throwUnimplemented(QStringLiteral("Array.prototype.reduceRight"));
-
-    Value callback = ctx->argument(0);
-    Value initialValue = ctx->argument(1);
-    Value acc = initialValue;
-    for (int k = instance->array.length() - 1; k != -1; --k) {
-        Value v = instance->__get__(ctx, k);
-        if (v.isUndefined())
-            continue;
+    Object *instance = __qmljs_to_object(ctx->thisObject, ctx).objectValue();
 
-        if (acc.isUndefined()) {
-            acc = v;
-            continue;
+    uint len = getLength(ctx, instance);
+
+    FunctionObject *callback = ctx->argument(0).asFunctionObject();
+    if (!callback)
+        __qmljs_throw_type_error(ctx);
+
+    if (len == 0) {
+        if (ctx->argumentCount == 1)
+            __qmljs_throw_type_error(ctx);
+        return ctx->argument(1);
+    }
+
+    uint k = len;
+    Value acc;
+    if (ctx->argumentCount > 1) {
+        acc = ctx->argument(1);
+    } else {
+        bool kPresent = false;
+        while (k > 0 && !kPresent) {
+            Value v = instance->__get__(ctx, k - 1, &kPresent);
+            if (kPresent)
+                acc = v;
+            --k;
         }
+        if (!kPresent)
+            __qmljs_throw_type_error(ctx);
+    }
 
-        Value args[4];
-        args[0] = acc;
-        args[1] = v;
-        args[2] = Value::fromDouble(k);
-        args[3] = ctx->thisObject;
-        Value r = __qmljs_call_value(ctx, Value::undefinedValue(), callback, args, 4);
-        acc = r;
+    while (k > 0) {
+        bool kPresent;
+        Value v = instance->__get__(ctx, k - 1, &kPresent);
+        if (kPresent) {
+            Value args[4];
+            args[0] = acc;
+            args[1] = v;
+            args[2] = Value::fromDouble(k - 1);
+            args[3] = ctx->thisObject;
+            acc = callback->call(ctx, Value::undefinedValue(), args, 4);
+        }
+        --k;
     }
     return acc;
 }
index 2591b7c..7f29ea9 100644 (file)
@@ -737,391 +737,14 @@ S15.4.4.13_A4_T2 failing
 15.4.4.20-1-13 failing
 15.4.4.20-5-17 failing
 15.4.4.20-9-c-iii-24 failing
-15.4.4.21-1-1 failing
 15.4.4.21-1-10 failing
-15.4.4.21-1-11 failing
-15.4.4.21-1-12 failing
 15.4.4.21-1-13 failing
-15.4.4.21-1-14 failing
-15.4.4.21-1-15 failing
-15.4.4.21-1-2 failing
-15.4.4.21-1-3 failing
-15.4.4.21-1-4 failing
-15.4.4.21-1-5 failing
-15.4.4.21-1-6 failing
-15.4.4.21-1-7 failing
-15.4.4.21-1-8 failing
-15.4.4.21-1-9 failing
-15.4.4.21-10-3 failing
-15.4.4.21-10-4 failing
-15.4.4.21-10-6 failing
-15.4.4.21-10-7 failing
-15.4.4.21-2-1 failing
-15.4.4.21-2-10 failing
-15.4.4.21-2-11 failing
-15.4.4.21-2-12 failing
-15.4.4.21-2-13 failing
-15.4.4.21-2-14 failing
-15.4.4.21-2-15 failing
-15.4.4.21-2-17 failing
-15.4.4.21-2-18 failing
-15.4.4.21-2-19 failing
-15.4.4.21-2-3 failing
-15.4.4.21-2-5 failing
-15.4.4.21-2-6 failing
-15.4.4.21-2-7 failing
-15.4.4.21-2-8 failing
-15.4.4.21-2-9 failing
-15.4.4.21-3-1 failing
-15.4.4.21-3-10 failing
-15.4.4.21-3-11 failing
-15.4.4.21-3-12 failing
-15.4.4.21-3-13 failing
-15.4.4.21-3-14 failing
-15.4.4.21-3-15 failing
-15.4.4.21-3-16 failing
-15.4.4.21-3-17 failing
-15.4.4.21-3-18 failing
-15.4.4.21-3-19 failing
-15.4.4.21-3-2 failing
-15.4.4.21-3-20 failing
-15.4.4.21-3-21 failing
-15.4.4.21-3-22 failing
-15.4.4.21-3-23 failing
-15.4.4.21-3-24 failing
-15.4.4.21-3-25 failing
-15.4.4.21-3-28 failing
-15.4.4.21-3-29 failing
-15.4.4.21-3-3 failing
-15.4.4.21-3-4 failing
-15.4.4.21-3-5 failing
-15.4.4.21-3-6 failing
-15.4.4.21-3-7 failing
-15.4.4.21-3-8 failing
-15.4.4.21-3-9 failing
-15.4.4.21-4-1 failing
-15.4.4.21-4-15 failing
-15.4.4.21-4-3 failing
-15.4.4.21-4-4 failing
-15.4.4.21-4-5 failing
-15.4.4.21-4-6 failing
-15.4.4.21-4-7 failing
-15.4.4.21-4-8 failing
-15.4.4.21-4-9 failing
-15.4.4.21-5-1 failing
-15.4.4.21-5-10 failing
-15.4.4.21-5-11 failing
-15.4.4.21-5-2 failing
-15.4.4.21-5-3 failing
-15.4.4.21-5-4 failing
-15.4.4.21-5-5 failing
-15.4.4.21-5-6 failing
-15.4.4.21-5-7 failing
-15.4.4.21-5-8 failing
-15.4.4.21-7-2 failing
-15.4.4.21-7-3 failing
-15.4.4.21-7-4 failing
-15.4.4.21-7-5 failing
-15.4.4.21-7-6 failing
-15.4.4.21-7-7 failing
-15.4.4.21-7-8 failing
-15.4.4.21-7-9 failing
-15.4.4.21-8-b-2 failing
-15.4.4.21-8-b-ii-1 failing
-15.4.4.21-8-b-ii-2 failing
-15.4.4.21-8-b-iii-1-1 failing
-15.4.4.21-8-b-iii-1-11 failing
-15.4.4.21-8-b-iii-1-13 failing
-15.4.4.21-8-b-iii-1-15 failing
-15.4.4.21-8-b-iii-1-17 failing
-15.4.4.21-8-b-iii-1-18 failing
-15.4.4.21-8-b-iii-1-19 failing
-15.4.4.21-8-b-iii-1-20 failing
-15.4.4.21-8-b-iii-1-21 failing
-15.4.4.21-8-b-iii-1-22 failing
-15.4.4.21-8-b-iii-1-23 failing
-15.4.4.21-8-b-iii-1-25 failing
-15.4.4.21-8-b-iii-1-26 failing
-15.4.4.21-8-b-iii-1-27 failing
-15.4.4.21-8-b-iii-1-28 failing
-15.4.4.21-8-b-iii-1-29 failing
-15.4.4.21-8-b-iii-1-3 failing
-15.4.4.21-8-b-iii-1-31 failing
-15.4.4.21-8-b-iii-1-32 failing
-15.4.4.21-8-b-iii-1-5 failing
-15.4.4.21-8-b-iii-1-7 failing
-15.4.4.21-8-b-iii-1-9 failing
-15.4.4.21-8-c-1 failing
-15.4.4.21-8-c-2 failing
-15.4.4.21-8-c-3 failing
-15.4.4.21-8-c-5 failing
-15.4.4.21-8-c-6 failing
-15.4.4.21-9-1 failing
-15.4.4.21-9-10 failing
-15.4.4.21-9-8 failing
-15.4.4.21-9-b-10 failing
-15.4.4.21-9-b-12 failing
-15.4.4.21-9-b-15 failing
-15.4.4.21-9-b-16 failing
-15.4.4.21-9-b-17 failing
-15.4.4.21-9-b-18 failing
-15.4.4.21-9-b-19 failing
-15.4.4.21-9-b-2 failing
-15.4.4.21-9-b-20 failing
-15.4.4.21-9-b-21 failing
-15.4.4.21-9-b-23 failing
-15.4.4.21-9-b-25 failing
-15.4.4.21-9-b-26 failing
-15.4.4.21-9-b-28 failing
-15.4.4.21-9-b-3 failing
-15.4.4.21-9-b-4 failing
-15.4.4.21-9-b-6 failing
-15.4.4.21-9-b-8 failing
-15.4.4.21-9-c-1 failing
-15.4.4.21-9-c-i-1 failing
-15.4.4.21-9-c-i-10 failing
-15.4.4.21-9-c-i-11 failing
-15.4.4.21-9-c-i-12 failing
-15.4.4.21-9-c-i-13 failing
-15.4.4.21-9-c-i-14 failing
-15.4.4.21-9-c-i-15 failing
-15.4.4.21-9-c-i-16 failing
-15.4.4.21-9-c-i-17 failing
-15.4.4.21-9-c-i-18 failing
-15.4.4.21-9-c-i-19 failing
-15.4.4.21-9-c-i-2 failing
-15.4.4.21-9-c-i-20 failing
-15.4.4.21-9-c-i-21 failing
-15.4.4.21-9-c-i-22 failing
-15.4.4.21-9-c-i-23 failing
-15.4.4.21-9-c-i-25 failing
-15.4.4.21-9-c-i-26 failing
-15.4.4.21-9-c-i-27 failing
-15.4.4.21-9-c-i-28 failing
-15.4.4.21-9-c-i-29 failing
-15.4.4.21-9-c-i-3 failing
-15.4.4.22-10-3 failing
-15.4.4.22-10-4 failing
-15.4.4.22-10-6 failing
-15.4.4.22-10-7 failing
-15.4.4.22-10-8 failing
-15.4.4.22-2-1 failing
-15.4.4.22-2-10 failing
-15.4.4.22-2-11 failing
-15.4.4.22-2-12 failing
-15.4.4.22-2-13 failing
-15.4.4.22-2-14 failing
-15.4.4.22-2-15 failing
-15.4.4.22-2-17 failing
-15.4.4.22-2-18 failing
-15.4.4.22-2-19 failing
-15.4.4.22-2-3 failing
-15.4.4.22-2-5 failing
-15.4.4.22-2-6 failing
-15.4.4.22-2-7 failing
-15.4.4.22-2-8 failing
-15.4.4.22-2-9 failing
-15.4.4.22-3-1 failing
-15.4.4.22-3-10 failing
-15.4.4.22-3-11 failing
-15.4.4.22-3-12 failing
-15.4.4.22-3-13 failing
-15.4.4.22-3-14 failing
-15.4.4.22-3-15 failing
-15.4.4.22-3-16 failing
-15.4.4.22-3-17 failing
-15.4.4.22-3-18 failing
-15.4.4.22-3-19 failing
-15.4.4.22-3-2 failing
-15.4.4.22-3-20 failing
-15.4.4.22-3-21 failing
-15.4.4.22-3-22 failing
-15.4.4.22-3-23 failing
-15.4.4.22-3-24 failing
-15.4.4.22-3-25 failing
-15.4.4.22-3-28 failing
-15.4.4.22-3-29 failing
-15.4.4.22-3-3 failing
-15.4.4.22-3-4 failing
-15.4.4.22-3-5 failing
-15.4.4.22-3-6 failing
-15.4.4.22-3-7 failing
-15.4.4.22-3-8 failing
-15.4.4.22-3-9 failing
-15.4.4.22-4-1 failing
-15.4.4.22-4-15 failing
-15.4.4.22-4-3 failing
-15.4.4.22-4-4 failing
-15.4.4.22-4-5 failing
-15.4.4.22-4-6 failing
-15.4.4.22-4-7 failing
-15.4.4.22-4-8 failing
-15.4.4.22-4-9 failing
-15.4.4.21-9-c-i-30 failing
-15.4.4.21-9-c-i-31 failing
-15.4.4.21-9-c-i-32 failing
-15.4.4.21-9-c-i-4 failing
-15.4.4.21-9-c-i-5 failing
 15.4.4.21-9-c-i-6 failing
-15.4.4.21-9-c-i-7 failing
-15.4.4.21-9-c-i-8 failing
-15.4.4.21-9-c-i-9 failing
-15.4.4.21-9-c-ii-16 failing
-15.4.4.21-9-c-ii-18 failing
-15.4.4.21-9-c-ii-20 failing
-15.4.4.21-9-c-ii-21 failing
-15.4.4.21-9-c-ii-22 failing
-15.4.4.21-9-c-ii-23 failing
-15.4.4.21-9-c-ii-24 failing
-15.4.4.21-9-c-ii-25 failing
-15.4.4.21-9-c-ii-26 failing
-15.4.4.21-9-c-ii-27 failing
-15.4.4.21-9-c-ii-28 failing
-15.4.4.21-9-c-ii-29 failing
-15.4.4.21-9-c-ii-30 failing
-15.4.4.21-9-c-ii-31 failing
-15.4.4.21-9-c-ii-32 failing
 15.4.4.21-9-c-ii-33 failing
-15.4.4.21-9-c-ii-34 failing
-15.4.4.21-9-c-ii-35 failing
-15.4.4.21-9-c-ii-37 failing
-15.4.4.21-9-c-ii-4 failing
-15.4.4.21-9-c-ii-5 failing
-15.4.4.21-9-c-ii-8 failing
-15.4.4.21-9-c-ii-9 failing
-15.4.4.22-1-1 failing
 15.4.4.22-1-10 failing
-15.4.4.22-1-11 failing
-15.4.4.22-1-12 failing
 15.4.4.22-1-13 failing
-15.4.4.22-1-14 failing
-15.4.4.22-1-15 failing
-15.4.4.22-1-2 failing
-15.4.4.22-1-3 failing
-15.4.4.22-1-4 failing
-15.4.4.22-1-5 failing
-15.4.4.22-1-6 failing
-15.4.4.22-1-7 failing
-15.4.4.22-1-8 failing
-15.4.4.22-1-9 failing
-15.4.4.22-5-1 failing
-15.4.4.22-5-10 failing
-15.4.4.22-5-11 failing
-15.4.4.22-5-2 failing
-15.4.4.22-5-3 failing
-15.4.4.22-5-4 failing
-15.4.4.22-5-5 failing
-15.4.4.22-5-6 failing
-15.4.4.22-5-7 failing
-15.4.4.22-5-8 failing
-15.4.4.22-7-2 failing
-15.4.4.22-7-3 failing
-15.4.4.22-7-4 failing
-15.4.4.22-7-5 failing
-15.4.4.22-7-6 failing
-15.4.4.22-7-7 failing
-15.4.4.22-7-8 failing
-15.4.4.22-7-9 failing
-15.4.4.22-8-b-ii-1 failing
-15.4.4.22-8-b-ii-2 failing
-15.4.4.22-8-b-iii-1-1 failing
-15.4.4.22-8-b-iii-1-11 failing
-15.4.4.22-8-b-iii-1-13 failing
-15.4.4.22-8-b-iii-1-15 failing
-15.4.4.22-8-b-iii-1-17 failing
-15.4.4.22-8-b-iii-1-18 failing
-15.4.4.22-8-b-iii-1-19 failing
-15.4.4.22-8-b-iii-1-20 failing
-15.4.4.22-8-b-iii-1-21 failing
-15.4.4.22-8-b-iii-1-22 failing
-15.4.4.22-8-b-iii-1-23 failing
-15.4.4.22-8-b-iii-1-25 failing
-15.4.4.22-8-b-iii-1-26 failing
-15.4.4.22-8-b-iii-1-27 failing
-15.4.4.22-8-b-iii-1-28 failing
-15.4.4.22-8-b-iii-1-29 failing
-15.4.4.22-8-b-iii-1-3 failing
-15.4.4.22-8-b-iii-1-31 failing
-15.4.4.22-8-b-iii-1-32 failing
-15.4.4.22-8-b-iii-1-5 failing
-15.4.4.22-8-b-iii-1-7 failing
-15.4.4.22-8-b-iii-1-9 failing
-15.4.4.22-8-c-1 failing
-15.4.4.22-8-c-2 failing
-15.4.4.22-8-c-3 failing
-15.4.4.22-8-c-5 failing
-15.4.4.22-8-c-6 failing
-15.4.4.22-9-8 failing
-15.4.4.22-9-b-10 failing
-15.4.4.22-9-b-12 failing
-15.4.4.22-9-b-17 failing
-15.4.4.22-9-b-18 failing
-15.4.4.22-9-b-19 failing
-15.4.4.22-9-b-2 failing
-15.4.4.22-9-b-20 failing
-15.4.4.22-9-b-21 failing
-15.4.4.22-9-b-23 failing
-15.4.4.22-9-b-25 failing
-15.4.4.22-9-b-26 failing
-15.4.4.22-9-b-28 failing
-15.4.4.22-9-b-29 failing
-15.4.4.22-9-b-3 failing
-15.4.4.22-9-b-4 failing
-15.4.4.22-9-b-6 failing
-15.4.4.22-9-b-8 failing
-15.4.4.22-9-c-1 failing
-15.4.4.22-9-c-i-1 failing
-15.4.4.22-9-c-i-10 failing
-15.4.4.22-9-c-i-11 failing
-15.4.4.22-9-c-i-12 failing
-15.4.4.22-9-c-i-13 failing
-15.4.4.22-9-c-i-14 failing
-15.4.4.22-9-c-i-15 failing
-15.4.4.22-9-c-i-16 failing
-15.4.4.22-9-c-i-17 failing
-15.4.4.22-9-c-i-18 failing
-15.4.4.22-9-c-i-19 failing
-15.4.4.22-9-c-i-2 failing
-15.4.4.22-9-c-i-20 failing
-15.4.4.22-9-c-i-21 failing
-15.4.4.22-9-c-i-22 failing
-15.4.4.22-9-c-i-23 failing
-15.4.4.22-9-c-i-25 failing
-15.4.4.22-9-c-i-26 failing
-15.4.4.22-9-c-i-27 failing
-15.4.4.22-9-c-i-28 failing
-15.4.4.22-9-c-i-29 failing
-15.4.4.22-9-c-i-3 failing
-15.4.4.22-9-c-i-30 failing
-15.4.4.22-9-c-i-31 failing
-15.4.4.22-9-c-i-32 failing
-15.4.4.22-9-c-i-4 failing
-15.4.4.22-9-c-i-5 failing
 15.4.4.22-9-c-i-6 failing
-15.4.4.22-9-c-i-7 failing
-15.4.4.22-9-c-i-8 failing
-15.4.4.22-9-c-i-9 failing
-15.4.4.22-9-c-ii-16 failing
-15.4.4.22-9-c-ii-20 failing
-15.4.4.22-9-c-ii-21 failing
-15.4.4.22-9-c-ii-22 failing
-15.4.4.22-9-c-ii-23 failing
-15.4.4.22-9-c-ii-24 failing
-15.4.4.22-9-c-ii-25 failing
-15.4.4.22-9-c-ii-26 failing
-15.4.4.22-9-c-ii-27 failing
-15.4.4.22-9-c-ii-28 failing
-15.4.4.22-9-c-ii-29 failing
-15.4.4.22-9-c-ii-30 failing
-15.4.4.22-9-c-ii-31 failing
-15.4.4.22-9-c-ii-32 failing
 15.4.4.22-9-c-ii-33 failing
-15.4.4.22-9-c-ii-34 failing
-15.4.4.22-9-c-ii-35 failing
-15.4.4.22-9-c-ii-37 failing
-15.4.4.22-9-c-ii-4 failing
-15.4.4.22-9-c-ii-5 failing
-15.4.4.22-9-c-ii-8 failing
 S15.4.4.3_A1_T1 failing
 S15.4.4.3_A3_T1 failing
 15.4.4.4-5-b-iii-3-b-1 failing
@@ -1712,5 +1335,4 @@ 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.21-8-b-iii-1-6 failing
-15.4.4.22-9-9 failing
\ No newline at end of file
+15.4.4.21-8-b-iii-1-6 failing
\ No newline at end of file