aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-06-15 23:00:32 +0200
committerLars Knoll <lars.knoll@qt.io>2018-06-21 19:43:41 +0000
commit12bc11e5af20e68c504ab56de8ef0e0b76efd12c (patch)
tree5a86e65d4da3dc90cd43ed02dd456106e3231990
parent99d8808bc5b85d54e8e735953a27a0c0c788f10e (diff)
Add support for Reflect
Implemented all methods in Reflect, only some smaller bugs left in there. Change-Id: I53d2304d0e59566aec64e200cd995e02afcfc33e Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
-rw-r--r--src/qml/jsruntime/jsruntime.pri2
-rw-r--r--src/qml/jsruntime/qv4engine.cpp2
-rw-r--r--src/qml/jsruntime/qv4internalclass.cpp2
-rw-r--r--src/qml/jsruntime/qv4reflect.cpp270
-rw-r--r--src/qml/jsruntime/qv4reflect_p.h89
-rw-r--r--tests/auto/qml/ecmascripttests/TestExpectations135
-rw-r--r--tests/auto/qml/qjsengine/tst_qjsengine.cpp1
7 files changed, 365 insertions, 136 deletions
diff --git a/src/qml/jsruntime/jsruntime.pri b/src/qml/jsruntime/jsruntime.pri
index 97610a0e40..a2408d7d2a 100644
--- a/src/qml/jsruntime/jsruntime.pri
+++ b/src/qml/jsruntime/jsruntime.pri
@@ -31,6 +31,7 @@ SOURCES += \
$$PWD/qv4object.cpp \
$$PWD/qv4objectproto.cpp \
$$PWD/qv4qmlcontext.cpp \
+ $$PWD/qv4reflect.cpp \
$$PWD/qv4regexpobject.cpp \
$$PWD/qv4stringiterator.cpp \
$$PWD/qv4stringobject.cpp \
@@ -89,6 +90,7 @@ HEADERS += \
$$PWD/qv4object_p.h \
$$PWD/qv4objectproto_p.h \
$$PWD/qv4qmlcontext_p.h \
+ $$PWD/qv4reflect_p.h \
$$PWD/qv4regexpobject_p.h \
$$PWD/qv4runtimecodegen_p.h \
$$PWD/qv4stringiterator_p.h \
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
index 6e8dfbc09c..a8331f153e 100644
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -72,6 +72,7 @@
#include "qv4iterator_p.h"
#include "qv4stringiterator_p.h"
#include "qv4generatorobject_p.h"
+#include "qv4reflect_p.h"
#if QT_CONFIG(qml_sequence_object)
#include "qv4sequenceobject_p.h"
@@ -530,6 +531,7 @@ ExecutionEngine::ExecutionEngine(QJSEngine *jsEngine)
ScopedObject o(scope);
globalObject->defineDefaultProperty(QStringLiteral("Math"), (o = memoryManager->allocate<MathObject>()));
globalObject->defineDefaultProperty(QStringLiteral("JSON"), (o = memoryManager->allocate<JsonObject>()));
+ globalObject->defineDefaultProperty(QStringLiteral("Reflect"), (o = memoryManager->allocate<Reflect>()));
globalObject->defineReadonlyProperty(QStringLiteral("undefined"), Primitive::undefinedValue());
globalObject->defineReadonlyProperty(QStringLiteral("NaN"), Primitive::fromDouble(std::numeric_limits<double>::quiet_NaN()));
diff --git a/src/qml/jsruntime/qv4internalclass.cpp b/src/qml/jsruntime/qv4internalclass.cpp
index da37fda590..a913d5ca75 100644
--- a/src/qml/jsruntime/qv4internalclass.cpp
+++ b/src/qml/jsruntime/qv4internalclass.cpp
@@ -294,7 +294,7 @@ Heap::InternalClass *InternalClass::changeMember(Identifier identifier, Property
for (uint i = 0; i < size; ++i) {
Identifier identifier = nameMap.at(i);
PropertyHash::Entry e = { identifier, newClass->size };
- if (!identifier.isValid())
+ if (i && !identifier.isValid())
e.identifier = nameMap.at(i - 1);
newClass->propertyTable.addEntry(e, newClass->size);
newClass->nameMap.add(newClass->size, identifier);
diff --git a/src/qml/jsruntime/qv4reflect.cpp b/src/qml/jsruntime/qv4reflect.cpp
new file mode 100644
index 0000000000..69baecd337
--- /dev/null
+++ b/src/qml/jsruntime/qv4reflect.cpp
@@ -0,0 +1,270 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtQml module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qv4reflect_p.h"
+#include "qv4symbol_p.h"
+#include "qv4runtimeapi_p.h"
+#include "qv4objectproto_p.h"
+
+using namespace QV4;
+
+DEFINE_OBJECT_VTABLE(Reflect);
+
+void Heap::Reflect::init()
+{
+ Object::init();
+ Scope scope(internalClass->engine);
+ ScopedObject r(scope, this);
+
+ r->defineDefaultProperty(QStringLiteral("apply"), QV4::Reflect::method_apply, 3);
+ r->defineDefaultProperty(QStringLiteral("construct"), QV4::Reflect::method_construct, 2);
+ r->defineDefaultProperty(QStringLiteral("defineProperty"), QV4::Reflect::method_defineProperty, 3);
+ r->defineDefaultProperty(QStringLiteral("deleteProperty"), QV4::Reflect::method_deleteProperty, 2);
+ r->defineDefaultProperty(QStringLiteral("get"), QV4::Reflect::method_get, 2);
+ r->defineDefaultProperty(QStringLiteral("getOwnPropertyDescriptor"), QV4::Reflect::method_getOwnPropertyDescriptor, 2);
+ r->defineDefaultProperty(QStringLiteral("getPrototypeOf"), QV4::Reflect::method_getPrototypeOf, 1);
+ r->defineDefaultProperty(QStringLiteral("has"), QV4::Reflect::method_has, 2);
+ r->defineDefaultProperty(QStringLiteral("isExtensible"), QV4::Reflect::method_isExtensible, 1);
+ r->defineDefaultProperty(QStringLiteral("ownKeys"), QV4::Reflect::method_ownKeys, 1);
+ r->defineDefaultProperty(QStringLiteral("preventExtensions"), QV4::Reflect::method_preventExtensions, 1);
+ r->defineDefaultProperty(QStringLiteral("set"), QV4::Reflect::method_set, 3);
+ r->defineDefaultProperty(QStringLiteral("setPrototypeOf"), QV4::Reflect::method_setPrototypeOf, 2);
+}
+
+struct CallArgs {
+ Value *argv;
+ int argc;
+};
+
+static CallArgs createListFromArrayLike(Scope &scope, const Object *o)
+{
+ int len = o->getLength();
+ Value *arguments = scope.alloc(len);
+
+ for (int i = 0; i < len; ++i) {
+ arguments[i] = o->getIndexed(i);
+ if (scope.hasException())
+ return { nullptr, 0 };
+ }
+ return { arguments, len };
+}
+
+ReturnedValue Reflect::method_apply(const FunctionObject *f, const Value *, const Value *argv, int argc)
+{
+ Scope scope(f);
+ if (argc < 3 || !argv[0].isFunctionObject() || !argv[2].isObject())
+ return scope.engine->throwTypeError();
+
+ const Object *o = static_cast<const Object *>(argv + 2);
+ CallArgs arguments = createListFromArrayLike(scope, o);
+ if (scope.hasException())
+ return Encode::undefined();
+
+ return static_cast<const FunctionObject &>(argv[0]).call(&argv[1], arguments.argv, arguments.argc);
+}
+
+ReturnedValue Reflect::method_construct(const FunctionObject *f, const Value *, const Value *argv, int argc)
+{
+ Scope scope(f);
+ if (argc < 2 || !argv[0].isFunctionObject() || !argv[1].isObject())
+ return scope.engine->throwTypeError();
+
+ const Object *o = static_cast<const Object *>(argv + 1);
+ CallArgs arguments = createListFromArrayLike(scope, o);
+ if (scope.hasException())
+ return Encode::undefined();
+
+ return static_cast<const FunctionObject &>(argv[0]).callAsConstructor(arguments.argv, arguments.argc);
+}
+
+ReturnedValue Reflect::method_defineProperty(const FunctionObject *f, const Value *, const Value *argv, int argc)
+{
+ Scope scope(f);
+ if (!argc || !argv[0].isObject())
+ return scope.engine->throwTypeError();
+
+ ScopedObject O(scope, argv[0]);
+ ScopedStringOrSymbol name(scope, (argc > 1 ? argv[1] : Primitive::undefinedValue()).toPropertyKey(scope.engine));
+ if (scope.engine->hasException)
+ return QV4::Encode::undefined();
+
+ ScopedValue attributes(scope, argc > 2 ? argv[2] : Primitive::undefinedValue());
+ ScopedProperty pd(scope);
+ PropertyAttributes attrs;
+ ObjectPrototype::toPropertyDescriptor(scope.engine, attributes, pd, &attrs);
+ if (scope.engine->hasException)
+ return QV4::Encode::undefined();
+
+ bool result = O->__defineOwnProperty__(scope.engine, name, pd, attrs);
+
+ return Encode(result);
+}
+
+ReturnedValue Reflect::method_deleteProperty(const FunctionObject *f, const Value *, const Value *argv, int argc)
+{
+ ExecutionEngine *e = f->engine();
+ if (!argc || !argv[0].isObject())
+ return e->throwTypeError();
+
+ bool result = Runtime::method_deleteProperty(e, argv[0], argc > 1 ? argv[1] : Primitive::undefinedValue());
+ return Encode(result);
+}
+
+ReturnedValue Reflect::method_get(const FunctionObject *f, const Value *, const Value *argv, int argc)
+{
+ // ### Fix third receiver argument
+ Scope scope(f);
+ if (!argc || !argv[0].isObject())
+ return scope.engine->throwTypeError();
+
+ ScopedObject o(scope, static_cast<const Object *>(argv));
+ Value undef = Primitive::undefinedValue();
+ const Value *index = argc > 1 ? &argv[1] : &undef;
+
+ uint n = index->asArrayIndex();
+ if (n < UINT_MAX)
+ return Encode(o->getIndexed(n));
+
+ ScopedStringOrSymbol name(scope, index->toPropertyKey(scope.engine));
+ if (scope.engine->hasException)
+ return false;
+ return Encode(o->get(name));
+}
+
+ReturnedValue Reflect::method_getOwnPropertyDescriptor(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc)
+{
+ if (!argc || !argv[0].isObject())
+ return f->engine()->throwTypeError();
+
+ return ObjectPrototype::method_getOwnPropertyDescriptor(f, thisObject, argv, argc);
+}
+
+ReturnedValue Reflect::method_getPrototypeOf(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc)
+{
+ if (!argc || !argv[0].isObject())
+ return f->engine()->throwTypeError();
+
+ return ObjectPrototype::method_getPrototypeOf(f, thisObject, argv, argc);
+}
+
+ReturnedValue Reflect::method_has(const FunctionObject *f, const Value *, const Value *argv, int argc)
+{
+ Scope scope(f);
+ if (!argc || !argv[0].isObject())
+ return scope.engine->throwTypeError();
+
+ ScopedObject o(scope, static_cast<const Object *>(argv));
+ Value undef = Primitive::undefinedValue();
+ const Value *index = argc > 1 ? &argv[1] : &undef;
+
+ bool hasProperty = false;
+ uint n = index->asArrayIndex();
+ if (n < UINT_MAX) {
+ (void) o->getIndexed(n, &hasProperty);
+ return Encode(hasProperty);
+ }
+
+ ScopedStringOrSymbol name(scope, index->toPropertyKey(scope.engine));
+ if (scope.engine->hasException)
+ return false;
+ (void) o->get(name, &hasProperty);
+ return Encode(hasProperty);
+}
+
+ReturnedValue Reflect::method_isExtensible(const FunctionObject *f, const Value *, const Value *argv, int argc)
+{
+ if (!argc || !argv[0].isObject())
+ return f->engine()->throwTypeError();
+
+ const Object *o = static_cast<const Object *>(argv);
+ return Encode(o->isExtensible());
+}
+
+
+ReturnedValue Reflect::method_ownKeys(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc)
+{
+ if (!argc || !argv[0].isObject())
+ return f->engine()->throwTypeError();
+
+ return ObjectPrototype::method_getOwnPropertyNames(f, thisObject, argv, argc);
+}
+
+ReturnedValue Reflect::method_preventExtensions(const FunctionObject *f, const Value *, const Value *argv, int argc)
+{
+ Scope scope(f);
+ if (!argc || !argv[0].isObject())
+ return scope.engine->throwTypeError();
+
+ ScopedObject o(scope, static_cast<const Object *>(argv));
+ o->setInternalClass(o->internalClass()->nonExtensible());
+ return Encode(true);
+}
+
+ReturnedValue Reflect::method_set(const FunctionObject *f, const Value *, const Value *argv, int argc)
+{
+ // ### Fix third receiver argument
+ Scope scope(f);
+ if (!argc || !argv[0].isObject())
+ return scope.engine->throwTypeError();
+
+ ScopedObject o(scope, static_cast<const Object *>(argv));
+ Value undef = Primitive::undefinedValue();
+ const Value *index = argc > 1 ? &argv[1] : &undef;
+ const Value &val = argc > 2 ? argv[2] : undef;
+
+ uint n = index->asArrayIndex();
+ if (n < UINT_MAX) {
+ bool result = o->putIndexed(n, val);
+ return Encode(result);
+ }
+
+ ScopedStringOrSymbol name(scope, index->toPropertyKey(scope.engine));
+ if (scope.engine->hasException)
+ return false;
+ bool result = o->put(name, val);
+ return Encode(result);
+}
+
+ReturnedValue Reflect::method_setPrototypeOf(const FunctionObject *f, const Value *thisObject, const Value *argv, int argc)
+{
+ if (argc < 2 || !argv[0].isObject())
+ return f->engine()->throwTypeError();
+
+ return ObjectPrototype::method_setPrototypeOf(f, thisObject, argv, argc);
+}
diff --git a/src/qml/jsruntime/qv4reflect_p.h b/src/qml/jsruntime/qv4reflect_p.h
new file mode 100644
index 0000000000..73d257e006
--- /dev/null
+++ b/src/qml/jsruntime/qv4reflect_p.h
@@ -0,0 +1,89 @@
+/****************************************************************************
+**
+** Copyright (C) 2018 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the QtQml module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+#ifndef QV4REFLECT_H
+#define QV4REFLECT_H
+
+//
+// W A R N I N G
+// -------------
+//
+// This file is not part of the Qt API. It exists purely as an
+// implementation detail. This header file may change from version to
+// version without notice, or even be removed.
+//
+// We mean it.
+//
+
+#include "qv4object_p.h"
+
+QT_BEGIN_NAMESPACE
+
+namespace QV4 {
+
+namespace Heap {
+
+struct Reflect : Object {
+ void init();
+};
+
+}
+
+struct Reflect : Object {
+ V4_OBJECT2(Reflect, Object)
+
+ static ReturnedValue method_apply(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
+ static ReturnedValue method_construct(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
+ static ReturnedValue method_defineProperty(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
+ static ReturnedValue method_deleteProperty(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
+ static ReturnedValue method_get(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
+ static ReturnedValue method_getOwnPropertyDescriptor(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
+ static ReturnedValue method_getPrototypeOf(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
+ static ReturnedValue method_has(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
+ static ReturnedValue method_isExtensible(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
+ static ReturnedValue method_ownKeys(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
+ static ReturnedValue method_preventExtensions(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
+ static ReturnedValue method_set(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
+ static ReturnedValue method_setPrototypeOf(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
+};
+
+}
+
+QT_END_NAMESPACE
+
+#endif
diff --git a/tests/auto/qml/ecmascripttests/TestExpectations b/tests/auto/qml/ecmascripttests/TestExpectations
index edb24db8fb..6ab538df53 100644
--- a/tests/auto/qml/ecmascripttests/TestExpectations
+++ b/tests/auto/qml/ecmascripttests/TestExpectations
@@ -142,7 +142,6 @@ built-ins/Array/prototype/unshift/throws-if-integer-limit-exceeded.js fails
built-ins/ArrayBuffer/data-allocation-after-object-creation.js fails
built-ins/ArrayBuffer/isView/arg-is-dataview-subclass-instance.js fails
built-ins/ArrayBuffer/isView/arg-is-typedarray-subclass-instance.js fails
-built-ins/ArrayBuffer/newtarget-prototype-is-not-object.js fails
built-ins/ArrayBuffer/proto-from-ctor-realm.js fails
built-ins/ArrayBuffer/prototype-from-newtarget.js fails
built-ins/ArrayBuffer/prototype/byteLength/detached-buffer.js fails
@@ -262,7 +261,6 @@ built-ins/Atomics/xor/nonshared-int-views.js fails
built-ins/Atomics/xor/shared-nonint-views.js fails
built-ins/Boolean/proto-from-ctor-realm.js fails
built-ins/DataView/custom-proto-access-throws.js fails
-built-ins/DataView/custom-proto-if-not-object-fallbacks-to-default-prototype.js fails
built-ins/DataView/custom-proto-if-object-is-used.js fails
built-ins/DataView/detached-buffer.js fails
built-ins/DataView/length.js fails
@@ -692,10 +690,6 @@ built-ins/Object/getPrototypeOf/15.2.3.2-2-14.js fails
built-ins/Object/getPrototypeOf/15.2.3.2-2-15.js fails
built-ins/Object/getPrototypeOf/15.2.3.2-2-16.js fails
built-ins/Object/getPrototypeOf/15.2.3.2-2-17.js fails
-built-ins/Object/internals/DefineOwnProperty/consistent-value-function-arguments.js fails
-built-ins/Object/internals/DefineOwnProperty/consistent-value-function-caller.js fails
-built-ins/Object/internals/DefineOwnProperty/consistent-value-regexp-$1.js fails
-built-ins/Object/internals/DefineOwnProperty/consistent-writable-regexp-$1.js fails
built-ins/Object/isExtensible/15.2.3.13-1-1.js fails
built-ins/Object/isExtensible/15.2.3.13-1-2.js fails
built-ins/Object/isFrozen/15.2.3.12-1-1.js fails
@@ -1120,143 +1114,32 @@ built-ins/Proxy/setPrototypeOf/toboolean-trap-result-true-target-is-extensible.j
built-ins/Proxy/setPrototypeOf/trap-is-not-callable-realm.js fails
built-ins/Proxy/setPrototypeOf/trap-is-not-callable.js fails
built-ins/Proxy/setPrototypeOf/trap-is-undefined-or-null.js fails
-built-ins/Reflect/Reflect.js fails
-built-ins/Reflect/apply/apply.js fails
-built-ins/Reflect/apply/arguments-list-is-not-array-like.js fails
-built-ins/Reflect/apply/call-target.js fails
-built-ins/Reflect/apply/length.js fails
-built-ins/Reflect/apply/name.js fails
-built-ins/Reflect/apply/return-target-call-result.js fails
-built-ins/Reflect/apply/target-is-not-callable-throws.js fails
-built-ins/Reflect/construct/arguments-list-is-not-array-like.js fails
-built-ins/Reflect/construct/construct.js fails
-built-ins/Reflect/construct/length.js fails
-built-ins/Reflect/construct/name.js fails
built-ins/Reflect/construct/newtarget-is-not-constructor-throws.js fails
built-ins/Reflect/construct/return-with-newtarget-argument.js fails
-built-ins/Reflect/construct/return-without-newtarget-argument.js fails
-built-ins/Reflect/construct/target-is-not-constructor-throws.js fails
-built-ins/Reflect/construct/use-arguments-list.js fails
-built-ins/Reflect/defineProperty/define-properties.js fails
-built-ins/Reflect/defineProperty/define-symbol-properties.js fails
-built-ins/Reflect/defineProperty/defineProperty.js fails
-built-ins/Reflect/defineProperty/length.js fails
-built-ins/Reflect/defineProperty/name.js fails
-built-ins/Reflect/defineProperty/return-abrupt-from-attributes.js fails
-built-ins/Reflect/defineProperty/return-abrupt-from-property-key.js fails
built-ins/Reflect/defineProperty/return-abrupt-from-result.js fails
-built-ins/Reflect/defineProperty/return-boolean.js fails
-built-ins/Reflect/defineProperty/target-is-not-object-throws.js fails
-built-ins/Reflect/defineProperty/target-is-symbol-throws.js fails
-built-ins/Reflect/deleteProperty/delete-properties.js fails
-built-ins/Reflect/deleteProperty/delete-symbol-properties.js fails
-built-ins/Reflect/deleteProperty/deleteProperty.js fails
-built-ins/Reflect/deleteProperty/length.js fails
-built-ins/Reflect/deleteProperty/name.js fails
-built-ins/Reflect/deleteProperty/return-abrupt-from-property-key.js fails
built-ins/Reflect/deleteProperty/return-abrupt-from-result.js fails
-built-ins/Reflect/deleteProperty/return-boolean.js fails
-built-ins/Reflect/deleteProperty/target-is-not-object-throws.js fails
-built-ins/Reflect/deleteProperty/target-is-symbol-throws.js fails
-built-ins/Reflect/enumerate/undefined.js fails
-built-ins/Reflect/get/get.js fails
-built-ins/Reflect/get/length.js fails
-built-ins/Reflect/get/name.js fails
-built-ins/Reflect/get/return-abrupt-from-property-key.js fails
-built-ins/Reflect/get/return-abrupt-from-result.js fails
built-ins/Reflect/get/return-value-from-receiver.js fails
-built-ins/Reflect/get/return-value-from-symbol-key.js fails
-built-ins/Reflect/get/return-value.js fails
-built-ins/Reflect/get/target-is-not-object-throws.js fails
-built-ins/Reflect/get/target-is-symbol-throws.js fails
-built-ins/Reflect/getOwnPropertyDescriptor/getOwnPropertyDescriptor.js fails
-built-ins/Reflect/getOwnPropertyDescriptor/length.js fails
-built-ins/Reflect/getOwnPropertyDescriptor/name.js fails
-built-ins/Reflect/getOwnPropertyDescriptor/return-abrupt-from-property-key.js fails
built-ins/Reflect/getOwnPropertyDescriptor/return-abrupt-from-result.js fails
-built-ins/Reflect/getOwnPropertyDescriptor/return-from-accessor-descriptor.js fails
-built-ins/Reflect/getOwnPropertyDescriptor/return-from-data-descriptor.js fails
-built-ins/Reflect/getOwnPropertyDescriptor/symbol-property.js fails
-built-ins/Reflect/getOwnPropertyDescriptor/target-is-not-object-throws.js fails
-built-ins/Reflect/getOwnPropertyDescriptor/target-is-symbol-throws.js fails
-built-ins/Reflect/getOwnPropertyDescriptor/undefined-own-property.js fails
-built-ins/Reflect/getOwnPropertyDescriptor/undefined-property.js fails
-built-ins/Reflect/getPrototypeOf/getPrototypeOf.js fails
-built-ins/Reflect/getPrototypeOf/length.js fails
-built-ins/Reflect/getPrototypeOf/name.js fails
-built-ins/Reflect/getPrototypeOf/null-prototype.js fails
built-ins/Reflect/getPrototypeOf/return-abrupt-from-result.js fails
-built-ins/Reflect/getPrototypeOf/return-prototype.js fails
-built-ins/Reflect/getPrototypeOf/skip-own-properties.js fails
-built-ins/Reflect/getPrototypeOf/target-is-not-object-throws.js fails
-built-ins/Reflect/getPrototypeOf/target-is-symbol-throws.js fails
-built-ins/Reflect/has/has.js fails
-built-ins/Reflect/has/length.js fails
-built-ins/Reflect/has/name.js fails
-built-ins/Reflect/has/return-abrupt-from-property-key.js fails
built-ins/Reflect/has/return-abrupt-from-result.js fails
-built-ins/Reflect/has/return-boolean.js fails
-built-ins/Reflect/has/symbol-property.js fails
-built-ins/Reflect/has/target-is-not-object-throws.js fails
-built-ins/Reflect/has/target-is-symbol-throws.js fails
-built-ins/Reflect/isExtensible/isExtensible.js fails
-built-ins/Reflect/isExtensible/length.js fails
-built-ins/Reflect/isExtensible/name.js fails
built-ins/Reflect/isExtensible/return-abrupt-from-result.js fails
-built-ins/Reflect/isExtensible/return-boolean.js fails
-built-ins/Reflect/isExtensible/target-is-not-object-throws.js fails
-built-ins/Reflect/isExtensible/target-is-symbol-throws.js fails
-built-ins/Reflect/object-prototype.js fails
-built-ins/Reflect/ownKeys/length.js fails
-built-ins/Reflect/ownKeys/name.js fails
-built-ins/Reflect/ownKeys/ownKeys.js fails
built-ins/Reflect/ownKeys/return-abrupt-from-result.js fails
-built-ins/Reflect/ownKeys/return-array-with-own-keys-only.js fails
-built-ins/Reflect/ownKeys/return-empty-array.js fails
-built-ins/Reflect/ownKeys/return-non-enumerable-keys.js fails
built-ins/Reflect/ownKeys/return-on-corresponding-order.js fails
-built-ins/Reflect/ownKeys/target-is-not-object-throws.js fails
-built-ins/Reflect/ownKeys/target-is-symbol-throws.js fails
-built-ins/Reflect/preventExtensions/always-return-true-from-ordinary-object.js fails
-built-ins/Reflect/preventExtensions/length.js fails
-built-ins/Reflect/preventExtensions/name.js fails
-built-ins/Reflect/preventExtensions/prevent-extensions.js fails
-built-ins/Reflect/preventExtensions/preventExtensions.js fails
built-ins/Reflect/preventExtensions/return-abrupt-from-result.js fails
built-ins/Reflect/preventExtensions/return-boolean-from-proxy-object.js fails
-built-ins/Reflect/preventExtensions/target-is-not-object-throws.js fails
-built-ins/Reflect/preventExtensions/target-is-symbol-throws.js fails
-built-ins/Reflect/properties.js fails
-built-ins/Reflect/set/call-prototype-property-set.js fails
built-ins/Reflect/set/creates-a-data-descriptor.js fails
built-ins/Reflect/set/different-property-descriptors.js fails
-built-ins/Reflect/set/length.js fails
-built-ins/Reflect/set/name.js fails
built-ins/Reflect/set/receiver-is-not-object.js fails
-built-ins/Reflect/set/return-abrupt-from-property-key.js fails
-built-ins/Reflect/set/return-abrupt-from-result.js fails
-built-ins/Reflect/set/return-false-if-receiver-is-not-writable.js fails
built-ins/Reflect/set/return-false-if-target-is-not-writable.js fails
built-ins/Reflect/set/set-value-on-accessor-descriptor-with-receiver.js fails
-built-ins/Reflect/set/set-value-on-accessor-descriptor.js fails
built-ins/Reflect/set/set-value-on-data-descriptor.js fails
-built-ins/Reflect/set/set.js fails
built-ins/Reflect/set/symbol-property.js fails
-built-ins/Reflect/set/target-is-not-object-throws.js fails
-built-ins/Reflect/set/target-is-symbol-throws.js fails
-built-ins/Reflect/setPrototypeOf/length.js fails
-built-ins/Reflect/setPrototypeOf/name.js fails
-built-ins/Reflect/setPrototypeOf/proto-is-not-object-and-not-null-throws.js fails
-built-ins/Reflect/setPrototypeOf/proto-is-symbol-throws.js fails
built-ins/Reflect/setPrototypeOf/return-abrupt-from-result.js fails
built-ins/Reflect/setPrototypeOf/return-false-if-target-and-proto-are-the-same.js fails
built-ins/Reflect/setPrototypeOf/return-false-if-target-is-not-extensible.js fails
built-ins/Reflect/setPrototypeOf/return-false-if-target-is-prototype-of-proto.js fails
built-ins/Reflect/setPrototypeOf/return-true-if-new-prototype-is-set.js fails
built-ins/Reflect/setPrototypeOf/return-true-if-proto-is-current.js fails
-built-ins/Reflect/setPrototypeOf/setPrototypeOf.js fails
-built-ins/Reflect/setPrototypeOf/target-is-not-object-throws.js fails
-built-ins/Reflect/setPrototypeOf/target-is-symbol-throws.js fails
built-ins/RegExp/15.10.4.1-1.js fails
built-ins/RegExp/S15.10.2.12_A2_T1.js fails
built-ins/RegExp/S15.10.3.1_A2_T1.js fails
@@ -2034,21 +1917,17 @@ built-ins/TypedArrays/ctors/buffer-arg/detachedbuffer.js fails
built-ins/TypedArrays/ctors/buffer-arg/length-to-number-detachbuffer.js fails
built-ins/TypedArrays/ctors/buffer-arg/proto-from-ctor-realm.js fails
built-ins/TypedArrays/ctors/buffer-arg/use-custom-proto-if-object.js fails
-built-ins/TypedArrays/ctors/buffer-arg/use-default-proto-if-custom-proto-is-not-object.js fails
built-ins/TypedArrays/ctors/length-arg/custom-proto-access-throws.js fails
built-ins/TypedArrays/ctors/length-arg/proto-from-ctor-realm.js fails
built-ins/TypedArrays/ctors/length-arg/use-custom-proto-if-object.js fails
-built-ins/TypedArrays/ctors/length-arg/use-default-proto-if-custom-proto-is-not-object.js fails
built-ins/TypedArrays/ctors/no-args/custom-proto-access-throws.js fails
built-ins/TypedArrays/ctors/no-args/proto-from-ctor-realm.js fails
built-ins/TypedArrays/ctors/no-args/use-custom-proto-if-object.js fails
-built-ins/TypedArrays/ctors/no-args/use-default-proto-if-custom-proto-is-not-object.js fails
built-ins/TypedArrays/ctors/object-arg/as-generator-iterable-returns.js fails
built-ins/TypedArrays/ctors/object-arg/custom-proto-access-throws.js fails
built-ins/TypedArrays/ctors/object-arg/iterator-not-callable-throws.js fails
built-ins/TypedArrays/ctors/object-arg/proto-from-ctor-realm.js fails
built-ins/TypedArrays/ctors/object-arg/use-custom-proto-if-object.js fails
-built-ins/TypedArrays/ctors/object-arg/use-default-proto-if-custom-proto-is-not-object.js fails
built-ins/TypedArrays/ctors/typedarray-arg/custom-proto-access-throws.js fails
built-ins/TypedArrays/ctors/typedarray-arg/detached-when-species-retrieved-different-type.js fails
built-ins/TypedArrays/ctors/typedarray-arg/detached-when-species-retrieved-same-type.js fails
@@ -2064,7 +1943,6 @@ built-ins/TypedArrays/ctors/typedarray-arg/same-ctor-buffer-ctor-species-not-cto
built-ins/TypedArrays/ctors/typedarray-arg/same-ctor-buffer-ctor-species-prototype-throws.js fails
built-ins/TypedArrays/ctors/typedarray-arg/same-ctor-buffer-ctor-value-not-obj-throws.js fails
built-ins/TypedArrays/ctors/typedarray-arg/use-custom-proto-if-object.js fails
-built-ins/TypedArrays/ctors/typedarray-arg/use-default-proto-if-custom-proto-is-not-object.js fails
built-ins/TypedArrays/from/arylk-get-length-error.js fails
built-ins/TypedArrays/from/arylk-to-length-error.js fails
built-ins/TypedArrays/from/custom-ctor-returns-other-instance.js fails
@@ -2095,19 +1973,13 @@ built-ins/TypedArrays/internals/DefineOwnProperty/detached-buffer.js fails
built-ins/TypedArrays/internals/DefineOwnProperty/key-is-greater-than-last-index.js fails
built-ins/TypedArrays/internals/DefineOwnProperty/key-is-lower-than-zero.js fails
built-ins/TypedArrays/internals/DefineOwnProperty/key-is-minus-zero.js fails
-built-ins/TypedArrays/internals/DefineOwnProperty/key-is-not-canonical-index.js fails
built-ins/TypedArrays/internals/DefineOwnProperty/key-is-not-integer.js fails
-built-ins/TypedArrays/internals/DefineOwnProperty/key-is-not-numeric-index.js fails
built-ins/TypedArrays/internals/DefineOwnProperty/key-is-numericindex-accessor-desc.js fails
built-ins/TypedArrays/internals/DefineOwnProperty/key-is-numericindex-desc-configurable.js fails
built-ins/TypedArrays/internals/DefineOwnProperty/key-is-numericindex-desc-not-enumerable.js fails
built-ins/TypedArrays/internals/DefineOwnProperty/key-is-numericindex-desc-not-writable.js fails
built-ins/TypedArrays/internals/DefineOwnProperty/key-is-numericindex.js fails
-built-ins/TypedArrays/internals/DefineOwnProperty/key-is-symbol.js fails
-built-ins/TypedArrays/internals/DefineOwnProperty/non-extensible-new-key.js fails
-built-ins/TypedArrays/internals/DefineOwnProperty/non-extensible-redefine-key.js fails
built-ins/TypedArrays/internals/DefineOwnProperty/set-value.js fails
-built-ins/TypedArrays/internals/DefineOwnProperty/this-is-not-extensible.js fails
built-ins/TypedArrays/internals/DefineOwnProperty/tonumber-value-detached-buffer.js fails
built-ins/TypedArrays/internals/Get/detached-buffer-key-is-not-numeric-index.js fails
built-ins/TypedArrays/internals/Get/detached-buffer-key-is-symbol.js fails
@@ -2128,16 +2000,10 @@ built-ins/TypedArrays/internals/HasProperty/detached-buffer-key-is-not-number.js
built-ins/TypedArrays/internals/HasProperty/detached-buffer-key-is-symbol.js fails
built-ins/TypedArrays/internals/HasProperty/detached-buffer-realm.js fails
built-ins/TypedArrays/internals/HasProperty/detached-buffer.js fails
-built-ins/TypedArrays/internals/HasProperty/indexed-value.js fails
built-ins/TypedArrays/internals/HasProperty/infinity-with-detached-buffer.js sloppyFails
-built-ins/TypedArrays/internals/HasProperty/inherited-property.js fails
-built-ins/TypedArrays/internals/HasProperty/key-is-greater-than-last-index.js fails
built-ins/TypedArrays/internals/HasProperty/key-is-lower-than-zero.js fails
built-ins/TypedArrays/internals/HasProperty/key-is-minus-zero.js fails
-built-ins/TypedArrays/internals/HasProperty/key-is-not-canonical-index.js fails
built-ins/TypedArrays/internals/HasProperty/key-is-not-integer.js fails
-built-ins/TypedArrays/internals/HasProperty/key-is-not-numeric-index.js fails
-built-ins/TypedArrays/internals/HasProperty/key-is-symbol.js fails
built-ins/TypedArrays/internals/OwnPropertyKeys/integer-indexes-and-string-and-symbol-keys-.js fails
built-ins/TypedArrays/internals/OwnPropertyKeys/integer-indexes-and-string-keys.js fails
built-ins/TypedArrays/internals/OwnPropertyKeys/integer-indexes.js fails
@@ -3620,7 +3486,6 @@ language/expressions/template-literal/tv-template-middle.js fails
language/expressions/template-literal/tv-template-tail.js fails
language/expressions/template-literal/tv-utf16-escape-sequence.js fails
language/expressions/template-literal/tv-zwnbsp.js fails
-language/expressions/typeof/built-in-ordinary-objects-no-call.js fails
language/expressions/yield/star-array.js fails
language/expressions/yield/star-in-rltn-expr.js fails
language/expressions/yield/star-iterable.js fails
diff --git a/tests/auto/qml/qjsengine/tst_qjsengine.cpp b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
index cb167fb6bf..08f69618c4 100644
--- a/tests/auto/qml/qjsengine/tst_qjsengine.cpp
+++ b/tests/auto/qml/qjsengine/tst_qjsengine.cpp
@@ -972,6 +972,7 @@ void tst_QJSEngine::globalObjectProperties_enumerate()
<< "Float64Array"
<< "Set"
<< "Map"
+ << "Reflect"
;
QSet<QString> actualNames;
{