Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
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// Qt-Security score:significant
4#ifndef QV4VTABLE_P_H
5#define QV4VTABLE_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include "qv4global_p.h"
19#include <QtCore/qmetaobject.h>
20
22
23class QObject;
24namespace QV4 {
25
26struct Lookup;
27
28struct Q_QML_EXPORT OwnPropertyKeyIterator {
29 virtual ~OwnPropertyKeyIterator() = 0;
30 virtual PropertyKey next(const Object *o, Property *p = nullptr, PropertyAttributes *attrs = nullptr) = 0;
31};
32
33struct VTable
34{
35 typedef void (*Destroy)(Heap::Base *);
36 typedef void (*MarkObjects)(Heap::Base *, MarkStack *markStack);
37 typedef bool (*IsEqualTo)(Managed *m, Managed *other);
38
39 typedef ReturnedValue (*Get)(const Managed *, PropertyKey id, const Value *receiver, bool *hasProperty);
40 typedef bool (*Put)(Managed *, PropertyKey id, const Value &value, Value *receiver);
41 typedef bool (*DeleteProperty)(Managed *m, PropertyKey id);
42 typedef bool (*HasProperty)(const Managed *m, PropertyKey id);
43 typedef PropertyAttributes (*GetOwnProperty)(const Managed *m, PropertyKey id, Property *p);
44 typedef bool (*DefineOwnProperty)(Managed *m, PropertyKey id, const Property *p, PropertyAttributes attrs);
45 typedef bool (*IsExtensible)(const Managed *);
46 typedef bool (*PreventExtensions)(Managed *);
47 typedef Heap::Object *(*GetPrototypeOf)(const Managed *);
48 typedef bool (*SetPrototypeOf)(Managed *, const Object *);
49 typedef qint64 (*GetLength)(const Managed *m);
50 typedef OwnPropertyKeyIterator *(*OwnPropertyKeys)(const Object *m, Value *target);
51 typedef ReturnedValue (*InstanceOf)(const Object *typeObject, const Value &var);
52
53 typedef ReturnedValue (*Call)(const FunctionObject *, const Value *thisObject, const Value *argv, int argc);
54 typedef void (*CallWithMetaTypes)(const FunctionObject *, QObject *, void **, const QMetaType *, int);
55 typedef ReturnedValue (*CallAsConstructor)(const FunctionObject *, const Value *argv, int argc, const Value *newTarget);
56
57 typedef ReturnedValue (*ResolveLookupGetter)(const Object *, ExecutionEngine *, Lookup *);
58 typedef bool (*ResolveLookupSetter)(Object *, ExecutionEngine *, Lookup *, const Value &);
59
60 typedef int (*Metacall)(Object *, QMetaObject::Call, int, void **);
61
62 const VTable * const parent;
74 const char *className;
75
79
88 GetPrototypeOf getPrototypeOf;
93
97
100
102};
103
104template<VTable::CallWithMetaTypes call>
105struct VTableCallWithMetaTypesWrapper { constexpr static VTable::CallWithMetaTypes c = call; };
106
107template<VTable::Call call>
108struct VTableCallWrapper { constexpr static VTable::Call c = call; };
109
110template<class Class>
112{
113 // If Class overrides virtualCallWithMetaTypes, return that.
114 // Otherwise, if it overrides virtualCall, return convertAndCall.
115 // Otherwise, just return whatever the base class had.
116
117 // A simple == on methods is not considered constexpr, so we have to jump through some hoops.
118
119 static_assert(
120 std::is_same_v<
121 VTableCallWithMetaTypesWrapper<Class::virtualCallWithMetaTypes>,
122 VTableCallWithMetaTypesWrapper<Class::SuperClass::virtualCallWithMetaTypes>>
123 || !std::is_same_v<
124 VTableCallWithMetaTypesWrapper<Class::virtualCallWithMetaTypes>,
125 VTableCallWithMetaTypesWrapper<nullptr>>,
126 "You mustn't override virtualCallWithMetaTypes with nullptr");
127
128 static_assert(
129 std::is_same_v<
130 VTableCallWithMetaTypesWrapper<Class::virtualConvertAndCall>,
131 VTableCallWithMetaTypesWrapper<Class::SuperClass::virtualConvertAndCall>>
132 || !std::is_same_v<
133 VTableCallWithMetaTypesWrapper<Class::virtualConvertAndCall>,
134 VTableCallWithMetaTypesWrapper<nullptr>>,
135 "You mustn't override virtualConvertAndCall with nullptr");
136
137 if constexpr (
138 std::is_same_v<
139 VTableCallWithMetaTypesWrapper<Class::virtualCallWithMetaTypes>,
140 VTableCallWithMetaTypesWrapper<Class::SuperClass::virtualCallWithMetaTypes>>
141 && !std::is_same_v<
142 VTableCallWrapper<Class::virtualCall>,
143 VTableCallWrapper<Class::SuperClass::virtualCall>>) {
144 // Converting from metatypes to JS signature is easy.
145 return Class::virtualConvertAndCall;
146 }
147
148 return Class::virtualCallWithMetaTypes;
149}
150
151template<class Class>
153{
154 // If Class overrides virtualCall, return that.
155 // Otherwise, if it overrides virtualCallWithMetaTypes, fail.
156 // (We cannot determine the target types to call virtualCallWithMetaTypes in that case)
157 // Otherwise, just return whatever the base class had.
158
159 // A simple == on methods is not considered constexpr, so we have to jump through some hoops.
160
161 static_assert(
162 !std::is_same_v<
163 VTableCallWrapper<Class::virtualCall>,
164 VTableCallWrapper<Class::SuperClass::virtualCall>>
165 || std::is_same_v<
166 VTableCallWithMetaTypesWrapper<Class::virtualCallWithMetaTypes>,
167 VTableCallWithMetaTypesWrapper<Class::SuperClass::virtualCallWithMetaTypes>>,
168 "If you override virtualCallWithMetaTypes, override virtualCall, too");
169
170 static_assert(
171 std::is_same_v<
172 VTableCallWrapper<Class::virtualCall>,
173 VTableCallWrapper<Class::SuperClass::virtualCall>>
174 || VTableCallWrapper<Class::virtualCall>::c != nullptr,
175 "You mustn't override virtualCall with nullptr");
176
177 return Class::virtualCall;
178}
179
181protected:
182 static constexpr VTable::Destroy virtualDestroy = nullptr;
183 static constexpr VTable::IsEqualTo virtualIsEqualTo = nullptr;
184
185 static constexpr VTable::Get virtualGet = nullptr;
186 static constexpr VTable::Put virtualPut = nullptr;
187 static constexpr VTable::DeleteProperty virtualDeleteProperty = nullptr;
188 static constexpr VTable::HasProperty virtualHasProperty = nullptr;
189 static constexpr VTable::GetOwnProperty virtualGetOwnProperty = nullptr;
191 static constexpr VTable::IsExtensible virtualIsExtensible = nullptr;
193 static constexpr VTable::GetPrototypeOf virtualGetPrototypeOf = nullptr;
194 static constexpr VTable::SetPrototypeOf virtualSetPrototypeOf = nullptr;
195 static constexpr VTable::GetLength virtualGetLength = nullptr;
196 static constexpr VTable::OwnPropertyKeys virtualOwnPropertyKeys = nullptr;
197 static constexpr VTable::InstanceOf virtualInstanceOf = nullptr;
198
199 static constexpr VTable::Call virtualCall = nullptr;
202 static constexpr VTable::CallWithMetaTypes virtualConvertAndCall = nullptr;
203
206
207 static constexpr VTable::Metacall virtualMetacall = nullptr;
208
209 template<class Class>
211
212 template<class Class>
213 friend constexpr VTable::Call vtableJsTypesCallEntry();
214};
215
216#define DEFINE_MANAGED_VTABLE_INT(classname, parentVTable) \
217{
218 parentVTable,
219 (sizeof(classname::Data) + sizeof(QV4::Value) - 1)/sizeof(QV4::Value),
220 (sizeof(classname::Data) + (classname::NInlineProperties*sizeof(QV4::Value)) + QV4::Chunk::SlotSize - 1)/QV4::Chunk::SlotSize*QV4::Chunk::SlotSize/sizeof(QV4::Value)
221 - (sizeof(classname::Data) + sizeof(QV4::Value) - 1)/sizeof(QV4::Value),
222 classname::IsExecutionContext,
223 classname::IsString,
224 classname::IsObject,
225 classname::IsTailCallable,
226 classname::IsErrorObject,
227 classname::IsArrayData,
228 classname::IsStringOrSymbol,
229 classname::MyType,
230 { 0, 0, 0, 0 },
231 #classname,
232
233 classname::virtualDestroy,
234 classname::Data::markObjects,
235 classname::virtualIsEqualTo,
236
237 classname::virtualGet,
238 classname::virtualPut,
239 classname::virtualDeleteProperty,
240 classname::virtualHasProperty,
241 classname::virtualGetOwnProperty,
242 classname::virtualDefineOwnProperty,
243 classname::virtualIsExtensible,
244 classname::virtualPreventExtensions,
245 classname::virtualGetPrototypeOf,
246 classname::virtualSetPrototypeOf,
247 classname::virtualGetLength,
248 classname::virtualOwnPropertyKeys,
249 classname::virtualInstanceOf,
250
251 QV4::vtableJsTypesCallEntry<classname>(),
252 classname::virtualCallAsConstructor,
253 QV4::vtableMetaTypesCallEntry<classname>(),
254
255 classname::virtualResolveLookupGetter,
256 classname::virtualResolveLookupSetter,
257 classname::virtualMetacall \
258}
259
260#define DEFINE_MANAGED_VTABLE(classname) const
261 QV4::VTable classname::static_vtbl = DEFINE_MANAGED_VTABLE_INT(classname, 0)
262
263#define V4_OBJECT2(DataClass, superClass)
264 private:
265 DataClass() = delete;
266 Q_DISABLE_COPY(DataClass)
267 public:
268 Q_MANAGED_CHECK
269 typedef QV4::Heap::DataClass Data;
270 typedef superClass SuperClass;
271 static const QV4::VTable static_vtbl;
272 static inline const QV4::VTable *staticVTable() { return &static_vtbl; }
273 V4_MANAGED_SIZE_TEST
274 QV4::Heap::DataClass *d_unchecked() const { return static_cast<QV4::Heap::DataClass *>(m()); }
275 QV4::Heap::DataClass *d() const {
276 QV4::Heap::DataClass *dptr = d_unchecked();
277 dptr->_checkIsInitialized();
278 return dptr;
279 }
280 Q_STATIC_ASSERT(std::is_trivial_v<QV4::Heap::DataClass>);
281
282#define V4_PROTOTYPE(p)
283 static QV4::Object *defaultPrototype(QV4::ExecutionEngine *e)
284 { return e->p(); }
285
286
287#define DEFINE_OBJECT_VTABLE_BASE(classname)
288 const QV4::VTable classname::static_vtbl = DEFINE_MANAGED_VTABLE_INT(classname, (std::is_same<classname::SuperClass, Object>::value) ? nullptr : &classname::SuperClass::static_vtbl)
289
290#define DEFINE_OBJECT_VTABLE(classname) DEFINE_OBJECT_VTABLE_BASE
291 (classname)
292
293#define DEFINE_OBJECT_TEMPLATE_VTABLE(classname) template
294 <> DEFINE_OBJECT_VTABLE_BASE(classname)
295
296}
297
298QT_END_NAMESPACE
299
300#endif
Definition qjsvalue.h:23
constexpr VTable::Call vtableJsTypesCallEntry()
constexpr VTable::CallWithMetaTypes vtableMetaTypesCallEntry()
#define DEFINE_MANAGED_VTABLE_INT(classname, parentVTable)
#define DEFINE_OBJECT_VTABLE_BASE(classname)
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
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
static constexpr VTable::ResolveLookupSetter virtualResolveLookupSetter
static constexpr VTable::CallWithMetaTypes virtualConvertAndCall
static constexpr VTable::IsExtensible virtualIsExtensible
static constexpr VTable::CallWithMetaTypes c
static constexpr VTable::Call c
const VTable *const parent
Definition qv4vtable_p.h:62
ResolveLookupSetter resolveLookupSetter
Definition qv4vtable_p.h:99
GetPrototypeOf getPrototypeOf
Definition qv4vtable_p.h:88
ReturnedValue(* CallAsConstructor)(const FunctionObject *, const Value *argv, int argc, const Value *newTarget)
Definition qv4vtable_p.h:55
GetLength getLength
Definition qv4vtable_p.h:90
quint16 inlinePropertyOffset
Definition qv4vtable_p.h:63
InstanceOf instanceOf
Definition qv4vtable_p.h:92
CallWithMetaTypes callWithMetaTypes
Definition qv4vtable_p.h:96
bool(* PreventExtensions)(Managed *)
Definition qv4vtable_p.h:46
ReturnedValue(* Call)(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
Definition qv4vtable_p.h:53
OwnPropertyKeyIterator *(* OwnPropertyKeys)(const Object *m, Value *target)
Definition qv4vtable_p.h:50
PreventExtensions preventExtensions
Definition qv4vtable_p.h:87
CallAsConstructor callAsConstructor
Definition qv4vtable_p.h:95
quint8 isObject
Definition qv4vtable_p.h:67
OwnPropertyKeys ownPropertyKeys
Definition qv4vtable_p.h:91
GetOwnProperty getOwnProperty
Definition qv4vtable_p.h:84
bool(* HasProperty)(const Managed *m, PropertyKey id)
Definition qv4vtable_p.h:42
bool(* DeleteProperty)(Managed *m, PropertyKey id)
Definition qv4vtable_p.h:41
quint8 isArrayData
Definition qv4vtable_p.h:70
DefineOwnProperty defineOwnProperty
Definition qv4vtable_p.h:85
quint8 isString
Definition qv4vtable_p.h:66
int(* Metacall)(Object *, QMetaObject::Call, int, void **)
Definition qv4vtable_p.h:60
IsEqualTo isEqualTo
Definition qv4vtable_p.h:78
ReturnedValue(* InstanceOf)(const Object *typeObject, const Value &var)
Definition qv4vtable_p.h:51
DeleteProperty deleteProperty
Definition qv4vtable_p.h:82
void(* CallWithMetaTypes)(const FunctionObject *, QObject *, void **, const QMetaType *, int)
Definition qv4vtable_p.h:54
quint8 isTailCallable
Definition qv4vtable_p.h:68
bool(* IsEqualTo)(Managed *m, Managed *other)
Definition qv4vtable_p.h:37
quint8 isErrorObject
Definition qv4vtable_p.h:69
bool(* ResolveLookupSetter)(Object *, ExecutionEngine *, Lookup *, const Value &)
Definition qv4vtable_p.h:58
void(* Destroy)(Heap::Base *)
Definition qv4vtable_p.h:35
bool(* DefineOwnProperty)(Managed *m, PropertyKey id, const Property *p, PropertyAttributes attrs)
Definition qv4vtable_p.h:44
Metacall metacall
const char * className
Definition qv4vtable_p.h:74
bool(* IsExtensible)(const Managed *)
Definition qv4vtable_p.h:45
quint8 unused[4]
Definition qv4vtable_p.h:73
quint8 isStringOrSymbol
Definition qv4vtable_p.h:71
MarkObjects markObjects
Definition qv4vtable_p.h:77
IsExtensible isExtensible
Definition qv4vtable_p.h:86
quint8 type
Definition qv4vtable_p.h:72
HasProperty hasProperty
Definition qv4vtable_p.h:83
ReturnedValue(* ResolveLookupGetter)(const Object *, ExecutionEngine *, Lookup *)
Definition qv4vtable_p.h:57
quint16 nInlineProperties
Definition qv4vtable_p.h:64
void(* MarkObjects)(Heap::Base *, MarkStack *markStack)
Definition qv4vtable_p.h:36
bool(* Put)(Managed *, PropertyKey id, const Value &value, Value *receiver)
Definition qv4vtable_p.h:40
PropertyAttributes(* GetOwnProperty)(const Managed *m, PropertyKey id, Property *p)
Definition qv4vtable_p.h:43
SetPrototypeOf setPrototypeOf
Definition qv4vtable_p.h:89
ReturnedValue(* Get)(const Managed *, PropertyKey id, const Value *receiver, bool *hasProperty)
Definition qv4vtable_p.h:39
Destroy destroy
Definition qv4vtable_p.h:76
qint64(* GetLength)(const Managed *m)
Definition qv4vtable_p.h:49
quint8 isExecutionContext
Definition qv4vtable_p.h:65
ResolveLookupGetter resolveLookupGetter
Definition qv4vtable_p.h:98
bool(* SetPrototypeOf)(Managed *, const Object *)
Definition qv4vtable_p.h:48