First step unifying data structures
authorLars Knoll <lars.knoll@digia.com>
Thu, 10 Apr 2014 16:25:45 +0000 (18:25 +0200)
committerSimon Hausmann <simon.hausmann@digia.com>
Tue, 22 Jul 2014 11:48:59 +0000 (13:48 +0200)
Make Object::Data inherit from Managed::Data. To keep this
working in the current allocation scheme, we need a dummy
ObjectData in Object for now.

Change-Id: I39036c0bf0431f1c2cf32dadc17a3742ff8d6831
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
src/qml/jsruntime/qv4managed_p.h
src/qml/jsruntime/qv4object_p.h

index 99ba0a0..e6fdeee 100644 (file)
@@ -78,6 +78,12 @@ inline void qYouForgotTheQ_MANAGED_Macro(T1, T2) {}
         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 };
index 1910737..775b15f 100644 (file)
@@ -103,26 +103,26 @@ struct URIErrorPrototype;
 
 
 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); }