Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qv4vtable_p.h
Go to the documentation of this file.
1// Copyright (C) 2018 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#ifndef QV4VTABLE_P_H
4#define QV4VTABLE_P_H
5
6//
7// W A R N I N G
8// -------------
9//
10// This file is not part of the Qt API. It exists purely as an
11// implementation detail. This header file may change from version to
12// version without notice, or even be removed.
13//
14// We mean it.
15//
16
17#include "qv4global_p.h"
18#include <QtCore/qmetaobject.h>
19
21
22class QObject;
23namespace QV4 {
24
25struct Lookup;
26
27struct Q_QML_PRIVATE_EXPORT OwnPropertyKeyIterator {
28 virtual ~OwnPropertyKeyIterator() = 0;
29 virtual PropertyKey next(const Object *o, Property *p = nullptr, PropertyAttributes *attrs = nullptr) = 0;
30};
31
32struct VTable
33{
34 typedef void (*Destroy)(Heap::Base *);
35 typedef void (*MarkObjects)(Heap::Base *, MarkStack *markStack);
36 typedef bool (*IsEqualTo)(Managed *m, Managed *other);
37
38 typedef ReturnedValue (*Get)(const Managed *, PropertyKey id, const Value *receiver, bool *hasProperty);
39 typedef bool (*Put)(Managed *, PropertyKey id, const Value &value, Value *receiver);
41 typedef bool (*HasProperty)(const Managed *m, PropertyKey id);
44 typedef bool (*IsExtensible)(const Managed *);
45 typedef bool (*PreventExtensions)(Managed *);
46 typedef Heap::Object *(*GetPrototypeOf)(const Managed *);
47 typedef bool (*SetPrototypeOf)(Managed *, const Object *);
48 typedef qint64 (*GetLength)(const Managed *m);
49 typedef OwnPropertyKeyIterator *(*OwnPropertyKeys)(const Object *m, Value *target);
50 typedef ReturnedValue (*InstanceOf)(const Object *typeObject, const Value &var);
51
52 typedef ReturnedValue (*Call)(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
53 typedef void (*CallWithMetaTypes)(const FunctionObject *, QObject *, void **, const QMetaType *, int);
54 typedef ReturnedValue (*CallAsConstructor)(const FunctionObject *, const Value *argv, int argc, const Value *newTarget);
55
57 typedef bool (*ResolveLookupSetter)(Object *, ExecutionEngine *, Lookup *, const Value &);
58
59 typedef int (*Metacall)(Object *, QMetaObject::Call, int, void **);
60
61 const VTable * const parent;
73 const char *className;
74
78
92
96
99
101};
102
103template<VTable::CallWithMetaTypes call>
105
106template<VTable::Call call>
107struct VTableCallWrapper { constexpr static VTable::Call c = call; };
108
109template<class Class>
111{
112 // If Class overrides virtualCallWithMetaTypes, return that.
113 // Otherwise, if it overrides virtualCall, return nullptr so that we convert calls.
114 // Otherwise, just return whatever the base class had.
115
116 // A simple != is not considered constexpr, so we have to jump through some hoops.
117 if constexpr (!std::is_same_v<
120 return Class::virtualCallWithMetaTypes;
121 }
122
123 if constexpr (!std::is_same_v<
126 return nullptr;
127 }
128
129 return Class::virtualCallWithMetaTypes;
130}
131
132template<class Class>
134{
135 // If Class overrides virtualCall, return that.
136 // Otherwise, if it overrides virtualCallWithMetaTypes, return nullptr so that we convert calls.
137 // Otherwise, just return whatever the base class had.
138
139 // A simple != is not considered constexpr, so we have to jump through some hoops.
140 if constexpr (!std::is_same_v<
143 return Class::virtualCall;
144 }
145
146 if constexpr (!std::is_same_v<
149 return nullptr;
150 }
151
152 return Class::virtualCall;
153}
154
156protected:
157 static constexpr VTable::Destroy virtualDestroy = nullptr;
158 static constexpr VTable::IsEqualTo virtualIsEqualTo = nullptr;
159
160 static constexpr VTable::Get virtualGet = nullptr;
161 static constexpr VTable::Put virtualPut = nullptr;
163 static constexpr VTable::HasProperty virtualHasProperty = nullptr;
166 static constexpr VTable::IsExtensible virtualIsExtensible = nullptr;
170 static constexpr VTable::GetLength virtualGetLength = nullptr;
172 static constexpr VTable::InstanceOf virtualInstanceOf = nullptr;
173
174 static constexpr VTable::Call virtualCall = nullptr;
177
180
181 static constexpr VTable::Metacall virtualMetacall = nullptr;
182
183 template<class Class>
185
186 template<class Class>
187 friend constexpr VTable::Call vtableJsTypesCallEntry();
188};
189
190#define DEFINE_MANAGED_VTABLE_INT(classname, parentVTable) \
191{ \
192 parentVTable, \
193 (sizeof(classname::Data) + sizeof(QV4::Value) - 1)/sizeof(QV4::Value), \
194 (sizeof(classname::Data) + (classname::NInlineProperties*sizeof(QV4::Value)) + QV4::Chunk::SlotSize - 1)/QV4::Chunk::SlotSize*QV4::Chunk::SlotSize/sizeof(QV4::Value) \
195 - (sizeof(classname::Data) + sizeof(QV4::Value) - 1)/sizeof(QV4::Value), \
196 classname::IsExecutionContext, \
197 classname::IsString, \
198 classname::IsObject, \
199 classname::IsFunctionObject, \
200 classname::IsErrorObject, \
201 classname::IsArrayData, \
202 classname::IsStringOrSymbol, \
203 classname::MyType, \
204 { 0, 0, 0, 0 }, \
205 #classname, \
206 \
207 classname::virtualDestroy, \
208 classname::Data::markObjects, \
209 classname::virtualIsEqualTo, \
210 \
211 classname::virtualGet, \
212 classname::virtualPut, \
213 classname::virtualDeleteProperty, \
214 classname::virtualHasProperty, \
215 classname::virtualGetOwnProperty, \
216 classname::virtualDefineOwnProperty, \
217 classname::virtualIsExtensible, \
218 classname::virtualPreventExtensions, \
219 classname::virtualGetPrototypeOf, \
220 classname::virtualSetPrototypeOf, \
221 classname::virtualGetLength, \
222 classname::virtualOwnPropertyKeys, \
223 classname::virtualInstanceOf, \
224 \
225 QV4::vtableJsTypesCallEntry<classname>(), \
226 classname::virtualCallAsConstructor, \
227 QV4::vtableMetaTypesCallEntry<classname>(), \
228 \
229 classname::virtualResolveLookupGetter, \
230 classname::virtualResolveLookupSetter, \
231 classname::virtualMetacall \
232}
233
234#define DEFINE_MANAGED_VTABLE(classname) \
235const QV4::VTable classname::static_vtbl = DEFINE_MANAGED_VTABLE_INT(classname, 0)
236
237#define V4_OBJECT2(DataClass, superClass) \
238 private: \
239 DataClass() = delete; \
240 Q_DISABLE_COPY(DataClass) \
241 public: \
242 Q_MANAGED_CHECK \
243 typedef QV4::Heap::DataClass Data; \
244 typedef superClass SuperClass; \
245 static const QV4::VTable static_vtbl; \
246 static inline const QV4::VTable *staticVTable() { return &static_vtbl; } \
247 V4_MANAGED_SIZE_TEST \
248 QV4::Heap::DataClass *d_unchecked() const { return static_cast<QV4::Heap::DataClass *>(m()); } \
249 QV4::Heap::DataClass *d() const { \
250 QV4::Heap::DataClass *dptr = d_unchecked(); \
251 dptr->_checkIsInitialized(); \
252 return dptr; \
253 } \
254 Q_STATIC_ASSERT(std::is_trivial_v<QV4::Heap::DataClass>);
255
256#define V4_PROTOTYPE(p) \
257 static QV4::Object *defaultPrototype(QV4::ExecutionEngine *e) \
258 { return e->p(); }
259
260
261#define DEFINE_OBJECT_VTABLE_BASE(classname) \
262 const QV4::VTable classname::static_vtbl = DEFINE_MANAGED_VTABLE_INT(classname, (std::is_same<classname::SuperClass, Object>::value) ? nullptr : &classname::SuperClass::static_vtbl)
263
264#define DEFINE_OBJECT_VTABLE(classname) \
265DEFINE_OBJECT_VTABLE_BASE(classname)
266
267#define DEFINE_OBJECT_TEMPLATE_VTABLE(classname) \
268template<> DEFINE_OBJECT_VTABLE_BASE(classname)
269
270}
271
273
274#endif
\inmodule QtCore
Definition qmetatype.h:320
\inmodule QtCore
Definition qobject.h:90
Combined button and popup list for selecting options.
\qmltype Particle \inqmlmodule QtQuick.Particles
quint64 ReturnedValue
constexpr VTable::Call vtableJsTypesCallEntry()
constexpr VTable::CallWithMetaTypes vtableMetaTypesCallEntry()
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 return DBusMessage return DBusMessage const char return DBusMessage dbus_bool_t return DBusMessage dbus_uint32_t return DBusMessage void
static struct AttrInfo attrs[]
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
const GLfloat * m
GLenum GLuint id
[7]
GLenum target
const GLubyte * c
GLfloat GLfloat p
[1]
unsigned short quint16
Definition qtypes.h:43
long long qint64
Definition qtypes.h:55
unsigned char quint8
Definition qtypes.h:41
QSharedPointer< T > other(t)
[5]
virtual PropertyKey next(const Object *o, Property *p=nullptr, PropertyAttributes *attrs=nullptr)=0
static constexpr VTable::SetPrototypeOf virtualSetPrototypeOf
static constexpr VTable::DefineOwnProperty virtualDefineOwnProperty
static constexpr VTable::OwnPropertyKeys virtualOwnPropertyKeys
static constexpr VTable::GetOwnProperty virtualGetOwnProperty
static constexpr VTable::CallAsConstructor virtualCallAsConstructor
static constexpr VTable::Call virtualCall
static constexpr VTable::PreventExtensions virtualPreventExtensions
static constexpr VTable::GetPrototypeOf virtualGetPrototypeOf
friend constexpr VTable::Call vtableJsTypesCallEntry()
static constexpr VTable::DeleteProperty virtualDeleteProperty
static constexpr VTable::Get virtualGet
static constexpr VTable::Metacall virtualMetacall
static constexpr VTable::GetLength virtualGetLength
static constexpr VTable::CallWithMetaTypes virtualCallWithMetaTypes
static constexpr VTable::InstanceOf virtualInstanceOf
static constexpr VTable::HasProperty virtualHasProperty
static constexpr VTable::Put virtualPut
static constexpr VTable::IsEqualTo virtualIsEqualTo
static constexpr VTable::ResolveLookupGetter virtualResolveLookupGetter
static constexpr VTable::Destroy virtualDestroy
friend constexpr VTable::CallWithMetaTypes vtableMetaTypesCallEntry()
static constexpr VTable::ResolveLookupSetter virtualResolveLookupSetter
static constexpr VTable::IsExtensible virtualIsExtensible
const VTable *const parent
Definition qv4vtable_p.h:61
ResolveLookupSetter resolveLookupSetter
Definition qv4vtable_p.h:98
GetPrototypeOf getPrototypeOf
Definition qv4vtable_p.h:87
ReturnedValue(* CallAsConstructor)(const FunctionObject *, const Value *argv, int argc, const Value *newTarget)
Definition qv4vtable_p.h:54
GetLength getLength
Definition qv4vtable_p.h:89
quint16 inlinePropertyOffset
Definition qv4vtable_p.h:62
InstanceOf instanceOf
Definition qv4vtable_p.h:91
CallWithMetaTypes callWithMetaTypes
Definition qv4vtable_p.h:95
bool(* PreventExtensions)(Managed *)
Definition qv4vtable_p.h:45
ReturnedValue(* Call)(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
Definition qv4vtable_p.h:52
OwnPropertyKeyIterator *(* OwnPropertyKeys)(const Object *m, Value *target)
Definition qv4vtable_p.h:49
PreventExtensions preventExtensions
Definition qv4vtable_p.h:86
CallAsConstructor callAsConstructor
Definition qv4vtable_p.h:94
quint8 isObject
Definition qv4vtable_p.h:66
OwnPropertyKeys ownPropertyKeys
Definition qv4vtable_p.h:90
GetOwnProperty getOwnProperty
Definition qv4vtable_p.h:83
bool(* HasProperty)(const Managed *m, PropertyKey id)
Definition qv4vtable_p.h:41
bool(* DeleteProperty)(Managed *m, PropertyKey id)
Definition qv4vtable_p.h:40
quint8 isArrayData
Definition qv4vtable_p.h:69
DefineOwnProperty defineOwnProperty
Definition qv4vtable_p.h:84
quint8 isString
Definition qv4vtable_p.h:65
int(* Metacall)(Object *, QMetaObject::Call, int, void **)
Definition qv4vtable_p.h:59
IsEqualTo isEqualTo
Definition qv4vtable_p.h:77
ReturnedValue(* InstanceOf)(const Object *typeObject, const Value &var)
Definition qv4vtable_p.h:50
DeleteProperty deleteProperty
Definition qv4vtable_p.h:81
void(* CallWithMetaTypes)(const FunctionObject *, QObject *, void **, const QMetaType *, int)
Definition qv4vtable_p.h:53
quint8 isFunctionObject
Definition qv4vtable_p.h:67
bool(* IsEqualTo)(Managed *m, Managed *other)
Definition qv4vtable_p.h:36
quint8 isErrorObject
Definition qv4vtable_p.h:68
bool(* ResolveLookupSetter)(Object *, ExecutionEngine *, Lookup *, const Value &)
Definition qv4vtable_p.h:57
void(* Destroy)(Heap::Base *)
Definition qv4vtable_p.h:34
bool(* DefineOwnProperty)(Managed *m, PropertyKey id, const Property *p, PropertyAttributes attrs)
Definition qv4vtable_p.h:43
Metacall metacall
const char * className
Definition qv4vtable_p.h:73
Heap::Object *(* GetPrototypeOf)(const Managed *)
Definition qv4vtable_p.h:46
bool(* IsExtensible)(const Managed *)
Definition qv4vtable_p.h:44
quint8 unused[4]
Definition qv4vtable_p.h:72
quint8 isStringOrSymbol
Definition qv4vtable_p.h:70
MarkObjects markObjects
Definition qv4vtable_p.h:76
IsExtensible isExtensible
Definition qv4vtable_p.h:85
quint8 type
Definition qv4vtable_p.h:71
HasProperty hasProperty
Definition qv4vtable_p.h:82
ReturnedValue(* ResolveLookupGetter)(const Object *, ExecutionEngine *, Lookup *)
Definition qv4vtable_p.h:56
quint16 nInlineProperties
Definition qv4vtable_p.h:63
void(* MarkObjects)(Heap::Base *, MarkStack *markStack)
Definition qv4vtable_p.h:35
bool(* Put)(Managed *, PropertyKey id, const Value &value, Value *receiver)
Definition qv4vtable_p.h:39
PropertyAttributes(* GetOwnProperty)(const Managed *m, PropertyKey id, Property *p)
Definition qv4vtable_p.h:42
SetPrototypeOf setPrototypeOf
Definition qv4vtable_p.h:88
ReturnedValue(* Get)(const Managed *, PropertyKey id, const Value *receiver, bool *hasProperty)
Definition qv4vtable_p.h:38
Destroy destroy
Definition qv4vtable_p.h:75
qint64(* GetLength)(const Managed *m)
Definition qv4vtable_p.h:48
quint8 isExecutionContext
Definition qv4vtable_p.h:64
ResolveLookupGetter resolveLookupGetter
Definition qv4vtable_p.h:97
bool(* SetPrototypeOf)(Managed *, const Object *)
Definition qv4vtable_p.h:47