Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qv4qmetaobjectwrapper.cpp
Go to the documentation of this file.
1// Copyright (C) 2024 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
5
6#include <private/qqmlobjectorgadget_p.h>
7#include <private/qv4jscall_p.h>
8#include <private/qv4qobjectwrapper_p.h>
9
11
12using namespace Qt::StringLiterals;
13
14namespace QV4 {
15
17{
18 FunctionObject::init();
19 this->metaObject = metaObject;
20 constructors = nullptr;
22}
23
28
30
31 const int count = metaObject->constructorCount();
32 if (constructorCount != count) {
33 delete[] constructors;
34 constructorCount = count;
35 if (count == 0) {
36 constructors = nullptr;
37 return;
38 }
40
41 for (int i = 0; i < count; ++i) {
42 QMetaMethod method = metaObject->constructor(i);
44 d.load(method);
45 d.setCoreIndex(i);
46 }
47 }
48}
49
50
52
53 Scope scope(engine);
54 Scoped<QMetaObjectWrapper> mo(scope, engine->memoryManager->allocate<QMetaObjectWrapper>(metaObject)->asReturnedValue());
55 mo->init(engine);
56 return mo->asReturnedValue();
57}
58
60 const QMetaObject & mo = *d()->metaObject;
61
62 for (int i = 0; i < mo.enumeratorCount(); i++) {
63 QMetaEnum Enum = mo.enumerator(i);
64 for (int k = 0; k < Enum.keyCount(); k++) {
65 const char* key = Enum.key(k);
66 const int value = Enum.value(k);
68 }
69 }
70}
71
73{
74 const QMetaObjectWrapper *This = static_cast<const QMetaObjectWrapper*>(f);
75 return This->constructInternal(argv, argc);
76}
77
78ReturnedValue QMetaObjectWrapper::constructInternal(const Value *argv, int argc) const
79{
80
81 d()->ensureConstructorsCache();
82
83 ExecutionEngine *v4 = engine();
84 const QMetaObject* mo = d()->metaObject;
85 if (d()->constructorCount == 0) {
86 return v4->throwTypeError(QLatin1String(mo->className())
87 + QLatin1String(" has no invokable constructor"));
88 }
89
90 Scope scope(v4);
91 Scoped<QObjectWrapper> object(scope);
92 JSCallData cData(nullptr, argv, argc);
93 CallData *callData = cData.callData(scope);
94
95 const QQmlObjectOrGadget objectOrGadget(mo);
96
97 if (d()->constructorCount == 1) {
98 object = QObjectMethod::callPrecise(
99 objectOrGadget, d()->constructors[0], v4, callData, QMetaObject::CreateInstance);
100 } else if (const QQmlPropertyData *ctor = QObjectMethod::resolveOverloaded(
101 objectOrGadget, d()->constructors, d()->constructorCount, v4, callData)) {
102 object = QObjectMethod::callPrecise(
103 objectOrGadget, *ctor, v4, callData, QMetaObject::CreateInstance);
104 }
105 if (object) {
106 Scoped<QMetaObjectWrapper> metaObject(scope, this);
107 object->defineDefaultProperty(v4->id_constructor(), metaObject);
108 object->setPrototypeOf(const_cast<QMetaObjectWrapper*>(this));
109 }
110
111 return object.asReturnedValue();
112}
113
115{
116 const QMetaObjectWrapper *aMetaObject = a->as<QMetaObjectWrapper>();
117 Q_ASSERT(aMetaObject);
118 const QMetaObjectWrapper *bMetaObject = b->as<QMetaObjectWrapper>();
119 return bMetaObject && aMetaObject->metaObject() == bMetaObject->metaObject();
120}
121
123
124} // namespace QV4
125
\inmodule QtCore
\inmodule QtCore
Definition qmetaobject.h:19
void load(const QMetaProperty &)
ObjectType::Data * allocate(Args &&... args)
Definition qv4mm_p.h:298
auto mo
[7]
Combined button and popup list for selecting options.
quint64 ReturnedValue
DBusConnection const char DBusError DBusBusType DBusError return DBusConnection DBusHandleMessageFunction void DBusFreeFunction return DBusConnection return DBusConnection return const char DBusError return DBusConnection DBusMessage dbus_uint32_t return DBusConnection dbus_bool_t DBusConnection DBusAddWatchFunction DBusRemoveWatchFunction DBusWatchToggledFunction void DBusFreeFunction return DBusConnection DBusDispatchStatusFunction void DBusFreeFunction DBusTimeout return DBusTimeout return DBusWatch return DBusWatch unsigned int return DBusError const DBusError return const DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessage return DBusMessageIter int const void return DBusMessageIter DBusMessageIter return DBusMessageIter void DBusMessageIter void int return DBusMessage DBusMessageIter return DBusMessageIter return DBusMessageIter DBusMessageIter const char const char const char const char * method
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
GLboolean GLboolean GLboolean b
GLuint64 key
GLboolean GLboolean GLboolean GLboolean a
[7]
GLenum GLenum GLsizei count
GLuint object
[3]
GLfloat GLfloat f
Members constructors(const Members &candidates, QTypeRevision maxMajorVersion)
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
QLatin1StringView QLatin1String
Definition qstringfwd.h:31
#define DEFINE_OBJECT_VTABLE(classname)
obj metaObject() -> className()
QJSEngine engine
[0]
\inmodule QtCore
MemoryManager * memoryManager
String * id_constructor() const
ReturnedValue throwTypeError()
void init(const QMetaObject *metaObject)
ExecutionEngine * engine() const
void defineReadonlyProperty(const QString &name, const Value &value)
static V4_NEEDS_DESTROY ReturnedValue create(ExecutionEngine *engine, const QMetaObject *metaObject)
const QMetaObject * metaObject() const
constexpr ReturnedValue asReturnedValue() const
static constexpr VTable::CallAsConstructor virtualCallAsConstructor
static constexpr VTable::IsEqualTo virtualIsEqualTo
static constexpr Value fromInt32(int i)
Definition qv4value_p.h:187
const T * as() const
Definition qv4value_p.h:132