diff options
Diffstat (limited to 'src/qml/qml/qqmltypewrapper_p.h')
-rw-r--r-- | src/qml/qml/qqmltypewrapper_p.h | 135 |
1 files changed, 84 insertions, 51 deletions
diff --git a/src/qml/qml/qqmltypewrapper_p.h b/src/qml/qml/qqmltypewrapper_p.h index 7dc3f55310..fa859dd118 100644 --- a/src/qml/qml/qqmltypewrapper_p.h +++ b/src/qml/qml/qqmltypewrapper_p.h @@ -1,41 +1,5 @@ -/**************************************************************************** -** -** Copyright (C) 2016 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$ -** -****************************************************************************/ +// Copyright (C) 2016 The Qt Company Ltd. +// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef QV8TYPEWRAPPER_P_H #define QV8TYPEWRAPPER_P_H @@ -55,7 +19,8 @@ #include <QtCore/qpointer.h> #include <private/qv4value_p.h> -#include <private/qv4object_p.h> +#include <private/qv4functionobject_p.h> +#include <private/qv4qmetaobjectwrapper_p.h> QT_BEGIN_NAMESPACE @@ -68,24 +33,65 @@ namespace QV4 { namespace Heap { -struct QQmlTypeWrapper : Object { - enum TypeNameMode { - IncludeEnums, - ExcludeEnums +struct QQmlTypeWrapper : FunctionObject { + + enum TypeNameMode : quint8 { + ExcludeEnums = 0x0, + IncludeEnums = 0x1, + TypeNameModeMask = 0x1, + }; + + enum Kind : quint8 { + Type = 0x0, + Namespace = 0x2, + KindMask = 0x2 }; - void init(); + void init(TypeNameMode m, QObject *o, const QQmlTypePrivate *type); + void init(TypeNameMode m, QObject *o, QQmlTypeNameCache *type, const QQmlImportRef *import); + void destroy(); - TypeNameMode mode; - QQmlQPointer<QObject> object; + + const QMetaObject *metaObject() const { return type().metaObject(); } + QMetaType metaType() const { return type().typeId(); } QQmlType type() const; + TypeNameMode typeNameMode() const { return TypeNameMode(flags & TypeNameModeMask); } + Kind kind() const { return Kind(flags & KindMask); } + + const QQmlPropertyData *ensureConstructorsCache( + const QMetaObject *metaObject, QMetaType metaType) + { + Q_ASSERT(kind() == Type); + if (!t.constructors && metaObject) { + t.constructors = QMetaObjectWrapper::createConstructors(metaObject, metaType); + warnIfUncreatable(); + } + return t.constructors; + } + void warnIfUncreatable() const; + + QQmlTypeNameCache::Result queryNamespace( + const QV4::String *name, QQmlEnginePrivate *enginePrivate) const; + + QV4QPointer<QObject> object; + + union { + struct { + const QQmlTypePrivate *typePrivate; + const QQmlPropertyData *constructors; + } t; + struct { + QQmlTypeNameCache *typeNamespace; + const QQmlImportRef *importNamespace; + } n; + }; - const QQmlTypePrivate *typePrivate; - QQmlTypeNameCache *typeNamespace; - const QQmlImportRef *importNamespace; + quint8 flags; }; +using QQmlTypeConstructor = QQmlTypeWrapper; + struct QQmlScopedEnumWrapper : Object { void init() { Object::init(); } void destroy(); @@ -96,16 +102,21 @@ struct QQmlScopedEnumWrapper : Object { } -struct Q_QML_EXPORT QQmlTypeWrapper : Object +struct Q_QML_EXPORT QQmlTypeWrapper : FunctionObject { - V4_OBJECT2(QQmlTypeWrapper, Object) + V4_OBJECT2(QQmlTypeWrapper, FunctionObject) + V4_PROTOTYPE(typeWrapperPrototype) V4_NEEDS_DESTROY bool isSingleton() const; + const QMetaObject *metaObject() const; + QObject *object() const; QObject *singletonObject() const; QVariant toVariant() const; + static void initProto(ExecutionEngine *v4); + static ReturnedValue create(ExecutionEngine *, QObject *, const QQmlType &, Heap::QQmlTypeWrapper::TypeNameMode = Heap::QQmlTypeWrapper::IncludeEnums); static ReturnedValue create(ExecutionEngine *, QObject *, const QQmlRefPointer<QQmlTypeNameCache> &, const QQmlImportRef *, @@ -113,8 +124,11 @@ struct Q_QML_EXPORT QQmlTypeWrapper : Object static ReturnedValue virtualResolveLookupGetter(const Object *object, ExecutionEngine *engine, Lookup *lookup); static bool virtualResolveLookupSetter(Object *object, ExecutionEngine *engine, Lookup *lookup, const Value &value); + static OwnPropertyKeyIterator *virtualOwnPropertyKeys(const Object *m, Value *target); + static int virtualMetacall(Object *object, QMetaObject::Call call, int index, void **a); static ReturnedValue lookupSingletonProperty(Lookup *l, ExecutionEngine *engine, const Value &base); + static ReturnedValue lookupSingletonMethod(Lookup *l, ExecutionEngine *engine, const Value &base); static ReturnedValue lookupEnumValue(Lookup *l, ExecutionEngine *engine, const Value &base); static ReturnedValue lookupScopedEnum(Lookup *l, ExecutionEngine *engine, const Value &base); @@ -124,6 +138,25 @@ protected: static PropertyAttributes virtualGetOwnProperty(const Managed *m, PropertyKey id, Property *p); static bool virtualIsEqualTo(Managed *that, Managed *o); static ReturnedValue virtualInstanceOf(const Object *typeObject, const Value &var); + +private: + static ReturnedValue method_hasInstance( + const FunctionObject *, const Value *thisObject, const Value *argv, int argc); + static ReturnedValue method_toString( + const FunctionObject *b, const Value *thisObject, const Value *, int); +}; + +struct QQmlTypeConstructor : QQmlTypeWrapper +{ + V4_OBJECT2(QQmlTypeConstructor, QQmlTypeWrapper) + + static ReturnedValue virtualCallAsConstructor( + const FunctionObject *f, const Value *argv, int argc, const Value *) + { + Q_ASSERT(f->as<QQmlTypeWrapper>()); + return QMetaObjectWrapper::construct( + static_cast<const QQmlTypeWrapper *>(f)->d(), argv, argc); + } }; struct Q_QML_EXPORT QQmlScopedEnumWrapper : Object |