template <typename T> \
QV4::Returned<T> *asReturned() { return QV4::Returned<T>::create(this); } \
+#define V4_OBJECT_NEW \
+ V4_OBJECT \
+ void __dataTest() { Q_STATIC_ASSERT(sizeof(*this) == sizeof(Data)); } \
+ const Data *d() const { return &static_cast<const Data &>(Managed::data); } \
+ Data *d() { return &static_cast<Data &>(Managed::data); }
+
#define Q_MANAGED_TYPE(type) \
public: \
enum { MyType = Type_##type };
struct Q_QML_EXPORT Object: Managed {
- V4_OBJECT
- Q_MANAGED_TYPE(Object)
- enum {
- IsObject = true
- };
-
- struct Data {
+ struct Data : Managed::Data {
Members memberData;
ArrayData *arrayData;
};
- Data data;
+ struct {
+ Members memberData;
+ ArrayData *arrayData;
+ } __data;
+ V4_OBJECT_NEW
+ Q_MANAGED_TYPE(Object)
- const Data *objectData() const { return &data; }
- Data *objectData() { return &data; }
+ enum {
+ IsObject = true
+ };
- Members &memberData() { return objectData()->memberData; }
- Members memberData() const { return objectData()->memberData; }
- const ArrayData *arrayData() const { return objectData()->arrayData; }
- ArrayData *arrayData() { return objectData()->arrayData; }
- void setArrayData(ArrayData *a) { objectData()->arrayData = a; }
+ Members &memberData() { return d()->memberData; }
+ Members memberData() const { return d()->memberData; }
+ const ArrayData *arrayData() const { return d()->arrayData; }
+ ArrayData *arrayData() { return d()->arrayData; }
+ void setArrayData(ArrayData *a) { d()->arrayData = a; }
Property *propertyAt(uint index) const { return reinterpret_cast<Property *>(memberData().data() + index); }