Wrap members in Object in a Heap::Pointer
authorLars Knoll <lars.knoll@theqtcompany.com>
Fri, 13 Feb 2015 07:29:56 +0000 (08:29 +0100)
committerLars Knoll <lars.knoll@digia.com>
Fri, 20 Mar 2015 11:16:50 +0000 (11:16 +0000)
Change-Id: I0d132592487255027c215da21fbec15b23b00624
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
src/qml/jsruntime/qv4arraydata.cpp
src/qml/jsruntime/qv4arrayobject.cpp
src/qml/jsruntime/qv4lookup.cpp
src/qml/jsruntime/qv4object.cpp
src/qml/jsruntime/qv4object_p.h
src/qml/memory/qv4heap_p.h

index bdc3334..b788598 100644 (file)
@@ -231,7 +231,7 @@ ReturnedValue SimpleArrayData::get(const Heap::ArrayData *d, uint index)
 
 bool SimpleArrayData::put(Object *o, uint index, const Value &value)
 {
-    Heap::SimpleArrayData *dd = static_cast<Heap::SimpleArrayData *>(o->d()->arrayData);
+    Heap::SimpleArrayData *dd = o->d()->arrayData.as<Heap::SimpleArrayData>();
     Q_ASSERT(index >= dd->len || !dd->attrs || !dd->attrs[index].isAccessor());
     // ### honour attributes
     dd->data(index) = value;
@@ -245,7 +245,7 @@ bool SimpleArrayData::put(Object *o, uint index, const Value &value)
 
 bool SimpleArrayData::del(Object *o, uint index)
 {
-    Heap::SimpleArrayData *dd = static_cast<Heap::SimpleArrayData *>(o->d()->arrayData);
+    Heap::SimpleArrayData *dd = o->d()->arrayData.as<Heap::SimpleArrayData>();
     if (index >= dd->len)
         return true;
 
@@ -267,12 +267,12 @@ void SimpleArrayData::setAttribute(Object *o, uint index, PropertyAttributes att
 
 void SimpleArrayData::push_front(Object *o, const Value *values, uint n)
 {
-    Heap::SimpleArrayData *dd = static_cast<Heap::SimpleArrayData *>(o->d()->arrayData);
+    Heap::SimpleArrayData *dd = o->d()->arrayData.as<Heap::SimpleArrayData>();
     Q_ASSERT(!dd->attrs);
     if (dd->len + n > dd->alloc) {
         realloc(o, Heap::ArrayData::Simple, dd->len + n, false);
         Q_ASSERT(o->d()->arrayData->type == Heap::ArrayData::Simple);
-        dd = static_cast<Heap::SimpleArrayData *>(o->d()->arrayData);
+        dd = o->d()->arrayData.as<Heap::SimpleArrayData>();
     }
     dd->offset = (dd->offset - n) % dd->alloc;
     dd->len += n;
@@ -282,7 +282,7 @@ void SimpleArrayData::push_front(Object *o, const Value *values, uint n)
 
 ReturnedValue SimpleArrayData::pop_front(Object *o)
 {
-    Heap::SimpleArrayData *dd = static_cast<Heap::SimpleArrayData *>(o->d()->arrayData);
+    Heap::SimpleArrayData *dd = o->d()->arrayData.as<Heap::SimpleArrayData>();
     Q_ASSERT(!dd->attrs);
     if (!dd->len)
         return Encode::undefined();
@@ -295,7 +295,7 @@ ReturnedValue SimpleArrayData::pop_front(Object *o)
 
 uint SimpleArrayData::truncate(Object *o, uint newLen)
 {
-    Heap::SimpleArrayData *dd = static_cast<Heap::SimpleArrayData *>(o->d()->arrayData);
+    Heap::SimpleArrayData *dd = o->d()->arrayData.as<Heap::SimpleArrayData>();
     if (dd->len < newLen)
         return newLen;
 
@@ -319,10 +319,10 @@ uint SimpleArrayData::length(const Heap::ArrayData *d)
 
 bool SimpleArrayData::putArray(Object *o, uint index, const Value *values, uint n)
 {
-    Heap::SimpleArrayData *dd = static_cast<Heap::SimpleArrayData *>(o->d()->arrayData);
+    Heap::SimpleArrayData *dd = o->d()->arrayData.as<Heap::SimpleArrayData>();
     if (index + n > dd->alloc) {
         reallocate(o, index + n + 1, false);
-        dd = static_cast<Heap::SimpleArrayData *>(o->d()->arrayData);
+        dd = o->d()->arrayData.as<Heap::SimpleArrayData>();
     }
     for (uint i = dd->len; i < index; ++i)
         dd->data(i) = Primitive::emptyValue();
@@ -370,13 +370,13 @@ Heap::ArrayData *SparseArrayData::reallocate(Object *o, uint n, bool enforceAttr
 uint SparseArrayData::allocate(Object *o, bool doubleSlot)
 {
     Q_ASSERT(o->d()->arrayData->type == Heap::ArrayData::Sparse);
-    Heap::SparseArrayData *dd = static_cast<Heap::SparseArrayData *>(o->d()->arrayData);
+    Heap::SimpleArrayData *dd = o->d()->arrayData.as<Heap::SimpleArrayData>();
     if (doubleSlot) {
         uint *last = &dd->freeList;
         while (1) {
             if (*last == UINT_MAX) {
                 reallocate(o, dd->alloc + 2, true);
-                dd = static_cast<Heap::SparseArrayData *>(o->d()->arrayData);
+                dd = o->d()->arrayData.as<Heap::SimpleArrayData>();
                 last = &dd->freeList;
                 Q_ASSERT(*last != UINT_MAX);
             }
@@ -394,7 +394,7 @@ uint SparseArrayData::allocate(Object *o, bool doubleSlot)
     } else {
         if (dd->freeList == UINT_MAX) {
             reallocate(o, dd->alloc + 1, false);
-            dd = static_cast<Heap::SparseArrayData *>(o->d()->arrayData);
+            dd = o->d()->arrayData.as<Heap::SimpleArrayData>();
         }
         uint idx = dd->freeList;
         Q_ASSERT(idx != UINT_MAX);
@@ -419,12 +419,12 @@ bool SparseArrayData::put(Object *o, uint index, const Value &value)
     if (value.isEmpty())
         return true;
 
-    Heap::SparseArrayData *s = static_cast<Heap::SparseArrayData *>(o->d()->arrayData);
+    Heap::SparseArrayData *s = o->d()->arrayData.as<Heap::SparseArrayData>();
     SparseArrayNode *n = s->sparse->insert(index);
     Q_ASSERT(n->value == UINT_MAX || !s->attrs || !s->attrs[n->value].isAccessor());
     if (n->value == UINT_MAX)
         n->value = allocate(o);
-    s = static_cast<Heap::SparseArrayData *>(o->d()->arrayData);
+    s = o->d()->arrayData.as<Heap::SparseArrayData>();
     s->arrayData[n->value] = value;
     if (s->attrs)
         s->attrs[n->value] = Attr_Data;
@@ -433,7 +433,7 @@ bool SparseArrayData::put(Object *o, uint index, const Value &value)
 
 bool SparseArrayData::del(Object *o, uint index)
 {
-    Heap::SparseArrayData *dd = static_cast<Heap::SparseArrayData *>(o->d()->arrayData);
+    Heap::SparseArrayData *dd = o->d()->arrayData.as<Heap::SparseArrayData>();
 
     SparseArrayNode *n = dd->sparse->findNode(index);
     if (!n)
@@ -469,28 +469,28 @@ bool SparseArrayData::del(Object *o, uint index)
 
 void SparseArrayData::setAttribute(Object *o, uint index, PropertyAttributes attrs)
 {
-    Heap::SparseArrayData *d = static_cast<Heap::SparseArrayData *>(o->d()->arrayData);
+    Heap::SparseArrayData *d = o->d()->arrayData.as<Heap::SparseArrayData>();
     SparseArrayNode *n = d->sparse->insert(index);
     if (n->value == UINT_MAX) {
         n->value = allocate(o, attrs.isAccessor());
-        d = static_cast<Heap::SparseArrayData *>(o->d()->arrayData);
+        d = o->d()->arrayData.as<Heap::SparseArrayData>();
     }
     else if (attrs.isAccessor() != d->attrs[n->value].isAccessor()) {
         // need to convert the slot
         free(o->arrayData(), n->value);
         n->value = allocate(o, attrs.isAccessor());
-        d = static_cast<Heap::SparseArrayData *>(o->d()->arrayData);
+        d = o->d()->arrayData.as<Heap::SparseArrayData>();
     }
     d->attrs[n->value] = attrs;
 }
 
 void SparseArrayData::push_front(Object *o, const Value *values, uint n)
 {
-    Heap::SparseArrayData *d = static_cast<Heap::SparseArrayData *>(o->d()->arrayData);
+    Heap::SparseArrayData *d = o->d()->arrayData.as<Heap::SparseArrayData>();
     Q_ASSERT(!d->attrs);
     for (int i = n - 1; i >= 0; --i) {
         uint idx = allocate(o);
-        d = static_cast<Heap::SparseArrayData *>(o->d()->arrayData);
+        d = o->d()->arrayData.as<Heap::SparseArrayData>();
         d->arrayData[idx] = values[i];
         d->sparse->push_front(idx);
     }
@@ -498,7 +498,7 @@ void SparseArrayData::push_front(Object *o, const Value *values, uint n)
 
 ReturnedValue SparseArrayData::pop_front(Object *o)
 {
-    Heap::SparseArrayData *d = static_cast<Heap::SparseArrayData *>(o->d()->arrayData);
+    Heap::SparseArrayData *d = o->d()->arrayData.as<Heap::SparseArrayData>();
     Q_ASSERT(!d->attrs);
     uint idx = d->sparse->pop_front();
     ReturnedValue v;
@@ -513,7 +513,7 @@ ReturnedValue SparseArrayData::pop_front(Object *o)
 
 uint SparseArrayData::truncate(Object *o, uint newLen)
 {
-    Heap::SparseArrayData *d = static_cast<Heap::SparseArrayData *>(o->d()->arrayData);
+    Heap::SparseArrayData *d = o->d()->arrayData.as<Heap::SparseArrayData>();
     SparseArrayNode *begin = d->sparse->lowerBound(newLen);
     if (begin != d->sparse->end()) {
         SparseArrayNode *it = d->sparse->end()->previousNode();
@@ -607,11 +607,11 @@ uint ArrayData::append(Object *obj, ArrayObject *otherObj, uint n)
 Property *ArrayData::insert(Object *o, uint index, bool isAccessor)
 {
     if (!isAccessor && o->d()->arrayData->type != Heap::ArrayData::Sparse) {
-        Heap::SimpleArrayData *d = static_cast<Heap::SimpleArrayData *>(o->d()->arrayData);
+        Heap::SimpleArrayData *d = o->d()->arrayData.as<Heap::SimpleArrayData>();
         if (index < 0x1000 || index < d->len + (d->len >> 2)) {
             if (index >= d->alloc) {
                 o->arrayReserve(index + 1);
-                d = static_cast<Heap::SimpleArrayData *>(o->d()->arrayData);
+                d = o->d()->arrayData.as<Heap::SimpleArrayData>();
             }
             if (index >= d->len) {
                 // mark possible hole in the array
@@ -624,11 +624,11 @@ Property *ArrayData::insert(Object *o, uint index, bool isAccessor)
     }
 
     o->initSparseArray();
-    Heap::SparseArrayData *s = static_cast<Heap::SparseArrayData *>(o->d()->arrayData);
+    Heap::SparseArrayData *s = o->d()->arrayData.as<Heap::SparseArrayData>();
     SparseArrayNode *n = s->sparse->insert(index);
     if (n->value == UINT_MAX)
         n->value = SparseArrayData::allocate(o, isAccessor);
-    s = static_cast<Heap::SparseArrayData *>(o->d()->arrayData);
+    s = o->d()->arrayData.as<Heap::SparseArrayData>();
     return reinterpret_cast<Property *>(s->arrayData + n->value);
 }
 
@@ -756,7 +756,7 @@ void ArrayData::sort(ExecutionEngine *engine, Object *thisObject, const Value &c
 
         thisObject->setArrayData(0);
         ArrayData::realloc(thisObject, Heap::ArrayData::Simple, sparse->sparse()->nEntries(), sparse->attrs() ? true : false);
-        Heap::SimpleArrayData *d = static_cast<Heap::SimpleArrayData *>(thisObject->d()->arrayData);
+        Heap::SimpleArrayData *d = thisObject->d()->arrayData.as<Heap::SimpleArrayData>();
 
         SparseArrayNode *n = sparse->sparse()->begin();
         uint i = 0;
@@ -796,7 +796,7 @@ void ArrayData::sort(ExecutionEngine *engine, Object *thisObject, const Value &c
 
         }
     } else {
-        Heap::SimpleArrayData *d = static_cast<Heap::SimpleArrayData *>(thisObject->d()->arrayData);
+        Heap::SimpleArrayData *d = thisObject->d()->arrayData.as<Heap::SimpleArrayData>();
         if (len > d->len)
             len = d->len;
 
index 231eb93..2c47981 100644 (file)
@@ -619,7 +619,7 @@ ReturnedValue ArrayPrototype::method_indexOf(CallContext *ctx)
         return Encode(-1);
     } else {
         Q_ASSERT(instance->arrayType() == Heap::ArrayData::Simple || instance->arrayType() == Heap::ArrayData::Complex);
-        Heap::SimpleArrayData *sa = static_cast<Heap::SimpleArrayData *>(instance->d()->arrayData);
+        Heap::SimpleArrayData *sa = instance->d()->arrayData.as<Heap::SimpleArrayData>();
         if (len > sa->len)
             len = sa->len;
         uint idx = fromIndex;
index 82b2033..d1d0601 100644 (file)
@@ -168,7 +168,7 @@ ReturnedValue Lookup::indexedGetterObjectInt(Lookup *l, const Value &object, con
 
     Object *o = object.objectValue();
     if (o->d()->arrayData && o->d()->arrayData->type == Heap::ArrayData::Simple) {
-        Heap::SimpleArrayData *s = static_cast<Heap::SimpleArrayData *>(o->d()->arrayData);
+        Heap::SimpleArrayData *s = o->d()->arrayData.as<Heap::SimpleArrayData>();
         if (idx < s->len)
             if (!s->data(idx).isEmpty())
                 return s->data(idx).asReturnedValue();
@@ -200,7 +200,7 @@ void Lookup::indexedSetterFallback(Lookup *l, const Value &object, const Value &
     uint idx = index.asArrayIndex();
     if (idx < UINT_MAX) {
         if (o->d()->arrayData && o->d()->arrayData->type == Heap::ArrayData::Simple) {
-            Heap::SimpleArrayData *s = static_cast<Heap::SimpleArrayData *>(o->d()->arrayData);
+            Heap::SimpleArrayData *s = o->d()->arrayData.as<Heap::SimpleArrayData>();
             if (idx < s->len) {
                 s->data(idx) = value;
                 return;
@@ -224,7 +224,7 @@ void Lookup::indexedSetterObjectInt(Lookup *l, const Value &object, const Value
 
     Object *o = object.objectValue();
     if (o->d()->arrayData && o->d()->arrayData->type == Heap::ArrayData::Simple) {
-        Heap::SimpleArrayData *s = static_cast<Heap::SimpleArrayData *>(o->d()->arrayData);
+        Heap::SimpleArrayData *s = o->d()->arrayData.as<Heap::SimpleArrayData>();
         if (idx < s->len) {
             s->data(idx) = v;
             return;
index 8afed2c..234c5e7 100644 (file)
@@ -531,7 +531,7 @@ void Object::advanceIterator(Managed *m, ObjectIterator *it, Heap::String **name
             while (it->arrayNode != o->sparseEnd()) {
                 int k = it->arrayNode->key();
                 uint pidx = it->arrayNode->value;
-                Heap::SparseArrayData *sa = static_cast<Heap::SparseArrayData *>(o->d()->arrayData);
+                Heap::SparseArrayData *sa = o->d()->arrayData.as<Heap::SparseArrayData>();
                 Property *p = reinterpret_cast<Property *>(sa->arrayData + pidx);
                 it->arrayNode = it->arrayNode->nextNode();
                 PropertyAttributes a = sa->attrs ? sa->attrs[pidx] : Attr_Data;
@@ -548,7 +548,7 @@ void Object::advanceIterator(Managed *m, ObjectIterator *it, Heap::String **name
         }
         // dense arrays
         while (it->arrayIndex < o->d()->arrayData->len) {
-            Heap::SimpleArrayData *sa = static_cast<Heap::SimpleArrayData *>(o->d()->arrayData);
+            Heap::SimpleArrayData *sa = o->d()->arrayData.as<Heap::SimpleArrayData>();
             Value &val = sa->data(it->arrayIndex);
             PropertyAttributes a = o->arrayData()->attributes(it->arrayIndex);
             ++it->arrayIndex;
index a8bd97b..6d72535 100644 (file)
@@ -56,8 +56,8 @@ struct Object : Base {
 
     InternalClass *internalClass;
     Pointer<Object> prototype;
-    MemberData *memberData;
-    ArrayData *arrayData;
+    Pointer<MemberData> memberData;
+    Pointer<ArrayData> arrayData;
 };
 
 }
index 96d7376..3a78854 100644 (file)
@@ -96,6 +96,9 @@ struct Pointer {
 
     Pointer &operator =(T *t) { ptr = t; return *this; }
 
+    template <typename Type>
+    Type *as() { return static_cast<Type *>(ptr); }
+
     // Use Base, not T here, to ensure T inherits from ptr
     Base *ptr;
 };