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() const { return static_cast<QV4::Heap::DataClass *>(m()); }
275 static_assert(std::is_trivially_copyable_v<QV4::Heap::DataClass>);
276 static_assert(std::is_trivially_default_constructible_v<QV4::Heap::DataClass>);
278#define V4_PROTOTYPE(p)
279 static QV4::Object *defaultPrototype(QV4::ExecutionEngine *e)
283#define DEFINE_OBJECT_VTABLE_BASE(classname)
284 const QV4::VTable classname::static_vtbl = DEFINE_MANAGED_VTABLE_INT(classname, (std::is_same<classname::SuperClass, Object>::value) ? nullptr : &classname::SuperClass::static_vtbl)
286#define DEFINE_OBJECT_VTABLE(classname) DEFINE_OBJECT_VTABLE_BASE
289#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
void(*) Destroy(Heap::Base *)
quint16 inlinePropertyOffset
ReturnedValue(*) ResolveLookupGetter(const Object *, ExecutionEngine *, Lookup *)
bool(*) ResolveLookupSetter(Object *, ExecutionEngine *, Lookup *, const Value &)
ReturnedValue(*) InstanceOf(const Object *typeObject, const Value &var)
CallWithMetaTypes callWithMetaTypes
bool(*) DeleteProperty(Managed *m, PropertyKey id)
bool(*) HasProperty(const Managed *m, PropertyKey id)
PreventExtensions preventExtensions
CallAsConstructor callAsConstructor
OwnPropertyKeys ownPropertyKeys
GetOwnProperty getOwnProperty
bool(*) IsEqualTo(Managed *m, Managed *other)
DefineOwnProperty defineOwnProperty
bool(*) SetPrototypeOf(Managed *, const Object *)
ReturnedValue(*) Call(const FunctionObject *, const Value *thisObject, const Value *argv, int argc)
void(*) MarkObjects(Heap::Base *, MarkStack *markStack)
int(*) Metacall(Object *, QMetaObject::Call, int, void **)
qint64(*) GetLength(const Managed *m)
DeleteProperty deleteProperty
PropertyAttributes(*) GetOwnProperty(const Managed *m, PropertyKey id, Property *p)
ReturnedValue(*) CallAsConstructor(const FunctionObject *, const Value *argv, int argc, const Value *newTarget)
IsExtensible isExtensible
bool(*) DefineOwnProperty(Managed *m, PropertyKey id, const Property *p, PropertyAttributes attrs)
bool(*) IsExtensible(const Managed *)
bool(*) PreventExtensions(Managed *)
quint16 nInlineProperties
SetPrototypeOf setPrototypeOf
OwnPropertyKeyIterator *(*) OwnPropertyKeys(const Object *m, Value *target)
void(*) CallWithMetaTypes(const FunctionObject *, QObject *, void **, const QMetaType *, int)
quint8 isExecutionContext
ResolveLookupGetter resolveLookupGetter
bool(*) Put(Managed *, PropertyKey id, const Value &value, Value *receiver)
ReturnedValue(*) Get(const Managed *, PropertyKey id, const Value *receiver, bool *hasProperty)