aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-08-26 21:25:01 +0200
committerSimon Hausmann <simon.hausmann@qt.io>2018-08-28 21:45:53 +0000
commitf497bd50456efb7adbcb4be88c0ba2310445d166 (patch)
tree2082d835820907e0b1ac1f7ee99fe5d272f97d32
parent94f0d86b5d4c52a6af4843d05d47e7dcf2d1acaa (diff)
Fix Map and WeakMap constructor
Change-Id: I52c31a006b80430ea949eaac246301e51a430f89 Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
-rw-r--r--src/qml/jsruntime/qv4mapobject.cpp40
-rw-r--r--src/qml/jsruntime/qv4runtime.cpp4
-rw-r--r--tests/auto/qml/ecmascripttests/TestExpectations23
3 files changed, 27 insertions, 40 deletions
diff --git a/src/qml/jsruntime/qv4mapobject.cpp b/src/qml/jsruntime/qv4mapobject.cpp
index e8467a17b0..2c7978a14f 100644
--- a/src/qml/jsruntime/qv4mapobject.cpp
+++ b/src/qml/jsruntime/qv4mapobject.cpp
@@ -72,15 +72,7 @@ ReturnedValue WeakMapCtor::construct(const FunctionObject *f, const Value *argv,
if (argc > 0) {
ScopedValue iterable(scope, argv[0]);
- // ### beware, hack alert!
- // Object iteration seems broken right now. if we allow any object to
- // iterate, it endlessly loops in the Map/prototype tests in test262...
- // disable these for now until Object iteration is fixed, just so we can
- // test this.
- Scoped<MapObject> mapObjectCheck(scope, argv[0]);
- Scoped<SetObject> setObjectCheck(scope, argv[0]);
-
- if (!iterable->isUndefined() && !iterable->isNull() && (mapObjectCheck || setObjectCheck)) {
+ if (!iterable->isNullOrUndefined()) {
ScopedFunctionObject adder(scope, a->get(ScopedString(scope, scope.engine->newString(QString::fromLatin1("set")))));
if (!adder)
return scope.engine->throwTypeError();
@@ -90,24 +82,38 @@ ReturnedValue WeakMapCtor::construct(const FunctionObject *f, const Value *argv,
return Encode::undefined();
Q_ASSERT(iter);
- Value *nextValue = scope.alloc(1);
+ ScopedValue obj(scope);
+ Value *arguments = scope.alloc(2);
ScopedValue done(scope);
forever {
- done = Runtime::method_iteratorNext(scope.engine, iter, nextValue);
+ done = Runtime::method_iteratorNext(scope.engine, iter, obj);
if (scope.hasException())
- return Encode::undefined();
+ break;
if (done->toBoolean())
return a->asReturnedValue();
-
- adder->call(a, nextValue, 1);
- if (scope.engine->hasException) {
- ScopedValue falsey(scope, Encode(false));
- return Runtime::method_iteratorClose(scope.engine, iter, falsey);
+ const Object *o = obj->objectValue();
+ if (!o) {
+ scope.engine->throwTypeError();
+ break;
}
+
+ arguments[0] = o->get(PropertyKey::fromArrayIndex(0));
+ if (scope.hasException())
+ break;
+ arguments[1] = o->get(PropertyKey::fromArrayIndex(1));
+ if (scope.hasException())
+ break;
+
+ adder->call(a, arguments, 2);
+ if (scope.hasException())
+ break;
}
+ ScopedValue falsey(scope, Encode(false));
+ return Runtime::method_iteratorClose(scope.engine, iter, falsey);
}
}
return a->asReturnedValue();
+
}
ReturnedValue WeakMapCtor::virtualCallAsConstructor(const FunctionObject *f, const Value *argv, int argc, const Value *newTarget)
diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp
index 54898ca6a1..bc60dba142 100644
--- a/src/qml/jsruntime/qv4runtime.cpp
+++ b/src/qml/jsruntime/qv4runtime.cpp
@@ -759,11 +759,15 @@ ReturnedValue Runtime::method_iteratorNext(ExecutionEngine *engine, const Value
if (!o)
return engine->throwTypeError();
ScopedValue d(scope, o->get(engine->id_done()));
+ if (scope.hasException())
+ return Encode::undefined();
bool done = d->toBoolean();
if (done) {
*value = Encode::undefined();
} else {
*value = o->get(engine->id_value());
+ if (scope.hasException())
+ return Encode::undefined();
}
return Encode(done);
}
diff --git a/tests/auto/qml/ecmascripttests/TestExpectations b/tests/auto/qml/ecmascripttests/TestExpectations
index c9eb122fb2..65c041e4d8 100644
--- a/tests/auto/qml/ecmascripttests/TestExpectations
+++ b/tests/auto/qml/ecmascripttests/TestExpectations
@@ -205,25 +205,13 @@ built-ins/JSON/parse/revived-proxy.js fails
built-ins/JSON/stringify/replacer-proxy-revoked.js fails
built-ins/JSON/stringify/replacer-proxy.js fails
built-ins/JSON/stringify/value-proxy.js fails
-built-ins/Map/iterable-calls-set.js fails
-built-ins/Map/iterator-close-after-set-failure.js fails
-built-ins/Map/iterator-is-undefined-throws.js fails
-built-ins/Map/iterator-item-first-entry-returns-abrupt.js fails
-built-ins/Map/iterator-item-second-entry-returns-abrupt.js fails
-built-ins/Map/iterator-items-are-not-object-close-iterator.js fails
-built-ins/Map/iterator-items-are-not-object.js fails
-built-ins/Map/map-iterable-throws-when-set-is-not-callable.js fails
-built-ins/Map/map-iterable.js fails
built-ins/Map/proto-from-ctor-realm.js fails
-built-ins/Map/prototype/delete/does-not-break-iterators.js fails
-built-ins/Map/prototype/delete/returns-true-for-deleted-entry.js fails
built-ins/Map/prototype/forEach/callback-parameters.js fails
built-ins/Map/prototype/forEach/deleted-values-during-foreach.js fails
built-ins/Map/prototype/forEach/iterates-in-key-insertion-order.js fails
built-ins/Map/prototype/forEach/iterates-values-added-after-foreach-begins.js fails
built-ins/Map/prototype/forEach/iterates-values-deleted-then-readded.js fails
built-ins/Map/prototype/set/append-new-values.js fails
-built-ins/Map/prototype/size/returns-count-of-present-values-by-iterable.js fails
built-ins/Math/max/zeros.js fails
built-ins/Math/round/S15.8.2.15_A7.js fails
built-ins/Number/isFinite/arg-is-not-number.js fails
@@ -639,17 +627,7 @@ built-ins/TypedArrays/internals/Set/key-is-minus-zero.js fails
built-ins/TypedArrays/internals/Set/key-is-not-integer.js fails
built-ins/TypedArrays/internals/Set/key-is-out-of-bounds.js fails
built-ins/TypedArrays/internals/Set/tonumber-value-throws.js strictFails
-built-ins/WeakMap/iterable-failure.js fails
-built-ins/WeakMap/iterable.js fails
-built-ins/WeakMap/iterator-close-after-set-failure.js fails
-built-ins/WeakMap/iterator-item-first-entry-returns-abrupt.js fails
-built-ins/WeakMap/iterator-item-second-entry-returns-abrupt.js fails
-built-ins/WeakMap/iterator-items-are-not-object-close-iterator.js fails
-built-ins/WeakMap/iterator-items-are-not-object.js fails
built-ins/WeakMap/proto-from-ctor-realm.js fails
-built-ins/WeakMap/prototype/delete/delete-entry-initial-iterable.js fails
-built-ins/WeakMap/prototype/get/returns-value.js fails
-built-ins/WeakMap/set-not-callable-throws.js fails
built-ins/WeakSet/proto-from-ctor-realm.js fails
built-ins/global/global-object.js fails
built-ins/global/property-descriptor.js fails
@@ -1140,7 +1118,6 @@ language/statements/class/subclass/builtin-objects/Date/super-must-be-called.js
language/statements/class/subclass/builtin-objects/Error/super-must-be-called.js fails
language/statements/class/subclass/builtin-objects/Function/super-must-be-called.js fails
language/statements/class/subclass/builtin-objects/GeneratorFunction/super-must-be-called.js fails
-language/statements/class/subclass/builtin-objects/Map/regular-subclassing.js fails
language/statements/class/subclass/builtin-objects/Map/super-must-be-called.js fails
language/statements/class/subclass/builtin-objects/NativeError/EvalError-super.js fails
language/statements/class/subclass/builtin-objects/NativeError/RangeError-super.js fails