From: Lars Knoll Date: Thu, 17 Jan 2013 21:22:39 +0000 (+0100) Subject: Implement Array.prototype.reduce/reduceRight X-Git-Tag: upstream/5.2.1~669^2~659^2~477 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=0dd52c91a2ed0c56f3660ec7d9d618a748fbbc25;p=platform%2Fupstream%2Fqtdeclarative.git Implement Array.prototype.reduce/reduceRight This fixes another 380 test cases Change-Id: I9a09bf1cd992a3a370d8e3156a612c91dc95d3b3 Reviewed-by: Simon Hausmann --- diff --git a/qv4ecmaobjects.cpp b/qv4ecmaobjects.cpp index fc4cd92..0ef0d2a 100644 --- a/qv4ecmaobjects.cpp +++ b/qv4ecmaobjects.cpp @@ -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; } diff --git a/tests/TestExpectations b/tests/TestExpectations index 2591b7c..7f29ea9 100644 --- a/tests/TestExpectations +++ b/tests/TestExpectations @@ -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