From: Lars Knoll Date: Thu, 17 Jan 2013 20:58:24 +0000 (+0100) Subject: Implement Array.prototype.map/filter correctly X-Git-Tag: upstream/5.2.1~669^2~659^2~478 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=404da13209b39c136a2e0de727e22511e15044dc;p=platform%2Fupstream%2Fqtdeclarative.git Implement Array.prototype.map/filter correctly Fixes another 260 test cases. Change-Id: I4f6299119c1859dced1fd2f50c3e5d7f0ed133ed Reviewed-by: Simon Hausmann --- diff --git a/qv4ecmaobjects.cpp b/qv4ecmaobjects.cpp index da16f7c..fc4cd92 100644 --- a/qv4ecmaobjects.cpp +++ b/qv4ecmaobjects.cpp @@ -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); diff --git a/tests/TestExpectations b/tests/TestExpectations index c60b3ac..2591b7c 100644 --- a/tests/TestExpectations +++ b/tests/TestExpectations @@ -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