18#include <QtCore/qmetaobject.h>
36 typedef bool (*
IsEqualTo)(Managed *m, Managed *other);
39 typedef bool (*
Put)(Managed *,
PropertyKey id,
const Value &value, Value *receiver);
46 typedef Heap::Object *(*GetPrototypeOf)(
const Managed *);
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);
120 VTableCallWithMetaTypesWrapper<Class::virtualCallWithMetaTypes>,
121 VTableCallWithMetaTypesWrapper<Class::SuperClass::virtualCallWithMetaTypes>>
123 VTableCallWithMetaTypesWrapper<Class::virtualCallWithMetaTypes>,
124 VTableCallWithMetaTypesWrapper<
nullptr>>,
125 "You mustn't override virtualCallWithMetaTypes with nullptr");
129 VTableCallWithMetaTypesWrapper<Class::virtualConvertAndCall>,
130 VTableCallWithMetaTypesWrapper<Class::SuperClass::virtualConvertAndCall>>
132 VTableCallWithMetaTypesWrapper<Class::virtualConvertAndCall>,
133 VTableCallWithMetaTypesWrapper<
nullptr>>,
134 "You mustn't override virtualConvertAndCall with nullptr");
138 VTableCallWithMetaTypesWrapper<Class::virtualCallWithMetaTypes>,
139 VTableCallWithMetaTypesWrapper<Class::SuperClass::virtualCallWithMetaTypes>>
141 VTableCallWrapper<Class::virtualCall>,
142 VTableCallWrapper<Class::SuperClass::virtualCall>>) {
144 return Class::virtualConvertAndCall;
147 return Class::virtualCallWithMetaTypes;
162 VTableCallWrapper<Class::virtualCall>,
163 VTableCallWrapper<Class::SuperClass::virtualCall>>
165 VTableCallWithMetaTypesWrapper<Class::virtualCallWithMetaTypes>,
166 VTableCallWithMetaTypesWrapper<Class::SuperClass::virtualCallWithMetaTypes>>,
167 "If you override virtualCallWithMetaTypes, override virtualCall, too");
171 VTableCallWrapper<Class::virtualCall>,
172 VTableCallWrapper<Class::SuperClass::virtualCall>>
173 || VTableCallWrapper<Class::virtualCall>::c !=
nullptr,
174 "You mustn't override virtualCall with nullptr");
176 return Class::virtualCall;
208 template<
class Class>
211 template<
class Class>
215#define DEFINE_MANAGED_VTABLE_INT(classname, parentVTable) \
216{
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,
224 classname::IsTailCallable,
225 classname::IsErrorObject,
226 classname::IsArrayData,
227 classname::IsStringOrSymbol,
232 classname::virtualDestroy,
233 classname::Data::markObjects,
234 classname::virtualIsEqualTo,
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,
250 QV4::vtableJsTypesCallEntry<classname>(),
251 classname::virtualCallAsConstructor,
252 QV4::vtableMetaTypesCallEntry<classname>(),
254 classname::virtualResolveLookupGetter,
255 classname::virtualResolveLookupSetter,
256 classname::virtualMetacall \
257}
259#define DEFINE_MANAGED_VTABLE(classname) const
262#define V4_OBJECT2(DataClass, superClass)
264 DataClass() = delete;
265 Q_DISABLE_COPY(DataClass)
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; }
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();
279 Q_STATIC_ASSERT(std::is_trivial_v<QV4::Heap::DataClass>);
281#define V4_PROTOTYPE(p)
282 static QV4::Object *defaultPrototype(QV4::ExecutionEngine *e)
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)
289#define DEFINE_OBJECT_VTABLE(classname) DEFINE_OBJECT_VTABLE_BASE
292#define DEFINE_OBJECT_TEMPLATE_VTABLE(classname) template
Combined button and popup list for selecting options.
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 *)