From 13a77fd6726a3ea0e53635ddc922059a1997d9bc Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Thu, 17 Jan 2013 21:19:53 +0100 Subject: [PATCH] Implement Array.prototype.every/some/forEach The old implementations of these methods were pretty broken. These fix 99% of the test failures related to these methods. Change-Id: I09d45411c85252a9ac7db8dccc644d51b3a31503 Reviewed-by: Simon Hausmann --- qv4ecmaobjects.cpp | 73 +++++----- tests/TestExpectations | 359 ------------------------------------------------- 2 files changed, 43 insertions(+), 389 deletions(-) diff --git a/qv4ecmaobjects.cpp b/qv4ecmaobjects.cpp index 7cf5f52..da16f7c 100644 --- a/qv4ecmaobjects.cpp +++ b/qv4ecmaobjects.cpp @@ -1991,24 +1991,28 @@ Value ArrayPrototype::method_lastIndexOf(ExecutionContext *ctx) Value ArrayPrototype::method_every(ExecutionContext *ctx) { - ArrayObject *instance = ctx->thisObject.asArrayObject(); - if (!instance) - ctx->throwUnimplemented(QStringLiteral("Array.prototype.every")); + 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); + bool ok = true; - // ### - for (uint k = 0; ok && k < instance->array.length(); ++k) { - Value v = instance->__get__(ctx, k); - if (v.isUndefined()) + for (uint k = 0; ok && 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); + Value r = callback->call(ctx, thisArg, args, 3); ok = __qmljs_to_boolean(r, ctx); } return Value::fromBoolean(ok); @@ -2016,47 +2020,56 @@ Value ArrayPrototype::method_every(ExecutionContext *ctx) Value ArrayPrototype::method_some(ExecutionContext *ctx) { - ArrayObject *instance = ctx->thisObject.asArrayObject(); - if (!instance) - ctx->throwUnimplemented(QStringLiteral("Array.prototype.some")); + 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); - bool ok = false; - // ### - for (uint k = 0; !ok && k < instance->array.length(); ++k) { - Value v = instance->__get__(ctx, k); - if (v.isUndefined()) + + 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); - ok = __qmljs_to_boolean(r, ctx); + Value r = callback->call(ctx, thisArg, args, 3); + if (__qmljs_to_boolean(r, ctx)) + return Value::fromBoolean(true); } - return Value::fromBoolean(ok); + return Value::fromBoolean(false); } Value ArrayPrototype::method_forEach(ExecutionContext *ctx) { - ArrayObject *instance = ctx->thisObject.asArrayObject(); - if (!instance) - ctx->throwUnimplemented(QStringLiteral("Array.prototype.forEach")); + 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); - // ### - for (quint32 k = 0; k < instance->array.length(); ++k) { - Value v = instance->__get__(ctx, k); - if (v.isUndefined()) + + 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); + callback->call(ctx, thisArg, args, 3); } return Value::undefinedValue(); } diff --git a/tests/TestExpectations b/tests/TestExpectations index 4319e5b..c60b3ac 100644 --- a/tests/TestExpectations +++ b/tests/TestExpectations @@ -718,372 +718,17 @@ S15.4.4.13_A4_T2 failing 15.4.4.15-8-b-ii-7 failing 15.4.4.15-8-b-ii-8 failing 15.4.4.15-8-b-ii-9 failing -15.4.4.16-1-1 failing 15.4.4.16-1-10 failing -15.4.4.16-1-11 failing -15.4.4.16-1-12 failing 15.4.4.16-1-13 failing -15.4.4.16-1-14 failing -15.4.4.16-1-15 failing -15.4.4.16-1-2 failing -15.4.4.16-1-3 failing -15.4.4.16-1-4 failing -15.4.4.16-1-5 failing -15.4.4.16-1-6 failing -15.4.4.16-1-7 failing -15.4.4.16-1-8 failing -15.4.4.16-1-9 failing -15.4.4.16-2-1 failing -15.4.4.16-2-10 failing -15.4.4.16-2-11 failing -15.4.4.16-2-12 failing -15.4.4.16-2-13 failing -15.4.4.16-2-14 failing -15.4.4.16-2-15 failing -15.4.4.16-2-17 failing -15.4.4.16-2-18 failing -15.4.4.16-2-19 failing -15.4.4.16-2-3 failing -15.4.4.16-2-5 failing -15.4.4.16-2-6 failing -15.4.4.16-2-7 failing -15.4.4.16-2-8 failing -15.4.4.16-2-9 failing -15.4.4.16-3-1 failing -15.4.4.16-3-10 failing -15.4.4.16-3-11 failing -15.4.4.16-3-12 failing -15.4.4.16-3-13 failing -15.4.4.16-3-14 failing -15.4.4.16-3-15 failing -15.4.4.16-3-16 failing -15.4.4.16-3-17 failing -15.4.4.16-3-18 failing -15.4.4.16-3-19 failing -15.4.4.16-3-2 failing -15.4.4.16-3-20 failing -15.4.4.16-3-21 failing -15.4.4.16-3-22 failing -15.4.4.16-3-23 failing -15.4.4.16-3-24 failing -15.4.4.16-3-25 failing -15.4.4.16-3-28 failing -15.4.4.16-3-29 failing -15.4.4.16-3-3 failing -15.4.4.16-3-4 failing -15.4.4.16-3-5 failing -15.4.4.16-3-6 failing -15.4.4.16-3-7 failing -15.4.4.16-3-8 failing -15.4.4.16-3-9 failing -15.4.4.16-4-1 failing -15.4.4.16-4-15 failing -15.4.4.16-4-3 failing -15.4.4.16-4-4 failing -15.4.4.16-4-5 failing -15.4.4.16-4-6 failing -15.4.4.16-4-7 failing -15.4.4.16-4-8 failing -15.4.4.16-4-9 failing 15.4.4.16-5-17 failing -15.4.4.16-7-5 failing -15.4.4.16-7-8 failing -15.4.4.16-7-9 failing -15.4.4.16-7-b-10 failing -15.4.4.16-7-b-12 failing -15.4.4.16-7-b-15 failing -15.4.4.16-7-b-2 failing -15.4.4.16-7-b-3 failing -15.4.4.16-7-b-4 failing -15.4.4.16-7-b-6 failing -15.4.4.16-7-b-8 failing -15.4.4.16-7-c-i-1 failing -15.4.4.16-7-c-i-11 failing -15.4.4.16-7-c-i-13 failing -15.4.4.16-7-c-i-15 failing -15.4.4.16-7-c-i-17 failing -15.4.4.16-7-c-i-18 failing -15.4.4.16-7-c-i-19 failing -15.4.4.16-7-c-i-20 failing -15.4.4.16-7-c-i-21 failing -15.4.4.16-7-c-i-22 failing -15.4.4.16-7-c-i-23 failing -15.4.4.16-7-c-i-25 failing -15.4.4.16-7-c-i-26 failing -15.4.4.16-7-c-i-27 failing -15.4.4.16-7-c-i-29 failing -15.4.4.16-7-c-i-3 failing -15.4.4.16-7-c-i-30 failing -15.4.4.16-7-c-i-5 failing -15.4.4.16-7-c-i-7 failing -15.4.4.16-7-c-i-9 failing -15.4.4.16-7-c-ii-16 failing -15.4.4.16-7-c-ii-17 failing -15.4.4.16-7-c-ii-18 failing -15.4.4.16-7-c-ii-19 failing -15.4.4.16-7-c-ii-20 failing -15.4.4.16-7-c-ii-21 failing -15.4.4.16-7-c-ii-22 failing -15.4.4.16-7-c-ii-23 failing -15.4.4.16-7-c-ii-6 failing -15.4.4.16-7-c-ii-7 failing -15.4.4.16-7-c-ii-8 failing -15.4.4.16-7-c-iii-1 failing -15.4.4.16-7-c-iii-2 failing 15.4.4.16-7-c-iii-23 failing -15.4.4.16-7-c-iii-28 failing -15.4.4.16-7-c-iii-3 failing -15.4.4.16-7-c-iii-4 failing -15.4.4.16-8-10 failing -15.4.4.16-8-2 failing -15.4.4.16-8-3 failing -15.4.4.16-8-4 failing -15.4.4.16-8-5 failing -15.4.4.16-8-6 failing -15.4.4.16-8-7 failing -15.4.4.16-8-8 failing -15.4.4.17-1-1 failing 15.4.4.17-1-10 failing -15.4.4.17-1-11 failing -15.4.4.17-1-12 failing 15.4.4.17-1-13 failing -15.4.4.17-1-14 failing -15.4.4.17-1-15 failing -15.4.4.17-1-2 failing -15.4.4.17-1-3 failing -15.4.4.17-1-4 failing -15.4.4.17-1-5 failing -15.4.4.17-1-6 failing -15.4.4.17-1-7 failing -15.4.4.17-1-8 failing -15.4.4.17-1-9 failing -15.4.4.17-2-1 failing -15.4.4.17-2-10 failing -15.4.4.17-2-11 failing -15.4.4.17-2-12 failing -15.4.4.17-2-13 failing -15.4.4.17-2-14 failing -15.4.4.17-2-15 failing -15.4.4.17-2-17 failing -15.4.4.17-2-18 failing -15.4.4.17-2-19 failing -15.4.4.17-2-3 failing -15.4.4.17-2-5 failing -15.4.4.17-2-6 failing -15.4.4.17-2-7 failing -15.4.4.17-2-8 failing -15.4.4.17-2-9 failing -15.4.4.17-3-1 failing -15.4.4.17-3-10 failing -15.4.4.17-3-11 failing -15.4.4.17-3-12 failing -15.4.4.17-3-13 failing -15.4.4.17-3-14 failing -15.4.4.17-3-15 failing -15.4.4.17-3-16 failing -15.4.4.17-3-17 failing -15.4.4.17-3-18 failing -15.4.4.17-3-19 failing -15.4.4.17-3-2 failing -15.4.4.17-3-20 failing -15.4.4.17-3-21 failing -15.4.4.17-3-22 failing -15.4.4.17-3-23 failing -15.4.4.17-3-24 failing -15.4.4.17-3-25 failing -15.4.4.17-3-28 failing -15.4.4.17-3-29 failing -15.4.4.17-3-3 failing -15.4.4.17-3-4 failing -15.4.4.17-3-5 failing -15.4.4.17-3-6 failing -15.4.4.17-3-7 failing -15.4.4.17-3-8 failing -15.4.4.17-3-9 failing -15.4.4.17-4-1 failing -15.4.4.17-4-15 failing -15.4.4.17-4-3 failing -15.4.4.17-4-4 failing -15.4.4.17-4-5 failing -15.4.4.17-4-6 failing -15.4.4.17-4-7 failing -15.4.4.17-4-8 failing -15.4.4.17-4-9 failing 15.4.4.17-5-17 failing -15.4.4.17-7-5 failing -15.4.4.17-7-8 failing -15.4.4.17-7-9 failing -15.4.4.17-7-b-10 failing -15.4.4.17-7-b-12 failing -15.4.4.17-7-b-15 failing -15.4.4.17-7-b-2 failing -15.4.4.17-7-b-3 failing -15.4.4.17-7-b-4 failing -15.4.4.17-7-b-6 failing -15.4.4.17-7-b-8 failing -15.4.4.17-7-c-i-1 failing -15.4.4.17-7-c-i-11 failing -15.4.4.17-7-c-i-13 failing -15.4.4.17-7-c-i-15 failing -15.4.4.17-7-c-i-17 failing -15.4.4.17-7-c-i-18 failing -15.4.4.17-7-c-i-19 failing -15.4.4.17-7-c-i-20 failing -15.4.4.17-7-c-i-21 failing -15.4.4.17-7-c-i-22 failing -15.4.4.17-7-c-i-23 failing -15.4.4.17-7-c-i-25 failing -15.4.4.17-7-c-i-26 failing -15.4.4.17-7-c-i-27 failing -15.4.4.17-7-c-i-29 failing -15.4.4.17-7-c-i-3 failing -15.4.4.17-7-c-i-30 failing -15.4.4.17-7-c-i-5 failing -15.4.4.17-7-c-i-7 failing -15.4.4.17-7-c-i-9 failing -15.4.4.17-7-c-ii-16 failing -15.4.4.17-7-c-ii-17 failing -15.4.4.17-7-c-ii-18 failing -15.4.4.17-7-c-ii-19 failing -15.4.4.17-7-c-ii-20 failing -15.4.4.17-7-c-ii-21 failing -15.4.4.17-7-c-ii-22 failing -15.4.4.17-7-c-ii-23 failing -15.4.4.17-7-c-ii-6 failing -15.4.4.17-7-c-ii-8 failing -15.4.4.17-7-c-iii-1 failing -15.4.4.17-7-c-iii-2 failing 15.4.4.17-7-c-iii-23 failing -15.4.4.17-7-c-iii-28 failing -15.4.4.17-7-c-iii-3 failing -15.4.4.17-7-c-iii-4 failing -15.4.4.17-8-10 failing -15.4.4.17-8-2 failing -15.4.4.17-8-3 failing -15.4.4.17-8-4 failing -15.4.4.17-8-5 failing -15.4.4.17-8-6 failing -15.4.4.17-8-7 failing -15.4.4.17-8-8 failing -15.4.4.18-1-1 failing 15.4.4.18-1-10 failing -15.4.4.18-1-11 failing -15.4.4.18-1-12 failing 15.4.4.18-1-13 failing -15.4.4.18-1-14 failing -15.4.4.18-1-15 failing -15.4.4.18-1-2 failing -15.4.4.18-1-3 failing -15.4.4.18-1-4 failing -15.4.4.18-1-5 failing -15.4.4.18-1-6 failing -15.4.4.18-1-7 failing -15.4.4.18-1-8 failing -15.4.4.18-1-9 failing -15.4.4.18-2-1 failing -15.4.4.18-2-10 failing -15.4.4.18-2-11 failing -15.4.4.18-2-12 failing -15.4.4.18-2-13 failing -15.4.4.18-2-14 failing -15.4.4.18-2-15 failing -15.4.4.18-2-17 failing -15.4.4.18-2-18 failing -15.4.4.18-2-19 failing -15.4.4.18-2-3 failing -15.4.4.18-2-5 failing -15.4.4.18-2-6 failing -15.4.4.18-2-7 failing -15.4.4.18-2-8 failing -15.4.4.18-2-9 failing -15.4.4.18-3-1 failing -15.4.4.18-3-10 failing -15.4.4.18-3-11 failing -15.4.4.18-3-12 failing -15.4.4.18-3-13 failing -15.4.4.18-3-14 failing -15.4.4.18-3-15 failing -15.4.4.18-3-16 failing -15.4.4.18-3-17 failing -15.4.4.18-3-18 failing -15.4.4.18-3-19 failing -15.4.4.18-3-2 failing -15.4.4.18-3-20 failing -15.4.4.18-3-21 failing -15.4.4.18-3-22 failing -15.4.4.18-3-23 failing -15.4.4.18-3-24 failing -15.4.4.18-3-25 failing -15.4.4.18-3-28 failing -15.4.4.18-3-29 failing -15.4.4.18-3-3 failing -15.4.4.18-3-4 failing -15.4.4.18-3-5 failing -15.4.4.18-3-6 failing -15.4.4.18-3-7 failing -15.4.4.18-3-8 failing -15.4.4.18-3-9 failing -15.4.4.18-4-1 failing -15.4.4.18-4-15 failing -15.4.4.18-4-3 failing -15.4.4.18-4-4 failing -15.4.4.18-4-5 failing -15.4.4.18-4-6 failing -15.4.4.18-4-7 failing -15.4.4.18-4-8 failing -15.4.4.18-4-9 failing 15.4.4.18-5-17 failing -15.4.4.18-7-1 failing -15.4.4.18-7-4 failing -15.4.4.18-7-8 failing -15.4.4.18-7-9 failing -15.4.4.18-7-b-10 failing -15.4.4.18-7-b-12 failing -15.4.4.18-7-b-15 failing -15.4.4.18-7-b-2 failing -15.4.4.18-7-b-3 failing -15.4.4.18-7-b-4 failing -15.4.4.18-7-b-6 failing -15.4.4.18-7-b-8 failing -15.4.4.18-7-c-i-1 failing -15.4.4.18-7-c-i-11 failing -15.4.4.18-7-c-i-13 failing -15.4.4.18-7-c-i-15 failing -15.4.4.18-7-c-i-17 failing -15.4.4.18-7-c-i-18 failing -15.4.4.18-7-c-i-19 failing -15.4.4.18-7-c-i-20 failing -15.4.4.18-7-c-i-21 failing -15.4.4.18-7-c-i-22 failing -15.4.4.18-7-c-i-23 failing -15.4.4.18-7-c-i-25 failing -15.4.4.18-7-c-i-26 failing -15.4.4.18-7-c-i-27 failing -15.4.4.18-7-c-i-29 failing -15.4.4.18-7-c-i-3 failing -15.4.4.18-7-c-i-30 failing -15.4.4.18-7-c-i-5 failing -15.4.4.18-7-c-i-7 failing -15.4.4.18-7-c-i-9 failing -15.4.4.18-7-c-ii-16 failing -15.4.4.18-7-c-ii-17 failing -15.4.4.18-7-c-ii-18 failing -15.4.4.18-7-c-ii-19 failing -15.4.4.18-7-c-ii-20 failing -15.4.4.18-7-c-ii-21 failing -15.4.4.18-7-c-ii-22 failing -15.4.4.18-7-c-ii-23 failing -15.4.4.18-7-c-ii-6 failing -15.4.4.18-7-c-ii-8 failing -15.4.4.18-8-10 failing -15.4.4.18-8-2 failing -15.4.4.18-8-3 failing -15.4.4.18-8-4 failing -15.4.4.18-8-5 failing -15.4.4.18-8-6 failing -15.4.4.18-8-7 failing -15.4.4.18-8-8 failing -15.4.4.18-8-9 failing 15.4.4.19-1-1 failing 15.4.4.19-1-10 failing 15.4.4.19-1-11 failing @@ -2311,11 +1956,7 @@ 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.16-7-b-1 failing -15.4.4.17-7-b-1 failing -15.4.4.18-7-b-1 failing 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 - -- 2.7.4