18#include <QtCore/qmetaobject.h>
46 typedef Heap::Object *(*GetPrototypeOf)(
const Managed *);
103template<VTable::CallWithMetaTypes call>
106template<VTable::Call call>
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>>
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) \
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, \
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 \
259#define DEFINE_MANAGED_VTABLE(classname) \
260const QV4::VTable classname::static_vtbl = DEFINE_MANAGED_VTABLE_INT(classname, 0)
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; } \
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(); \
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) \
290DEFINE_OBJECT_VTABLE_BASE(classname)
292#define DEFINE_OBJECT_TEMPLATE_VTABLE(classname) \
293template<> DEFINE_OBJECT_VTABLE_BASE(classname)
Combined button and popup list for selecting options.
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]
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
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)
Heap::Object *(* GetPrototypeOf)(const Managed *)
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 *)