diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-08-26 21:25:01 +0200 |
---|---|---|
committer | Simon Hausmann <simon.hausmann@qt.io> | 2018-08-28 21:45:53 +0000 |
commit | f497bd50456efb7adbcb4be88c0ba2310445d166 (patch) | |
tree | 2082d835820907e0b1ac1f7ee99fe5d272f97d32 | |
parent | 94f0d86b5d4c52a6af4843d05d47e7dcf2d1acaa (diff) |
Fix Map and WeakMap constructor
Change-Id: I52c31a006b80430ea949eaac246301e51a430f89
Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
-rw-r--r-- | src/qml/jsruntime/qv4mapobject.cpp | 40 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtime.cpp | 4 | ||||
-rw-r--r-- | tests/auto/qml/ecmascripttests/TestExpectations | 23 |
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 |