19#include <QtCore/qmetaobject.h>
37 typedef bool (*
IsEqualTo)(Managed *m, Managed *other);
40 typedef bool (*
Put)(Managed *,
PropertyKey id,
const Value &value, Value *receiver);
47 typedef Heap::Object *(*GetPrototypeOf)(
const Managed *);
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);
121 VTableCallWithMetaTypesWrapper<Class::virtualCallWithMetaTypes>,
122 VTableCallWithMetaTypesWrapper<Class::SuperClass::virtualCallWithMetaTypes>>
124 VTableCallWithMetaTypesWrapper<Class::virtualCallWithMetaTypes>,
125 VTableCallWithMetaTypesWrapper<
nullptr>>,
126 "You mustn't override virtualCallWithMetaTypes with nullptr");
130 VTableCallWithMetaTypesWrapper<Class::virtualConvertAndCall>,
131 VTableCallWithMetaTypesWrapper<Class::SuperClass::virtualConvertAndCall>>
133 VTableCallWithMetaTypesWrapper<Class::virtualConvertAndCall>,
134 VTableCallWithMetaTypesWrapper<
nullptr>>,
135 "You mustn't override virtualConvertAndCall with nullptr");
139 VTableCallWithMetaTypesWrapper<Class::virtualCallWithMetaTypes>,
140 VTableCallWithMetaTypesWrapper<Class::SuperClass::virtualCallWithMetaTypes>>
142 VTableCallWrapper<Class::virtualCall>,
143 VTableCallWrapper<Class::SuperClass::virtualCall>>) {
145 return Class::virtualConvertAndCall;
148 return Class::virtualCallWithMetaTypes;
163 VTableCallWrapper<Class::virtualCall>,
164 VTableCallWrapper<Class::SuperClass::virtualCall>>
166 VTableCallWithMetaTypesWrapper<Class::virtualCallWithMetaTypes>,
167 VTableCallWithMetaTypesWrapper<Class::SuperClass::virtualCallWithMetaTypes>>,
168 "If you override virtualCallWithMetaTypes, override virtualCall, too");
172 VTableCallWrapper<Class::virtualCall>,
173 VTableCallWrapper<Class::SuperClass::virtualCall>>
174 || VTableCallWrapper<Class::virtualCall>::c !=
nullptr,
175 "You mustn't override virtualCall with nullptr");
177 return Class::virtualCall;
209 template<
class Class>
212 template<
class Class>
216#define DEFINE_MANAGED_VTABLE_INT(classname, parentVTable) \
217{
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,
225 classname::IsTailCallable,
226 classname::IsErrorObject,
227 classname::IsArrayData,
228 classname::IsStringOrSymbol,
233 classname::virtualDestroy,
234 classname::Data::markObjects,
235 classname::virtualIsEqualTo,
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,
251 QV4::vtableJsTypesCallEntry<classname>(),
252 classname::virtualCallAsConstructor,
253 QV4::vtableMetaTypesCallEntry<classname>(),
255 classname::virtualResolveLookupGetter,
256 classname::virtualResolveLookupSetter,
257 classname::virtualMetacall \
258}
260#define DEFINE_MANAGED_VTABLE(classname) const
263#define V4_OBJECT2(DataClass, superClass)
265 DataClass() = delete;
266 Q_DISABLE_COPY(DataClass)
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; }
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();
280 Q_STATIC_ASSERT(std::is_trivial_v<QV4::Heap::DataClass>);
282#define V4_PROTOTYPE(p)
283 static QV4::Object *defaultPrototype(QV4::ExecutionEngine *e)
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)
290#define DEFINE_OBJECT_VTABLE(classname) DEFINE_OBJECT_VTABLE_BASE
293#define DEFINE_OBJECT_TEMPLATE_VTABLE(classname) template
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::Call c
const VTable *const parent
ResolveLookupSetter resolveLookupSetter
GetPrototypeOf getPrototypeOf
ReturnedValue(* CallAsConstructor)(const FunctionObject *, const Value *argv, int argc, const Value *newTarget)
quint16 inlinePropertyOffset
CallWithMetaTypes callWithMetaTypes
bool(* PreventExtensions)(Managed *)
ReturnedValue(* Call)(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
OwnPropertyKeyIterator *(* OwnPropertyKeys)(const Object *m, Value *target)
PreventExtensions preventExtensions
CallAsConstructor callAsConstructor
OwnPropertyKeys ownPropertyKeys
GetOwnProperty getOwnProperty
bool(* HasProperty)(const Managed *m, PropertyKey id)
bool(* DeleteProperty)(Managed *m, PropertyKey id)
DefineOwnProperty defineOwnProperty
int(* Metacall)(Object *, QMetaObject::Call, int, void **)
ReturnedValue(* InstanceOf)(const Object *typeObject, const Value &var)
DeleteProperty deleteProperty
void(* CallWithMetaTypes)(const FunctionObject *, QObject *, void **, const QMetaType *, int)
bool(* IsEqualTo)(Managed *m, Managed *other)
bool(* ResolveLookupSetter)(Object *, ExecutionEngine *, Lookup *, const Value &)
void(* Destroy)(Heap::Base *)
bool(* DefineOwnProperty)(Managed *m, PropertyKey id, const Property *p, PropertyAttributes attrs)
bool(* IsExtensible)(const Managed *)
IsExtensible isExtensible
ReturnedValue(* ResolveLookupGetter)(const Object *, ExecutionEngine *, Lookup *)
quint16 nInlineProperties
void(* MarkObjects)(Heap::Base *, MarkStack *markStack)
bool(* Put)(Managed *, PropertyKey id, const Value &value, Value *receiver)
PropertyAttributes(* GetOwnProperty)(const Managed *m, PropertyKey id, Property *p)
SetPrototypeOf setPrototypeOf
ReturnedValue(* Get)(const Managed *, PropertyKey id, const Value *receiver, bool *hasProperty)
qint64(* GetLength)(const Managed *m)
quint8 isExecutionContext
ResolveLookupGetter resolveLookupGetter
bool(* SetPrototypeOf)(Managed *, const Object *)