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
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_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 convertAndCall.
114 // Otherwise, just return whatever the base class had.
115
116 // A simple == on methods is not considered constexpr, so we have to jump through some hoops.
117
118 static_assert(
119 std::is_same_v<
120 VTableCallWithMetaTypesWrapper<Class::virtualCallWithMetaTypes>,
121 VTableCallWithMetaTypesWrapper<Class::SuperClass::virtualCallWithMetaTypes>>
122 || !std::is_same_v<
123 VTableCallWithMetaTypesWrapper<Class::virtualCallWithMetaTypes>,
124 VTableCallWithMetaTypesWrapper<nullptr>>,
125 "You mustn't override virtualCallWithMetaTypes with nullptr");
126
127 static_assert(
128 std::is_same_v<
129 VTableCallWithMetaTypesWrapper<Class::virtualConvertAndCall>,
130 VTableCallWithMetaTypesWrapper<Class::SuperClass::virtualConvertAndCall>>
131 || !std::is_same_v<
132 VTableCallWithMetaTypesWrapper<Class::virtualConvertAndCall>,
133 VTableCallWithMetaTypesWrapper<nullptr>>,
134 "You mustn't override virtualConvertAndCall with nullptr");
135
136 if constexpr (
137 std::is_same_v<
138 VTableCallWithMetaTypesWrapper<Class::virtualCallWithMetaTypes>,
139 VTableCallWithMetaTypesWrapper<Class::SuperClass::virtualCallWithMetaTypes>>
140 && !std::is_same_v<
141 VTableCallWrapper<Class::virtualCall>,
142 VTableCallWrapper<Class::SuperClass::virtualCall>>) {
143 // Converting from metatypes to JS signature is easy.
144 return Class::virtualConvertAndCall;
145 }
146
147 return Class::virtualCallWithMetaTypes;
148}
149
150template<class Class>
152{
153 // If Class overrides virtualCall, return that.
154 // Otherwise, if it overrides virtualCallWithMetaTypes, fail.
155 // (We cannot determine the target types to call virtualCallWithMetaTypes in that case)
156 // Otherwise, just return whatever the base class had.
157
158 // A simple == on methods is not considered constexpr, so we have to jump through some hoops.
159
160 static_assert(
161 !std::is_same_v<
162 VTableCallWrapper<Class::virtualCall>,
163 VTableCallWrapper<Class::SuperClass::virtualCall>>
164 || std::is_same_v<
165 VTableCallWithMetaTypesWrapper<Class::virtualCallWithMetaTypes>,
166 VTableCallWithMetaTypesWrapper<Class::SuperClass::virtualCallWithMetaTypes>>,
167 "If you override virtualCallWithMetaTypes, override virtualCall, too");
168
169 static_assert(
170 std::is_same_v<
171 VTableCallWrapper<Class::virtualCall>,
172 VTableCallWrapper<Class::SuperClass::virtualCall>>
174 "You mustn't override virtualCall with nullptr");
175
176 return Class::virtualCall;
177}
178
180protected:
181 static constexpr VTable::Destroy virtualDestroy = nullptr;
182 static constexpr VTable::IsEqualTo virtualIsEqualTo = nullptr;
183
184 static constexpr VTable::Get virtualGet = nullptr;
185 static constexpr VTable::Put virtualPut = nullptr;
187 static constexpr VTable::HasProperty virtualHasProperty = nullptr;
190 static constexpr VTable::IsExtensible virtualIsExtensible = nullptr;
194 static constexpr VTable::GetLength virtualGetLength = nullptr;
196 static constexpr VTable::InstanceOf virtualInstanceOf = nullptr;
197
198 static constexpr VTable::Call virtualCall = nullptr;
202
205
206 static constexpr VTable::Metacall virtualMetacall = nullptr;
207
208 template<class Class>
210
211 template<class Class>
212 friend constexpr VTable::Call vtableJsTypesCallEntry();
213};
214
215#define DEFINE_MANAGED_VTABLE_INT(classname, parentVTable) \
216{ \
217 parentVTable, \
218 (sizeof(classname::Data) + sizeof(QV4::Value) - 1)/sizeof(QV4::Value), \
219 (sizeof(classname::Data) + (classname::NInlineProperties*sizeof(QV4::Value)) + QV4::Chunk::SlotSize - 1)/QV4::Chunk::SlotSize*QV4::Chunk::SlotSize/sizeof(QV4::Value) \
220 - (sizeof(classname::Data) + sizeof(QV4::Value) - 1)/sizeof(QV4::Value), \
221 classname::IsExecutionContext, \
222 classname::IsString, \
223 classname::IsObject, \
224 classname::IsTailCallable, \
225 classname::IsErrorObject, \
226 classname::IsArrayData, \
227 classname::IsStringOrSymbol, \
228 classname::MyType, \
229 { 0, 0, 0, 0 }, \
230 #classname, \
231 \
232 classname::virtualDestroy, \
233 classname::Data::markObjects, \
234 classname::virtualIsEqualTo, \
235 \
236 classname::virtualGet, \
237 classname::virtualPut, \
238 classname::virtualDeleteProperty, \
239 classname::virtualHasProperty, \
240 classname::virtualGetOwnProperty, \
241 classname::virtualDefineOwnProperty, \
242 classname::virtualIsExtensible, \
243 classname::virtualPreventExtensions, \
244 classname::virtualGetPrototypeOf, \
245 classname::virtualSetPrototypeOf, \
246 classname::virtualGetLength, \
247 classname::virtualOwnPropertyKeys, \
248 classname::virtualInstanceOf, \
249 \
250 QV4::vtableJsTypesCallEntry<classname>(), \
251 classname::virtualCallAsConstructor, \
252 QV4::vtableMetaTypesCallEntry<classname>(), \
253 \
254 classname::virtualResolveLookupGetter, \
255 classname::virtualResolveLookupSetter, \
256 classname::virtualMetacall \
257}
258
259#define DEFINE_MANAGED_VTABLE(classname) \
260const QV4::VTable classname::static_vtbl = DEFINE_MANAGED_VTABLE_INT(classname, 0)
261
262#define V4_OBJECT2(DataClass, superClass) \
263 private: \
264 DataClass() = delete; \
265 Q_DISABLE_COPY(DataClass) \
266 public: \
267 Q_MANAGED_CHECK \
268 typedef QV4::Heap::DataClass Data; \
269 typedef superClass SuperClass; \
270 static const QV4::VTable static_vtbl; \
271 static inline const QV4::VTable *staticVTable() { return &static_vtbl; } \
272 V4_MANAGED_SIZE_TEST \
273 QV4::Heap::DataClass *d_unchecked() const { return static_cast<QV4::Heap::DataClass *>(m()); } \
274 QV4::Heap::DataClass *d() const { \
275 QV4::Heap::DataClass *dptr = d_unchecked(); \
276 dptr->_checkIsInitialized(); \
277 return dptr; \
278 } \
279 Q_STATIC_ASSERT(std::is_trivial_v<QV4::Heap::DataClass>);
280
281#define V4_PROTOTYPE(p) \
282 static QV4::Object *defaultPrototype(QV4::ExecutionEngine *e) \
283 { return e->p(); }
284
285
286#define DEFINE_OBJECT_VTABLE_BASE(classname) \
287 const QV4::VTable classname::static_vtbl = DEFINE_MANAGED_VTABLE_INT(classname, (std::is_same<classname::SuperClass, Object>::value) ? nullptr : &classname::SuperClass::static_vtbl)
288
289#define DEFINE_OBJECT_VTABLE(classname) \
290DEFINE_OBJECT_VTABLE_BASE(classname)
291
292#define DEFINE_OBJECT_TEMPLATE_VTABLE(classname) \
293template<> DEFINE_OBJECT_VTABLE_BASE(classname)
294
295}
296
298
299#endif
\inmodule QtCore
Definition qmetatype.h:341
\inmodule QtCore
Definition qobject.h:103
Combined button and popup list for selecting options.
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:48
long long qint64
Definition qtypes.h:60
unsigned char quint8
Definition qtypes.h:46
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::CallWithMetaTypes virtualConvertAndCall
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 isTailCallable
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