Move object data into internal structure
authorLars Knoll <lars.knoll@digia.com>
Sat, 5 Apr 2014 18:47:36 +0000 (20:47 +0200)
committerSimon Hausmann <simon.hausmann@digia.com>
Tue, 22 Jul 2014 11:48:54 +0000 (13:48 +0200)
Change-Id: I1fcccd535ed356e736468337bd450270cd290044
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
14 files changed:
src/qml/jsruntime/qv4argumentsobject.cpp
src/qml/jsruntime/qv4arraydata.cpp
src/qml/jsruntime/qv4arrayobject.cpp
src/qml/jsruntime/qv4functionobject.cpp
src/qml/jsruntime/qv4functionobject_p.h
src/qml/jsruntime/qv4internalclass.cpp
src/qml/jsruntime/qv4lookup.cpp
src/qml/jsruntime/qv4object.cpp
src/qml/jsruntime/qv4object_p.h
src/qml/jsruntime/qv4objectproto.cpp
src/qml/jsruntime/qv4regexpobject.cpp
src/qml/jsruntime/qv4runtime.cpp
src/qml/jsruntime/qv4stringobject.cpp
src/qml/qml/v8/qv8engine.cpp

index 7d4df89..72629b4 100644 (file)
@@ -71,10 +71,10 @@ ArgumentsObject::ArgumentsObject(CallContext *context)
     } else {
         setHasAccessorProperty();
         Q_ASSERT(CalleePropertyIndex == internalClass()->find(context->engine->id_callee));
-        memberData[CalleePropertyIndex] = context->function->asReturnedValue();
+        memberData()[CalleePropertyIndex] = context->function->asReturnedValue();
     }
     Q_ASSERT(LengthPropertyIndex == internalClass()->find(context->engine->id_length));
-    memberData[LengthPropertyIndex] = Primitive::fromInt32(context->realArgumentCount);
+    memberData()[LengthPropertyIndex] = Primitive::fromInt32(context->realArgumentCount);
 
     Q_ASSERT(internalClass()->vtable == staticVTable());
 }
@@ -105,19 +105,19 @@ bool ArgumentsObject::defineOwnProperty(ExecutionContext *ctx, uint index, const
     fullyCreate();
 
     Scope scope(ctx);
-    Property *pd = arrayData->getProperty(index);
+    Property *pd = arrayData()->getProperty(index);
     Property map;
     PropertyAttributes mapAttrs;
     bool isMapped = false;
     uint numAccessors = qMin((int)context->function->formalParameterCount(), context->realArgumentCount);
     if (pd && index < (uint)numAccessors)
-        isMapped = arrayData->attributes(index).isAccessor() && pd->getter() == context->engine->argumentsAccessors[index].getter();
+        isMapped = arrayData()->attributes(index).isAccessor() && pd->getter() == context->engine->argumentsAccessors[index].getter();
 
     if (isMapped) {
-        mapAttrs = arrayData->attributes(index);
+        mapAttrs = arrayData()->attributes(index);
         map.copy(*pd, mapAttrs);
         setArrayAttributes(index, Attr_Data);
-        pd = arrayData->getProperty(index);
+        pd = arrayData()->getProperty(index);
         pd->value = mappedArguments[index];
     }
 
@@ -134,7 +134,7 @@ bool ArgumentsObject::defineOwnProperty(ExecutionContext *ctx, uint index, const
 
         if (attrs.isWritable()) {
             setArrayAttributes(index, mapAttrs);
-            pd = arrayData->getProperty(index);
+            pd = arrayData()->getProperty(index);
             pd->copy(map, mapAttrs);
         }
     }
index 93660a2..7167014 100644 (file)
@@ -82,7 +82,7 @@ const ArrayVTable SparseArrayData::static_vtbl =
 
 void ArrayData::realloc(Object *o, Type newType, uint offset, uint alloc, bool enforceAttributes)
 {
-    ArrayData *d = o->arrayData;
+    ArrayData *d = o->arrayData();
 
     uint oldAlloc = 0;
     uint toCopy = 0;
@@ -124,7 +124,7 @@ void ArrayData::realloc(Object *o, Type newType, uint offset, uint alloc, bool e
         newData->attrs = enforceAttributes ? reinterpret_cast<PropertyAttributes *>(newData->data + alloc) + offset : 0;
         newData->offset = offset;
         newData->len = d ? static_cast<SimpleArrayData *>(d)->len : 0;
-        o->arrayData = newData;
+        o->setArrayData(newData);
     } else {
         size += sizeof(SparseArrayData);
         SparseArrayData *newData = static_cast<SparseArrayData *>(o->engine()->memoryManager->allocManaged(size));
@@ -133,24 +133,24 @@ void ArrayData::realloc(Object *o, Type newType, uint offset, uint alloc, bool e
         newData->type = newType;
         newData->data = reinterpret_cast<Value *>(newData + 1);
         newData->attrs = enforceAttributes ? reinterpret_cast<PropertyAttributes *>(newData->data + alloc) : 0;
-        o->arrayData = newData;
+        o->setArrayData(newData);
     }
 
     if (d) {
-        memcpy(o->arrayData->data, d->data, sizeof(Value)*toCopy);
+        memcpy(o->arrayData()->data, d->data, sizeof(Value)*toCopy);
         if (enforceAttributes) {
             if (d->attrs)
-                memcpy(o->arrayData->attrs, d->attrs, sizeof(PropertyAttributes)*toCopy);
+                memcpy(o->arrayData()->attrs, d->attrs, sizeof(PropertyAttributes)*toCopy);
             else
                 for (uint i = 0; i < toCopy; ++i)
-                    o->arrayData->attrs[i] = Attr_Data;
+                    o->arrayData()->attrs[i] = Attr_Data;
         }
     }
 
     if (newType != Sparse)
         return;
 
-    SparseArrayData *newData = static_cast<SparseArrayData *>(o->arrayData);
+    SparseArrayData *newData = static_cast<SparseArrayData *>(o->arrayData());
     if (d && d->type == Sparse) {
         SparseArrayData *old = static_cast<SparseArrayData *>(d);
         newData->sparse = old->sparse;
@@ -185,7 +185,7 @@ void ArrayData::realloc(Object *o, Type newType, uint offset, uint alloc, bool e
 
 void SimpleArrayData::getHeadRoom(Object *o)
 {
-    SimpleArrayData *dd = static_cast<SimpleArrayData *>(o->arrayData);
+    SimpleArrayData *dd = static_cast<SimpleArrayData *>(o->arrayData());
     Q_ASSERT(dd);
     Q_ASSERT(!dd->offset);
     uint offset = qMax(dd->len >> 2, (uint)16);
@@ -195,12 +195,12 @@ void SimpleArrayData::getHeadRoom(Object *o)
 ArrayData *SimpleArrayData::reallocate(Object *o, uint n, bool enforceAttributes)
 {
     realloc(o, Simple, 0, n, enforceAttributes);
-    return o->arrayData;
+    return o->arrayData();
 }
 
 void ArrayData::ensureAttributes(Object *o)
 {
-    if (o->arrayData && o->arrayData->attrs)
+    if (o->arrayData() && o->arrayData()->attrs)
         return;
 
     ArrayData::realloc(o, Simple, 0, 0, true);
@@ -225,7 +225,7 @@ ReturnedValue SimpleArrayData::get(const ArrayData *d, uint index)
 
 bool SimpleArrayData::put(Object *o, uint index, ValueRef value)
 {
-    SimpleArrayData *dd = static_cast<SimpleArrayData *>(o->arrayData);
+    SimpleArrayData *dd = static_cast<SimpleArrayData *>(o->arrayData());
     Q_ASSERT(index >= dd->len || !dd->attrs || !dd->attrs[index].isAccessor());
     // ### honour attributes
     dd->data[index] = value;
@@ -239,7 +239,7 @@ bool SimpleArrayData::put(Object *o, uint index, ValueRef value)
 
 bool SimpleArrayData::del(Object *o, uint index)
 {
-    SimpleArrayData *dd = static_cast<SimpleArrayData *>(o->arrayData);
+    SimpleArrayData *dd = static_cast<SimpleArrayData *>(o->arrayData());
     if (index >= dd->len)
         return true;
 
@@ -256,7 +256,7 @@ bool SimpleArrayData::del(Object *o, uint index)
 
 void SimpleArrayData::setAttribute(Object *o, uint index, PropertyAttributes attrs)
 {
-    o->arrayData->attrs[index] = attrs;
+    o->arrayData()->attrs[index] = attrs;
 }
 
 PropertyAttributes SimpleArrayData::attribute(const ArrayData *d, uint index)
@@ -266,12 +266,12 @@ PropertyAttributes SimpleArrayData::attribute(const ArrayData *d, uint index)
 
 void SimpleArrayData::push_front(Object *o, Value *values, uint n)
 {
-    SimpleArrayData *dd = static_cast<SimpleArrayData *>(o->arrayData);
+    SimpleArrayData *dd = static_cast<SimpleArrayData *>(o->arrayData());
     Q_ASSERT(!dd->attrs);
     for (int i = n - 1; i >= 0; --i) {
         if (!dd->offset) {
             getHeadRoom(o);
-            dd = static_cast<SimpleArrayData *>(o->arrayData);
+            dd = static_cast<SimpleArrayData *>(o->arrayData());
         }
 
 
@@ -286,7 +286,7 @@ void SimpleArrayData::push_front(Object *o, Value *values, uint n)
 
 ReturnedValue SimpleArrayData::pop_front(Object *o)
 {
-    SimpleArrayData *dd = static_cast<SimpleArrayData *>(o->arrayData);
+    SimpleArrayData *dd = static_cast<SimpleArrayData *>(o->arrayData());
     Q_ASSERT(!dd->attrs);
     if (!dd->len)
         return Encode::undefined();
@@ -301,7 +301,7 @@ ReturnedValue SimpleArrayData::pop_front(Object *o)
 
 uint SimpleArrayData::truncate(Object *o, uint newLen)
 {
-    SimpleArrayData *dd = static_cast<SimpleArrayData *>(o->arrayData);
+    SimpleArrayData *dd = static_cast<SimpleArrayData *>(o->arrayData());
     if (dd->len < newLen)
         return newLen;
 
@@ -327,10 +327,10 @@ uint SimpleArrayData::length(const ArrayData *d)
 
 bool SimpleArrayData::putArray(Object *o, uint index, Value *values, uint n)
 {
-    SimpleArrayData *dd = static_cast<SimpleArrayData *>(o->arrayData);
+    SimpleArrayData *dd = static_cast<SimpleArrayData *>(o->arrayData());
     if (index + n > dd->alloc) {
         reallocate(o, index + n + 1, false);
-        dd = static_cast<SimpleArrayData *>(o->arrayData);
+        dd = static_cast<SimpleArrayData *>(o->arrayData());
     }
     for (uint i = dd->len; i < index; ++i)
         dd->data[i] = Primitive::emptyValue();
@@ -378,20 +378,20 @@ void SparseArrayData::markObjects(Managed *d, ExecutionEngine *e)
 ArrayData *SparseArrayData::reallocate(Object *o, uint n, bool enforceAttributes)
 {
     realloc(o, Sparse, 0, n, enforceAttributes);
-    return o->arrayData;
+    return o->arrayData();
 }
 
 // double slots are required for accessor properties
 uint SparseArrayData::allocate(Object *o, bool doubleSlot)
 {
-    Q_ASSERT(o->arrayData->type == ArrayData::Sparse);
-    SparseArrayData *dd = static_cast<SparseArrayData *>(o->arrayData);
+    Q_ASSERT(o->arrayData()->type == ArrayData::Sparse);
+    SparseArrayData *dd = static_cast<SparseArrayData *>(o->arrayData());
     if (doubleSlot) {
         uint *last = &dd->freeList;
         while (1) {
             if (*last + 1 >= dd->alloc) {
-                reallocate(o, o->arrayData->alloc + 2, true);
-                dd = static_cast<SparseArrayData *>(o->arrayData);
+                reallocate(o, o->arrayData()->alloc + 2, true);
+                dd = static_cast<SparseArrayData *>(o->arrayData());
                 last = &dd->freeList;
             }
 
@@ -399,15 +399,15 @@ uint SparseArrayData::allocate(Object *o, bool doubleSlot)
                 // found two slots in a row
                 uint idx = *last;
                 *last = dd->data[*last + 1].uint_32;
-                o->arrayData->attrs[idx] = Attr_Accessor;
+                o->arrayData()->attrs[idx] = Attr_Accessor;
                 return idx;
             }
             last = &dd->data[*last].uint_32;
         }
     } else {
         if (dd->alloc == dd->freeList) {
-            reallocate(o, o->arrayData->alloc + 2, false);
-            dd = static_cast<SparseArrayData *>(o->arrayData);
+            reallocate(o, o->arrayData()->alloc + 2, false);
+            dd = static_cast<SparseArrayData *>(o->arrayData());
         }
         uint idx = dd->freeList;
         dd->freeList = dd->data[idx].uint_32;
@@ -430,19 +430,19 @@ bool SparseArrayData::put(Object *o, uint index, ValueRef value)
     if (value->isEmpty())
         return true;
 
-    SparseArrayNode *n = static_cast<SparseArrayData *>(o->arrayData)->sparse->insert(index);
-    Q_ASSERT(n->value == UINT_MAX || !o->arrayData->attrs || !o->arrayData->attrs[n->value].isAccessor());
+    SparseArrayNode *n = static_cast<SparseArrayData *>(o->arrayData())->sparse->insert(index);
+    Q_ASSERT(n->value == UINT_MAX || !o->arrayData()->attrs || !o->arrayData()->attrs[n->value].isAccessor());
     if (n->value == UINT_MAX)
         n->value = allocate(o);
-    o->arrayData->data[n->value] = value;
-    if (o->arrayData->attrs)
-        o->arrayData->attrs[n->value] = Attr_Data;
+    o->arrayData()->data[n->value] = value;
+    if (o->arrayData()->attrs)
+        o->arrayData()->attrs[n->value] = Attr_Data;
     return true;
 }
 
 bool SparseArrayData::del(Object *o, uint index)
 {
-    SparseArrayData *dd = static_cast<SparseArrayData *>(o->arrayData);
+    SparseArrayData *dd = static_cast<SparseArrayData *>(o->arrayData());
     SparseArrayNode *n = dd->sparse->findNode(index);
     if (!n)
         return true;
@@ -477,18 +477,18 @@ bool SparseArrayData::del(Object *o, uint index)
 
 void SparseArrayData::setAttribute(Object *o, uint index, PropertyAttributes attrs)
 {
-    SparseArrayData *d = static_cast<SparseArrayData *>(o->arrayData);
+    SparseArrayData *d = static_cast<SparseArrayData *>(o->arrayData());
     SparseArrayNode *n = d->sparse->insert(index);
     if (n->value == UINT_MAX) {
         n->value = allocate(o, attrs.isAccessor());
-        d = static_cast<SparseArrayData *>(o->arrayData);
+        d = static_cast<SparseArrayData *>(o->arrayData());
     }
     else if (attrs.isAccessor() != d->attrs[n->value].isAccessor()) {
         // need to convert the slot
         free(d, n->value);
         n->value = allocate(o, attrs.isAccessor());
     }
-    o->arrayData->attrs[n->value] = attrs;
+    o->arrayData()->attrs[n->value] = attrs;
 }
 
 PropertyAttributes SparseArrayData::attribute(const ArrayData *d, uint index)
@@ -501,22 +501,22 @@ PropertyAttributes SparseArrayData::attribute(const ArrayData *d, uint index)
 
 void SparseArrayData::push_front(Object *o, Value *values, uint n)
 {
-    Q_ASSERT(!o->arrayData->attrs);
+    Q_ASSERT(!o->arrayData()->attrs);
     for (int i = n - 1; i >= 0; --i) {
         uint idx = allocate(o);
-        o->arrayData->data[idx] = values[i];
-        static_cast<SparseArrayData *>(o->arrayData)->sparse->push_front(idx);
+        o->arrayData()->data[idx] = values[i];
+        static_cast<SparseArrayData *>(o->arrayData())->sparse->push_front(idx);
     }
 }
 
 ReturnedValue SparseArrayData::pop_front(Object *o)
 {
-    Q_ASSERT(!o->arrayData->attrs);
-    uint idx = static_cast<SparseArrayData *>(o->arrayData)->sparse->pop_front();
+    Q_ASSERT(!o->arrayData()->attrs);
+    uint idx = static_cast<SparseArrayData *>(o->arrayData())->sparse->pop_front();
     ReturnedValue v;
     if (idx != UINT_MAX) {
-        v = o->arrayData->data[idx].asReturnedValue();
-        free(o->arrayData, idx);
+        v = o->arrayData()->data[idx].asReturnedValue();
+        free(o->arrayData(), idx);
     } else {
         v = Encode::undefined();
     }
@@ -525,7 +525,7 @@ ReturnedValue SparseArrayData::pop_front(Object *o)
 
 uint SparseArrayData::truncate(Object *o, uint newLen)
 {
-    SparseArrayData *d = static_cast<SparseArrayData *>(o->arrayData);
+    SparseArrayData *d = static_cast<SparseArrayData *>(o->arrayData());
     SparseArrayNode *begin = d->sparse->lowerBound(newLen);
     if (begin != d->sparse->end()) {
         SparseArrayNode *it = d->sparse->end()->previousNode();
@@ -568,12 +568,12 @@ bool SparseArrayData::putArray(Object *o, uint index, Value *values, uint n)
 
 uint ArrayData::append(Object *obj, const ArrayObject *otherObj, uint n)
 {
-    Q_ASSERT(!obj->arrayData->hasAttributes());
+    Q_ASSERT(!obj->arrayData()->hasAttributes());
 
     if (!n)
         return obj->getLength();
 
-    const ArrayData *other = otherObj->arrayData;
+    const ArrayData *other = otherObj->arrayData();
 
     if (other->isSparse())
         obj->initSparseArray();
@@ -605,12 +605,12 @@ uint ArrayData::append(Object *obj, const ArrayObject *otherObj, uint n)
 
 Property *ArrayData::insert(Object *o, uint index, bool isAccessor)
 {
-    if (!isAccessor && o->arrayData->type != ArrayData::Sparse) {
-        SimpleArrayData *d = static_cast<SimpleArrayData *>(o->arrayData);
+    if (!isAccessor && o->arrayData()->type != ArrayData::Sparse) {
+        SimpleArrayData *d = static_cast<SimpleArrayData *>(o->arrayData());
         if (index < 0x1000 || index < d->len + (d->len >> 2)) {
-            if (index >= o->arrayData->alloc) {
+            if (index >= o->arrayData()->alloc) {
                 o->arrayReserve(index + 1);
-                d = static_cast<SimpleArrayData *>(o->arrayData);
+                d = static_cast<SimpleArrayData *>(o->arrayData());
             }
             if (index >= d->len) {
                 // mark possible hole in the array
@@ -618,15 +618,15 @@ Property *ArrayData::insert(Object *o, uint index, bool isAccessor)
                     d->data[i] = Primitive::emptyValue();
                 d->len = index + 1;
             }
-            return reinterpret_cast<Property *>(o->arrayData->data + index);
+            return reinterpret_cast<Property *>(o->arrayData()->data + index);
         }
     }
 
     o->initSparseArray();
-    SparseArrayNode *n = static_cast<SparseArrayData *>(o->arrayData)->sparse->insert(index);
+    SparseArrayNode *n = static_cast<SparseArrayData *>(o->arrayData())->sparse->insert(index);
     if (n->value == UINT_MAX)
         n->value = SparseArrayData::allocate(o, isAccessor);
-    return reinterpret_cast<Property *>(o->arrayData->data + n->value);
+    return reinterpret_cast<Property *>(o->arrayData()->data + n->value);
 }
 
 
@@ -675,7 +675,7 @@ void ArrayData::sort(ExecutionContext *context, ObjectRef thisObject, const Valu
     if (!len)
         return;
 
-    if (!thisObject->arrayData->length())
+    if (!thisObject->arrayData()->length())
         return;
 
     if (!(comparefn->isUndefined() || comparefn->asObject())) {
@@ -686,17 +686,17 @@ void ArrayData::sort(ExecutionContext *context, ObjectRef thisObject, const Valu
     // The spec says the sorting goes through a series of get,put and delete operations.
     // this implies that the attributes don't get sorted around.
 
-    if (thisObject->arrayData->type == ArrayData::Sparse) {
+    if (thisObject->arrayData()->type == ArrayData::Sparse) {
         // since we sort anyway, we can simply iterate over the entries in the sparse
         // array and append them one by one to a regular one.
-        SparseArrayData *sparse = static_cast<SparseArrayData *>(thisObject->arrayData);
+        SparseArrayData *sparse = static_cast<SparseArrayData *>(thisObject->arrayData());
 
         if (!sparse->sparse->nEntries())
             return;
 
-        thisObject->arrayData = 0;
+        thisObject->setArrayData(0);
         ArrayData::realloc(thisObject, ArrayData::Simple, 0, sparse->sparse->nEntries(), sparse->attrs ? true : false);
-        SimpleArrayData *d = static_cast<SimpleArrayData *>(thisObject->arrayData);
+        SimpleArrayData *d = static_cast<SimpleArrayData *>(thisObject->arrayData());
 
         SparseArrayNode *n = sparse->sparse->begin();
         uint i = 0;
@@ -737,19 +737,19 @@ void ArrayData::sort(ExecutionContext *context, ObjectRef thisObject, const Valu
         }
         // ### explicitly delete sparse
     } else {
-        SimpleArrayData *d = static_cast<SimpleArrayData *>(thisObject->arrayData);
+        SimpleArrayData *d = static_cast<SimpleArrayData *>(thisObject->arrayData());
         if (len > d->len)
             len = d->len;
 
         // sort empty values to the end
         for (uint i = 0; i < len; i++) {
-            if (thisObject->arrayData->data[i].isEmpty()) {
+            if (thisObject->arrayData()->data[i].isEmpty()) {
                 while (--len > i)
-                    if (!thisObject->arrayData->data[len].isEmpty())
+                    if (!thisObject->arrayData()->data[len].isEmpty())
                         break;
-                Q_ASSERT(!thisObject->arrayData->attrs || !thisObject->arrayData->attrs[len].isAccessor());
-                thisObject->arrayData->data[i] = thisObject->arrayData->data[len];
-                thisObject->arrayData->data[len] = Primitive::emptyValue();
+                Q_ASSERT(!thisObject->arrayData()->attrs || !thisObject->arrayData()->attrs[len].isAccessor());
+                thisObject->arrayData()->data[i] = thisObject->arrayData()->data[len];
+                thisObject->arrayData()->data[len] = Primitive::emptyValue();
             }
         }
 
@@ -760,7 +760,7 @@ void ArrayData::sort(ExecutionContext *context, ObjectRef thisObject, const Valu
 
     ArrayElementLessThan lessThan(context, thisObject, comparefn);
 
-    Value *begin = thisObject->arrayData->data;
+    Value *begin = thisObject->arrayData()->data;
     std::sort(begin, begin + len, lessThan);
 
 #ifdef CHECK_SPARSE_ARRAYS
index 1e12089..5c83eb0 100644 (file)
@@ -304,9 +304,9 @@ ReturnedValue ArrayPrototype::method_push(CallContext *ctx)
 
     if (!ctx->callData->argc) {
         ;
-    } else if (!instance->protoHasArray() && instance->arrayData->length() <= len && instance->arrayType() == ArrayData::Simple) {
-        instance->arrayData->vtable()->putArray(instance.getPointer(), len, ctx->callData->args, ctx->callData->argc);
-        len = instance->arrayData->length();
+    } else if (!instance->protoHasArray() && instance->arrayData()->length() <= len && instance->arrayType() == ArrayData::Simple) {
+        instance->arrayData()->vtable()->putArray(instance.getPointer(), len, ctx->callData->args, ctx->callData->argc);
+        len = instance->arrayData()->length();
     } else {
         for (int i = 0; i < ctx->callData->argc; ++i)
             instance->putIndexed(len + i, ctx->callData->args[i]);
@@ -371,8 +371,8 @@ ReturnedValue ArrayPrototype::method_shift(CallContext *ctx)
 
     ScopedValue result(scope);
 
-    if (!instance->protoHasArray() && !instance->arrayData->hasAttributes() && instance->arrayData->length() <= len) {
-        result = instance->arrayData->vtable()->pop_front(instance.getPointer());
+    if (!instance->protoHasArray() && !instance->arrayData()->hasAttributes() && instance->arrayData()->length() <= len) {
+        result = instance->arrayData()->vtable()->pop_front(instance.getPointer());
     } else {
         result = instance->getIndexed(0);
         if (scope.hasException())
@@ -550,8 +550,8 @@ ReturnedValue ArrayPrototype::method_unshift(CallContext *ctx)
 
     uint len = instance->getLength();
 
-    if (!instance->protoHasArray() && !instance->arrayData->hasAttributes() && instance->arrayData->length() <= len) {
-        instance->arrayData->vtable()->push_front(instance.getPointer(), ctx->callData->args, ctx->callData->argc);
+    if (!instance->protoHasArray() && !instance->arrayData()->hasAttributes() && instance->arrayData()->length() <= len) {
+        instance->arrayData()->vtable()->push_front(instance.getPointer(), ctx->callData->args, ctx->callData->argc);
     } else {
         ScopedValue v(scope);
         for (uint k = len; k > 0; --k) {
@@ -623,13 +623,13 @@ ReturnedValue ArrayPrototype::method_indexOf(CallContext *ctx)
             if (exists && RuntimeHelpers::strictEqual(value, searchValue))
                 return Encode(i);
         }
-    } else if (!instance->arrayData) {
+    } else if (!instance->arrayData()) {
         return Encode(-1);
     } else {
         Q_ASSERT(instance->arrayType() == ArrayData::Simple || instance->arrayType() == ArrayData::Complex);
-        if (len > instance->arrayData->length())
-            len = instance->arrayData->length();
-        Value *val = instance->arrayData->data;
+        if (len > instance->arrayData()->length())
+            len = instance->arrayData()->length();
+        Value *val = instance->arrayData()->data;
         Value *end = val + len;
         val += fromIndex;
         while (val < end) {
@@ -638,7 +638,7 @@ ReturnedValue ArrayPrototype::method_indexOf(CallContext *ctx)
                 if (scope.hasException())
                     return Encode::undefined();
                 if (RuntimeHelpers::strictEqual(value, searchValue))
-                    return Encode((uint)(val - instance->arrayData->data));
+                    return Encode((uint)(val - instance->arrayData()->data));
             }
             ++val;
         }
index e5d210e..1edf6c7 100644 (file)
@@ -111,7 +111,7 @@ FunctionObject::FunctionObject(InternalClass *ic)
 {
     managedData()->needsActivation = false;
     managedData()->strictMode = false;
-    memberData[Index_Prototype] = Encode::undefined();
+    memberData()[Index_Prototype] = Encode::undefined();
 }
 
 FunctionObject::~FunctionObject()
@@ -130,10 +130,10 @@ void FunctionObject::init(const StringRef n, bool createProto)
 
     if (createProto) {
         Scoped<Object> proto(s, scope->engine->newObject(scope->engine->protoClass));
-        proto->memberData[Index_ProtoConstructor] = this->asReturnedValue();
-        memberData[Index_Prototype] = proto.asReturnedValue();
+        proto->memberData()[Index_ProtoConstructor] = this->asReturnedValue();
+        memberData()[Index_Prototype] = proto.asReturnedValue();
     } else {
-        memberData[Index_Prototype] = Encode::undefined();
+        memberData()[Index_Prototype] = Encode::undefined();
     }
 
     ScopedValue v(s, n.asReturnedValue());
@@ -304,9 +304,9 @@ ReturnedValue FunctionPrototype::method_apply(CallContext *ctx)
             for (quint32 i = 0; i < len; ++i)
                 callData->args[i] = arr->getIndexed(i);
         } else {
-            int alen = qMin(len, arr->arrayData->length());
+            int alen = qMin(len, arr->arrayData()->length());
             if (alen)
-                memcpy(callData->args, arr->arrayData->data, alen*sizeof(Value));
+                memcpy(callData->args, arr->arrayData()->data, alen*sizeof(Value));
             for (quint32 i = alen; i < len; ++i)
                 callData->args[i] = Primitive::undefinedValue();
         }
index 0160bfd..53f2481 100644 (file)
@@ -137,7 +137,7 @@ struct Q_QML_EXPORT FunctionObject: Object {
 
     static FunctionObject *createScriptFunction(ExecutionContext *scope, Function *function, bool createProto = true);
 
-    ReturnedValue protoProperty() { return memberData[Index_Prototype].asReturnedValue(); }
+    ReturnedValue protoProperty() { return memberData()[Index_Prototype].asReturnedValue(); }
 
     bool needsActivation() const { return managedData()->needsActivation; }
     bool strictMode() const { return managedData()->strictMode; }
index e86a2d3..354bedd 100644 (file)
@@ -161,10 +161,10 @@ void InternalClass::changeMember(Object *object, String *string, PropertyAttribu
 
     if (newClass->size > object->internalClass()->size) {
         Q_ASSERT(newClass->size == object->internalClass()->size + 1);
-        memmove(object->memberData.data() + idx + 2, object->memberData.data() + idx + 1, (object->internalClass()->size - idx - 1)*sizeof(Value));
+        memmove(object->memberData().data() + idx + 2, object->memberData().data() + idx + 1, (object->internalClass()->size - idx - 1)*sizeof(Value));
     } else if (newClass->size < object->internalClass()->size) {
         Q_ASSERT(newClass->size == object->internalClass()->size - 1);
-        memmove(object->memberData.data() + idx + 1, object->memberData.data() + idx + 2, (object->internalClass()->size - idx - 2)*sizeof(Value));
+        memmove(object->memberData().data() + idx + 1, object->memberData().data() + idx + 2, (object->internalClass()->size - idx - 2)*sizeof(Value));
     }
     object->setInternalClass(newClass);
 }
@@ -369,7 +369,7 @@ void InternalClass::removeMember(Object *object, Identifier *id)
     }
 
     // remove the entry in memberdata
-    memmove(object->memberData.data() + propIdx, object->memberData.data() + propIdx + 1, (object->internalClass()->size - propIdx)*sizeof(Value));
+    memmove(object->memberData().data() + propIdx, object->memberData().data() + propIdx + 1, (object->internalClass()->size - propIdx)*sizeof(Value));
 
     oldClass->transitions.insert(t, object->internalClass());
 }
index 024dc0a..f43ef0b 100644 (file)
@@ -57,7 +57,7 @@ ReturnedValue Lookup::lookup(ValueRef thisObject, Object *obj, PropertyAttribute
         if (index != UINT_MAX) {
             level = i;
             *attrs = obj->internalClass()->propertyData.at(index);
-            return !attrs->isAccessor() ? obj->memberData[index].asReturnedValue() : obj->getValue(thisObject, obj->propertyAt(index), *attrs);
+            return !attrs->isAccessor() ? obj->memberData()[index].asReturnedValue() : obj->getValue(thisObject, obj->propertyAt(index), *attrs);
         }
 
         obj = obj->prototype();
@@ -69,7 +69,7 @@ ReturnedValue Lookup::lookup(ValueRef thisObject, Object *obj, PropertyAttribute
         index = obj->internalClass()->find(name);
         if (index != UINT_MAX) {
             *attrs = obj->internalClass()->propertyData.at(index);
-            return !attrs->isAccessor() ? obj->memberData[index].asReturnedValue() : obj->getValue(thisObject, obj->propertyAt(index), *attrs);
+            return !attrs->isAccessor() ? obj->memberData()[index].asReturnedValue() : obj->getValue(thisObject, obj->propertyAt(index), *attrs);
         }
 
         obj = obj->prototype();
@@ -88,7 +88,7 @@ ReturnedValue Lookup::lookup(Object *obj, PropertyAttributes *attrs)
         if (index != UINT_MAX) {
             level = i;
             *attrs = obj->internalClass()->propertyData.at(index);
-            return !attrs->isAccessor() ? obj->memberData[index].asReturnedValue() : thisObject->getValue(obj->propertyAt(index), *attrs);
+            return !attrs->isAccessor() ? obj->memberData()[index].asReturnedValue() : thisObject->getValue(obj->propertyAt(index), *attrs);
         }
 
         obj = obj->prototype();
@@ -100,7 +100,7 @@ ReturnedValue Lookup::lookup(Object *obj, PropertyAttributes *attrs)
         index = obj->internalClass()->find(name);
         if (index != UINT_MAX) {
             *attrs = obj->internalClass()->propertyData.at(index);
-            return !attrs->isAccessor() ? obj->memberData[index].asReturnedValue() : thisObject->getValue(obj->propertyAt(index), *attrs);
+            return !attrs->isAccessor() ? obj->memberData()[index].asReturnedValue() : thisObject->getValue(obj->propertyAt(index), *attrs);
         }
 
         obj = obj->prototype();
@@ -147,8 +147,8 @@ ReturnedValue Lookup::indexedGetterFallback(Lookup *l, const ValueRef object, co
     }
 
     if (idx < UINT_MAX) {
-        if (!o->arrayData->hasAttributes()) {
-            ScopedValue v(scope, o->arrayData->get(idx));
+        if (!o->arrayData()->hasAttributes()) {
+            ScopedValue v(scope, o->arrayData()->get(idx));
             if (!v->isEmpty())
                 return v->asReturnedValue();
         }
@@ -171,10 +171,10 @@ ReturnedValue Lookup::indexedGetterObjectInt(Lookup *l, const ValueRef object, c
         return indexedGetterGeneric(l, object, index);
 
     Object *o = object->objectValue();
-    if (o->arrayData && o->arrayData->type == ArrayData::Simple) {
-        if (idx < static_cast<SimpleArrayData *>(o->arrayData)->len)
-            if (!o->arrayData->data[idx].isEmpty())
-                return o->arrayData->data[idx].asReturnedValue();
+    if (o->arrayData() && o->arrayData()->type == ArrayData::Simple) {
+        if (idx < static_cast<SimpleArrayData *>(o->arrayData())->len)
+            if (!o->arrayData()->data[idx].isEmpty())
+                return o->arrayData()->data[idx].asReturnedValue();
     }
 
     return indexedGetterFallback(l, object, index);
@@ -184,7 +184,7 @@ void Lookup::indexedSetterGeneric(Lookup *l, const ValueRef object, const ValueR
 {
     if (object->isObject()) {
         Object *o = object->objectValue();
-        if (o->arrayData && o->arrayData->type == ArrayData::Simple && index->asArrayIndex() < UINT_MAX) {
+        if (o->arrayData() && o->arrayData()->type == ArrayData::Simple && index->asArrayIndex() < UINT_MAX) {
             l->indexedSetter = indexedSetterObjectInt;
             indexedSetterObjectInt(l, object, index, v);
             return;
@@ -203,8 +203,8 @@ void Lookup::indexedSetterFallback(Lookup *l, const ValueRef object, const Value
 
     uint idx = index->asArrayIndex();
     if (idx < UINT_MAX) {
-        if (o->arrayData && o->arrayData->type == ArrayData::Simple) {
-            SimpleArrayData *s = static_cast<SimpleArrayData *>(o->arrayData);
+        if (o->arrayData() && o->arrayData()->type == ArrayData::Simple) {
+            SimpleArrayData *s = static_cast<SimpleArrayData *>(o->arrayData());
             if (s && idx < s->len && !s->data[idx].isEmpty()) {
                 s->data[idx] = value;
                 return;
@@ -227,8 +227,8 @@ void Lookup::indexedSetterObjectInt(Lookup *l, const ValueRef object, const Valu
     }
 
     Object *o = object->objectValue();
-    if (o->arrayData && o->arrayData->type == ArrayData::Simple) {
-        SimpleArrayData *s = static_cast<SimpleArrayData *>(o->arrayData);
+    if (o->arrayData() && o->arrayData()->type == ArrayData::Simple) {
+        SimpleArrayData *s = static_cast<SimpleArrayData *>(o->arrayData());
         if (idx < s->len && !s->data[idx].isEmpty()) {
             s->data[idx] = v;
             return;
@@ -341,7 +341,7 @@ ReturnedValue Lookup::getter0(Lookup *l, const ValueRef object)
         // the internal class won't match
         Object *o = object->objectValue();
         if (l->classList[0] == o->internalClass())
-            return o->memberData[l->index].asReturnedValue();
+            return o->memberData()[l->index].asReturnedValue();
     }
     return getterTwoClasses(l, object);
 }
@@ -354,7 +354,7 @@ ReturnedValue Lookup::getter1(Lookup *l, const ValueRef object)
         Object *o = object->objectValue();
         if (l->classList[0] == o->internalClass() &&
             l->classList[1] == o->prototype()->internalClass())
-            return o->prototype()->memberData[l->index].asReturnedValue();
+            return o->prototype()->memberData()[l->index].asReturnedValue();
     }
     return getterTwoClasses(l, object);
 }
@@ -370,7 +370,7 @@ ReturnedValue Lookup::getter2(Lookup *l, const ValueRef object)
             if (l->classList[1] == o->internalClass()) {
                 o = o->prototype();
                 if (l->classList[2] == o->internalClass())
-                    return o->memberData[l->index].asReturnedValue();
+                    return o->memberData()[l->index].asReturnedValue();
             }
         }
     }
@@ -385,9 +385,9 @@ ReturnedValue Lookup::getter0getter0(Lookup *l, const ValueRef object)
         // the internal class won't match
         Object *o = object->objectValue();
         if (l->classList[0] == o->internalClass())
-            return o->memberData[l->index].asReturnedValue();
+            return o->memberData()[l->index].asReturnedValue();
         if (l->classList[2] == o->internalClass())
-            return o->memberData[l->index2].asReturnedValue();
+            return o->memberData()[l->index2].asReturnedValue();
     }
     l->getter = getterFallback;
     return getterFallback(l, object);
@@ -400,10 +400,10 @@ ReturnedValue Lookup::getter0getter1(Lookup *l, const ValueRef object)
         // the internal class won't match
         Object *o = object->objectValue();
         if (l->classList[0] == o->internalClass())
-            return o->memberData[l->index].asReturnedValue();
+            return o->memberData()[l->index].asReturnedValue();
         if (l->classList[2] == o->internalClass() &&
             l->classList[3] == o->prototype()->internalClass())
-            return o->prototype()->memberData[l->index2].asReturnedValue();
+            return o->prototype()->memberData()[l->index2].asReturnedValue();
     }
     l->getter = getterFallback;
     return getterFallback(l, object);
@@ -417,10 +417,10 @@ ReturnedValue Lookup::getter1getter1(Lookup *l, const ValueRef object)
         Object *o = object->objectValue();
         if (l->classList[0] == o->internalClass() &&
             l->classList[1] == o->prototype()->internalClass())
-            return o->prototype()->memberData[l->index].asReturnedValue();
+            return o->prototype()->memberData()[l->index].asReturnedValue();
         if (l->classList[2] == o->internalClass() &&
             l->classList[3] == o->prototype()->internalClass())
-            return o->prototype()->memberData[l->index2].asReturnedValue();
+            return o->prototype()->memberData()[l->index2].asReturnedValue();
         return getterFallback(l, object);
     }
     l->getter = getterFallback;
@@ -503,7 +503,7 @@ ReturnedValue Lookup::primitiveGetter0(Lookup *l, const ValueRef object)
     if (object->type() == l->type) {
         Object *o = l->proto;
         if (l->classList[0] == o->internalClass())
-            return o->memberData[l->index].asReturnedValue();
+            return o->memberData()[l->index].asReturnedValue();
     }
     l->getter = getterGeneric;
     return getterGeneric(l, object);
@@ -515,7 +515,7 @@ ReturnedValue Lookup::primitiveGetter1(Lookup *l, const ValueRef object)
         Object *o = l->proto;
         if (l->classList[0] == o->internalClass() &&
             l->classList[1] == o->prototype()->internalClass())
-            return o->prototype()->memberData[l->index].asReturnedValue();
+            return o->prototype()->memberData()[l->index].asReturnedValue();
     }
     l->getter = getterGeneric;
     return getterGeneric(l, object);
@@ -572,7 +572,7 @@ ReturnedValue Lookup::stringLengthGetter(Lookup *l, const ValueRef object)
 ReturnedValue Lookup::arrayLengthGetter(Lookup *l, const ValueRef object)
 {
     if (ArrayObject *a = object->asArrayObject())
-        return a->memberData[ArrayObject::LengthPropertyIndex].asReturnedValue();
+        return a->memberData()[ArrayObject::LengthPropertyIndex].asReturnedValue();
 
     l->getter = getterGeneric;
     return getterGeneric(l, object);
@@ -612,7 +612,7 @@ ReturnedValue Lookup::globalGetter0(Lookup *l, ExecutionContext *ctx)
 {
     Object *o = ctx->engine->globalObject;
     if (l->classList[0] == o->internalClass())
-        return o->memberData[l->index].asReturnedValue();
+        return o->memberData()[l->index].asReturnedValue();
 
     l->globalGetter = globalGetterGeneric;
     return globalGetterGeneric(l, ctx);
@@ -623,7 +623,7 @@ ReturnedValue Lookup::globalGetter1(Lookup *l, ExecutionContext *ctx)
     Object *o = ctx->engine->globalObject;
     if (l->classList[0] == o->internalClass() &&
         l->classList[1] == o->prototype()->internalClass())
-        return o->prototype()->memberData[l->index].asReturnedValue();
+        return o->prototype()->memberData()[l->index].asReturnedValue();
 
     l->globalGetter = globalGetterGeneric;
     return globalGetterGeneric(l, ctx);
@@ -637,7 +637,7 @@ ReturnedValue Lookup::globalGetter2(Lookup *l, ExecutionContext *ctx)
         if (l->classList[1] == o->internalClass()) {
             o = o->prototype();
             if (l->classList[2] == o->internalClass()) {
-                return o->prototype()->memberData[l->index].asReturnedValue();
+                return o->prototype()->memberData()[l->index].asReturnedValue();
             }
         }
     }
@@ -751,7 +751,7 @@ void Lookup::setter0(Lookup *l, const ValueRef object, const ValueRef value)
 {
     Object *o = static_cast<Object *>(object->asManaged());
     if (o && o->internalClass() == l->classList[0]) {
-        o->memberData[l->index] = *value;
+        o->memberData()[l->index] = *value;
         return;
     }
 
@@ -763,9 +763,9 @@ void Lookup::setterInsert0(Lookup *l, const ValueRef object, const ValueRef valu
     Object *o = static_cast<Object *>(object->asManaged());
     if (o && o->internalClass() == l->classList[0]) {
         if (!o->prototype()) {
-            if (l->index >= o->memberData.size())
+            if (l->index >= o->memberData().size())
                 o->ensureMemberIndex(l->index);
-            o->memberData[l->index] = *value;
+            o->memberData()[l->index] = *value;
             o->setInternalClass(l->classList[3]);
             return;
         }
@@ -781,9 +781,9 @@ void Lookup::setterInsert1(Lookup *l, const ValueRef object, const ValueRef valu
     if (o && o->internalClass() == l->classList[0]) {
         Object *p = o->prototype();
         if (p && p->internalClass() == l->classList[1]) {
-            if (l->index >= o->memberData.size())
+            if (l->index >= o->memberData().size())
                 o->ensureMemberIndex(l->index);
-            o->memberData[l->index] = *value;
+            o->memberData()[l->index] = *value;
             o->setInternalClass(l->classList[3]);
             return;
         }
@@ -801,9 +801,9 @@ void Lookup::setterInsert2(Lookup *l, const ValueRef object, const ValueRef valu
         if (p && p->internalClass() == l->classList[1]) {
             p = p->prototype();
             if (p && p->internalClass() == l->classList[2]) {
-                if (l->index >= o->memberData.size())
+                if (l->index >= o->memberData().size())
                     o->ensureMemberIndex(l->index);
-                o->memberData[l->index] = *value;
+                o->memberData()[l->index] = *value;
                 o->setInternalClass(l->classList[3]);
                 return;
             }
@@ -819,11 +819,11 @@ void Lookup::setter0setter0(Lookup *l, const ValueRef object, const ValueRef val
     Object *o = static_cast<Object *>(object->asManaged());
     if (o) {
         if (o->internalClass() == l->classList[0]) {
-            o->memberData[l->index] = *value;
+            o->memberData()[l->index] = *value;
             return;
         }
         if (o->internalClass() == l->classList[1]) {
-            o->memberData[l->index2] = *value;
+            o->memberData()[l->index2] = *value;
             return;
         }
     }
index 9d5a491..d33e294 100644 (file)
@@ -80,11 +80,11 @@ Object::Object(InternalClass *ic)
 {
     Q_ASSERT(internalClass()->vtable != &Managed::static_vtbl);
 
-    Q_ASSERT(!memberData.d());
+    Q_ASSERT(!memberData().d());
     if (internalClass()->size) {
         Scope scope(engine());
         ScopedObject protectThis(scope, this);
-        memberData.ensureIndex(engine(), internalClass()->size);
+        memberData().ensureIndex(engine(), internalClass()->size);
     }
 }
 
@@ -211,14 +211,14 @@ void Object::markObjects(Managed *that, ExecutionEngine *e)
 {
     Object *o = static_cast<Object *>(that);
 
-    o->memberData.mark(e);
-    if (o->arrayData)
-        o->arrayData->mark(e);
+    o->memberData().mark(e);
+    if (o->arrayData())
+        o->arrayData()->mark(e);
 }
 
 void Object::ensureMemberIndex(uint idx)
 {
-    memberData.ensureIndex(engine(), idx);
+    memberData().ensureIndex(engine(), idx);
 }
 
 void Object::insertMember(const StringRef s, const Property &p, PropertyAttributes attributes)
@@ -235,7 +235,7 @@ void Object::insertMember(const StringRef s, const Property &p, PropertyAttribut
         pp->value = p.value;
         pp->set = p.set;
     } else {
-        memberData[idx] = p.value;
+        memberData()[idx] = p.value;
     }
 }
 
@@ -260,10 +260,10 @@ Property *Object::__getOwnProperty__(const StringRef name, PropertyAttributes *a
 
 Property *Object::__getOwnProperty__(uint index, PropertyAttributes *attrs)
 {
-    Property *p = arrayData->getProperty(index);
+    Property *p = arrayData()->getProperty(index);
     if (p) {
         if (attrs)
-            *attrs = arrayData->attributes(index);
+            *attrs = arrayData()->attributes(index);
         return p;
     }
     if (isStringObject()) {
@@ -305,10 +305,10 @@ Property *Object::__getPropertyDescriptor__(uint index, PropertyAttributes *attr
 {
     const Object *o = this;
     while (o) {
-        Property *p = o->arrayData->getProperty(index);
+        Property *p = o->arrayData()->getProperty(index);
         if (p) {
             if (attrs)
-                *attrs = o->arrayData->attributes(index);
+                *attrs = o->arrayData()->attributes(index);
             return p;
         }
         if (o->isStringObject()) {
@@ -371,7 +371,7 @@ bool Object::hasOwnProperty(const StringRef name) const
 
 bool Object::hasOwnProperty(uint index) const
 {
-    if (!arrayData->isEmpty(index))
+    if (!arrayData()->isEmpty(index))
         return true;
     if (isStringObject()) {
         String *s = static_cast<const StringObject *>(this)->value.asString();
@@ -430,8 +430,8 @@ PropertyAttributes Object::query(const Managed *m, StringRef name)
 PropertyAttributes Object::queryIndexed(const Managed *m, uint index)
 {
     const Object *o = static_cast<const Object *>(m);
-    if (o->arrayData->get(index) != Primitive::emptyValue().asReturnedValue())
-        return o->arrayData->attributes(index);
+    if (o->arrayData()->get(index) != Primitive::emptyValue().asReturnedValue())
+        return o->arrayData()->attributes(index);
 
     if (o->isStringObject()) {
         String *s = static_cast<const StringObject *>(o)->value.asString();
@@ -494,7 +494,7 @@ void Object::setLookup(Managed *m, Lookup *l, const ValueRef value)
             l->classList[0] = o->internalClass();
             l->index = idx;
             l->setter = Lookup::setter0;
-            o->memberData[idx] = *value;
+            o->memberData()[idx] = *value;
             return;
         }
 
@@ -540,7 +540,7 @@ void Object::advanceIterator(Managed *m, ObjectIterator *it, StringRef name, uin
     name = (String *)0;
     *index = UINT_MAX;
 
-    if (o->arrayData) {
+    if (o->arrayData()) {
         if (!it->arrayIndex)
             it->arrayNode = o->sparseBegin();
 
@@ -549,9 +549,9 @@ void Object::advanceIterator(Managed *m, ObjectIterator *it, StringRef name, uin
             while (it->arrayNode != o->sparseEnd()) {
                 int k = it->arrayNode->key();
                 uint pidx = it->arrayNode->value;
-                Property *p = reinterpret_cast<Property *>(o->arrayData->data + pidx);
+                Property *p = reinterpret_cast<Property *>(o->arrayData()->data + pidx);
                 it->arrayNode = it->arrayNode->nextNode();
-                PropertyAttributes a = o->arrayData->attributes(k);
+                PropertyAttributes a = o->arrayData()->attributes(k);
                 if (!(it->flags & ObjectIterator::EnumerableOnly) || a.isEnumerable()) {
                     it->arrayIndex = k + 1;
                     *index = k;
@@ -564,9 +564,9 @@ void Object::advanceIterator(Managed *m, ObjectIterator *it, StringRef name, uin
             it->arrayIndex = UINT_MAX;
         }
         // dense arrays
-        while (it->arrayIndex < o->arrayData->length()) {
-            Value *val = o->arrayData->data + it->arrayIndex;
-            PropertyAttributes a = o->arrayData->attributes(it->arrayIndex);
+        while (it->arrayIndex < o->arrayData()->length()) {
+            Value *val = o->arrayData()->data + it->arrayIndex;
+            PropertyAttributes a = o->arrayData()->attributes(it->arrayIndex);
             ++it->arrayIndex;
             if (!val->isEmpty()
                 && (!(it->flags & ObjectIterator::EnumerableOnly) || a.isEnumerable())) {
@@ -632,10 +632,10 @@ ReturnedValue Object::internalGetIndexed(uint index, bool *hasProperty)
     PropertyAttributes attrs;
     Object *o = this;
     while (o) {
-        Property *p = o->arrayData->getProperty(index);
+        Property *p = o->arrayData()->getProperty(index);
         if (p) {
             pd = p;
-            attrs = o->arrayData->attributes(index);
+            attrs = o->arrayData()->attributes(index);
             break;
         }
         if (o->isStringObject()) {
@@ -752,9 +752,9 @@ void Object::internalPutIndexed(uint index, const ValueRef value)
 
     PropertyAttributes attrs;
 
-    Property *pd = arrayData->getProperty(index);
+    Property *pd = arrayData()->getProperty(index);
     if (pd)
-        attrs = arrayData->attributes(index);
+        attrs = arrayData()->attributes(index);
 
     if (!pd && isStringObject()) {
         pd = static_cast<StringObject *>(this)->getIndex(index);
@@ -844,7 +844,7 @@ bool Object::internalDeleteIndexedProperty(uint index)
     if (internalClass()->engine->hasException)
         return false;
 
-    if (!arrayData || arrayData->vtable()->del(this, index))
+    if (!arrayData() || arrayData()->vtable()->del(this, index))
         return true;
 
     if (engine()->currentContext()->strictMode)
@@ -940,7 +940,7 @@ bool Object::defineOwnProperty2(ExecutionContext *ctx, uint index, const Propert
 
     // Clause 1
     {
-        current = arrayData->getProperty(index);
+        current = arrayData()->getProperty(index);
         if (!current && isStringObject())
             current = static_cast<StringObject *>(this)->getIndex(index);
     }
@@ -982,8 +982,8 @@ bool Object::__defineOwnProperty__(ExecutionContext *ctx, uint index, const Stri
         current = propertyAt(index);
         cattrs = internalClass()->propertyData[index];
     } else {
-        current = arrayData->getProperty(index);
-        cattrs = arrayData->attributes(index);
+        current = arrayData()->getProperty(index);
+        cattrs = arrayData()->attributes(index);
     }
 
     // clause 6
@@ -1015,7 +1015,7 @@ bool Object::__defineOwnProperty__(ExecutionContext *ctx, uint index, const Stri
                 // need to convert the array and the slot
                 initSparseArray();
                 setArrayAttributes(index, cattrs);
-                current = arrayData->getProperty(index);
+                current = arrayData()->getProperty(index);
             }
             current->setGetter(0);
             current->setSetter(0);
@@ -1026,7 +1026,7 @@ bool Object::__defineOwnProperty__(ExecutionContext *ctx, uint index, const Stri
             if (member.isNull()) {
                 // need to convert the array and the slot
                 setArrayAttributes(index, cattrs);
-                current = arrayData->getProperty(index);
+                current = arrayData()->getProperty(index);
             }
             current->value = Primitive::undefinedValue();
         }
@@ -1084,30 +1084,30 @@ void Object::copyArrayData(Object *other)
         for (uint i = 0; i < len; ++i) {
             arraySet(i, (v = other->getIndexed(i)));
         }
-    } else if (!other->arrayData) {
+    } else if (!other->arrayData()) {
         ;
-    } else if (other->hasAccessorProperty() && other->arrayData->attrs && other->arrayData->isSparse()){
+    } else if (other->hasAccessorProperty() && other->arrayData()->attrs && other->arrayData()->isSparse()){
         // do it the slow way
         ScopedValue v(scope);
-        for (const SparseArrayNode *it = static_cast<const SparseArrayData *>(other->arrayData)->sparse->begin();
-             it != static_cast<const SparseArrayData *>(other->arrayData)->sparse->end(); it = it->nextNode()) {
-            v = other->getValue(reinterpret_cast<Property *>(other->arrayData->data + it->value), other->arrayData->attrs[it->value]);
+        for (const SparseArrayNode *it = static_cast<const SparseArrayData *>(other->arrayData())->sparse->begin();
+             it != static_cast<const SparseArrayData *>(other->arrayData())->sparse->end(); it = it->nextNode()) {
+            v = other->getValue(reinterpret_cast<Property *>(other->arrayData()->data + it->value), other->arrayData()->attrs[it->value]);
             arraySet(it->key(), v);
         }
     } else {
-        Q_ASSERT(!arrayData && other->arrayData);
-        ArrayData::realloc(this, other->arrayData->type, 0, other->arrayData->alloc, other->arrayData->attrs);
+        Q_ASSERT(!arrayData() && other->arrayData());
+        ArrayData::realloc(this, other->arrayData()->type, 0, other->arrayData()->alloc, other->arrayData()->attrs);
         if (other->arrayType() == ArrayData::Sparse) {
-            SparseArrayData *od = static_cast<SparseArrayData *>(other->arrayData);
-            SparseArrayData *dd = static_cast<SparseArrayData *>(arrayData);
+            SparseArrayData *od = static_cast<SparseArrayData *>(other->arrayData());
+            SparseArrayData *dd = static_cast<SparseArrayData *>(arrayData());
             dd->sparse = new SparseArray(*od->sparse);
             dd->freeList = od->freeList;
         } else {
-            SimpleArrayData *d = static_cast<SimpleArrayData *>(arrayData);
-            d->len = static_cast<SimpleArrayData *>(other->arrayData)->len;
+            SimpleArrayData *d = static_cast<SimpleArrayData *>(arrayData());
+            d->len = static_cast<SimpleArrayData *>(other->arrayData())->len;
             d->offset = 0;
         }
-        memcpy(arrayData->data, other->arrayData->data, arrayData->alloc*sizeof(Value));
+        memcpy(arrayData()->data, other->arrayData()->data, arrayData()->alloc*sizeof(Value));
     }
     setArrayLengthUnchecked(other->getLength());
 }
@@ -1127,10 +1127,10 @@ bool Object::setArrayLength(uint newLen)
     uint oldLen = getLength();
     bool ok = true;
     if (newLen < oldLen) {
-        if (!arrayData) {
+        if (!arrayData()) {
             Q_ASSERT(!newLen);
         } else {
-            uint l = arrayData->vtable()->truncate(this, newLen);
+            uint l = arrayData()->vtable()->truncate(this, newLen);
             if (l != newLen)
                 ok = false;
             newLen = l;
@@ -1177,7 +1177,7 @@ void ArrayObject::init(ExecutionEngine *engine)
 {
     Q_UNUSED(engine);
 
-    memberData[LengthPropertyIndex] = Primitive::fromInt32(0);
+    memberData()[LengthPropertyIndex] = Primitive::fromInt32(0);
 }
 
 ReturnedValue ArrayObject::getLookup(Managed *m, Lookup *l)
@@ -1186,7 +1186,7 @@ ReturnedValue ArrayObject::getLookup(Managed *m, Lookup *l)
         // special case, as the property is on the object itself
         l->getter = Lookup::arrayLengthGetter;
         ArrayObject *a = static_cast<ArrayObject *>(m);
-        return a->memberData[ArrayObject::LengthPropertyIndex].asReturnedValue();
+        return a->memberData()[ArrayObject::LengthPropertyIndex].asReturnedValue();
     }
     return Object::getLookup(m, l);
 }
@@ -1194,9 +1194,9 @@ ReturnedValue ArrayObject::getLookup(Managed *m, Lookup *l)
 uint ArrayObject::getLength(const Managed *m)
 {
     const ArrayObject *a = static_cast<const ArrayObject *>(m);
-    if (a->memberData[ArrayObject::LengthPropertyIndex].isInteger())
-        return a->memberData[ArrayObject::LengthPropertyIndex].integerValue();
-    return Primitive::toUInt32(a->memberData[ArrayObject::LengthPropertyIndex].doubleValue());
+    if (a->memberData()[ArrayObject::LengthPropertyIndex].isInteger())
+        return a->memberData()[ArrayObject::LengthPropertyIndex].integerValue();
+    return Primitive::toUInt32(a->memberData()[ArrayObject::LengthPropertyIndex].doubleValue());
 }
 
 QStringList ArrayObject::toQStringList() const
index 9a443f0..4fe3a77 100644 (file)
@@ -108,11 +108,22 @@ struct Q_QML_EXPORT Object: Managed {
     enum {
         IsObject = true
     };
-    Members memberData;
 
-    ArrayData *arrayData;
+    struct Data {
+        Members memberData;
+        ArrayData *arrayData;
+    };
+    Data data;
+
+    const Data *objectData() const { return &data; }
+    Data *objectData() { return &data; }
+
+    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; }
 
-    Property *propertyAt(uint index) const { return reinterpret_cast<Property *>(memberData.data() + index); }
+    Property *propertyAt(uint index) const { return reinterpret_cast<Property *>(memberData().data() + index); }
 
     Object(ExecutionEngine *engine);
     Object(InternalClass *internalClass);
@@ -192,30 +203,30 @@ public:
     void arraySet(uint index, ValueRef value);
 
     bool arrayPut(uint index, ValueRef value) {
-        return arrayData->vtable()->put(this, index, value);
+        return arrayData()->vtable()->put(this, index, value);
     }
     bool arrayPut(uint index, Value *values, uint n) {
-        return arrayData->vtable()->putArray(this, index, values, n);
+        return arrayData()->vtable()->putArray(this, index, values, n);
     }
     void setArrayAttributes(uint i, PropertyAttributes a) {
-        Q_ASSERT(arrayData);
-        if (arrayData->attrs || a != Attr_Data) {
+        Q_ASSERT(arrayData());
+        if (arrayData()->attrs || a != Attr_Data) {
             ArrayData::ensureAttributes(this);
             a.resolve();
-            arrayData->vtable()->setAttribute(this, i, a);
+            arrayData()->vtable()->setAttribute(this, i, a);
         }
     }
 
     void push_back(const ValueRef v);
 
     ArrayData::Type arrayType() const {
-        return arrayData ? arrayData->type : ArrayData::Simple;
+        return arrayData() ? arrayData()->type : ArrayData::Simple;
     }
     // ### remove me
     void setArrayType(ArrayData::Type t) {
         Q_ASSERT(t != ArrayData::Simple && t != ArrayData::Sparse);
         arrayCreate();
-        arrayData->type = t;
+        arrayData()->type = t;
     }
 
     inline void arrayReserve(uint n) {
@@ -223,7 +234,7 @@ public:
     }
 
     void arrayCreate() {
-        if (!arrayData)
+        if (!arrayData())
             ArrayData::realloc(this, ArrayData::Simple, 0, 0, false);
 #ifdef CHECK_SPARSE_ARRAYS
         initSparseArray();
@@ -231,15 +242,15 @@ public:
     }
 
     void initSparseArray();
-    SparseArrayNode *sparseBegin() { return arrayType() == ArrayData::Sparse ? static_cast<SparseArrayData *>(arrayData)->sparse->begin() : 0; }
-    SparseArrayNode *sparseEnd() { return arrayType() == ArrayData::Sparse ? static_cast<SparseArrayData *>(arrayData)->sparse->end() : 0; }
+    SparseArrayNode *sparseBegin() { return arrayType() == ArrayData::Sparse ? static_cast<SparseArrayData *>(arrayData())->sparse->begin() : 0; }
+    SparseArrayNode *sparseEnd() { return arrayType() == ArrayData::Sparse ? static_cast<SparseArrayData *>(arrayData())->sparse->end() : 0; }
 
     inline bool protoHasArray() {
         Scope scope(engine());
         Scoped<Object> p(scope, this);
 
         while ((p = p->prototype()))
-            if (p->arrayData)
+            if (p->arrayData())
                 return true;
 
         return false;
@@ -358,7 +369,7 @@ struct ArrayObject: Object {
 inline void Object::setArrayLengthUnchecked(uint l)
 {
     if (isArrayObject())
-        memberData[ArrayObject::LengthPropertyIndex] = Primitive::fromUInt32(l);
+        memberData()[ArrayObject::LengthPropertyIndex] = Primitive::fromUInt32(l);
 }
 
 inline void Object::push_back(const ValueRef v)
@@ -378,10 +389,10 @@ inline void Object::arraySet(uint index, const Property &p, PropertyAttributes a
     if (attributes.isAccessor()) {
         setHasAccessorProperty();
         initSparseArray();
-    } else if (index > 0x1000 && index > 2*arrayData->alloc) {
+    } else if (index > 0x1000 && index > 2*arrayData()->alloc) {
         initSparseArray();
     } else {
-        arrayData->vtable()->reallocate(this, index + 1, false);
+        arrayData()->vtable()->reallocate(this, index + 1, false);
     }
     setArrayAttributes(index, attributes);
     Property *pd = ArrayData::insert(this, index, attributes.isAccessor());
@@ -396,7 +407,7 @@ inline void Object::arraySet(uint index, const Property &p, PropertyAttributes a
 inline void Object::arraySet(uint index, ValueRef value)
 {
     arrayCreate();
-    if (index > 0x1000 && index > 2*arrayData->alloc) {
+    if (index > 0x1000 && index > 2*arrayData()->alloc) {
         initSparseArray();
     }
     Property *pd = ArrayData::insert(this, index);
index 92c62d4..a8b107e 100644 (file)
@@ -272,11 +272,11 @@ ReturnedValue ObjectPrototype::method_seal(CallContext *ctx)
 
     o->setInternalClass(o->internalClass()->sealed());
 
-    if (o->arrayData) {
+    if (o->arrayData()) {
         ArrayData::ensureAttributes(o.getPointer());
-        for (uint i = 0; i < o->arrayData->alloc; ++i) {
-            if (!o->arrayData->isEmpty(i))
-                o->arrayData->attrs[i].setConfigurable(false);
+        for (uint i = 0; i < o->arrayData()->alloc; ++i) {
+            if (!o->arrayData()->isEmpty(i))
+                o->arrayData()->attrs[i].setConfigurable(false);
         }
     }
 
@@ -297,13 +297,13 @@ ReturnedValue ObjectPrototype::method_freeze(CallContext *ctx)
 
     o->setInternalClass(o->internalClass()->frozen());
 
-    if (o->arrayData) {
+    if (o->arrayData()) {
         ArrayData::ensureAttributes(o.getPointer());
-        for (uint i = 0; i < o->arrayData->alloc; ++i) {
-            if (!o->arrayData->isEmpty(i))
-                o->arrayData->attrs[i].setConfigurable(false);
-            if (o->arrayData->attrs[i].isData())
-                o->arrayData->attrs[i].setWritable(false);
+        for (uint i = 0; i < o->arrayData()->alloc; ++i) {
+            if (!o->arrayData()->isEmpty(i))
+                o->arrayData()->attrs[i].setConfigurable(false);
+            if (o->arrayData()->attrs[i].isData())
+                o->arrayData()->attrs[i].setWritable(false);
         }
     }
     return o.asReturnedValue();
@@ -333,16 +333,16 @@ ReturnedValue ObjectPrototype::method_isSealed(CallContext *ctx)
     if (o->internalClass() != o->internalClass()->sealed())
         return Encode(false);
 
-    if (!o->arrayData || !o->arrayData->length())
+    if (!o->arrayData() || !o->arrayData()->length())
         return Encode(true);
 
-    if (o->arrayData->length() && !o->arrayData->attrs)
+    if (o->arrayData()->length() && !o->arrayData()->attrs)
         return Encode(false);
 
-    for (uint i = 0; i < o->arrayData->alloc; ++i) {
+    for (uint i = 0; i < o->arrayData()->alloc; ++i) {
         // ### Fix for sparse arrays
-        if (!o->arrayData->isEmpty(i))
-            if (o->arrayData->attributes(i).isConfigurable())
+        if (!o->arrayData()->isEmpty(i))
+            if (o->arrayData()->attributes(i).isConfigurable())
                 return Encode(false);
     }
 
@@ -362,16 +362,16 @@ ReturnedValue ObjectPrototype::method_isFrozen(CallContext *ctx)
     if (o->internalClass() != o->internalClass()->frozen())
         return Encode(false);
 
-    if (!o->arrayData->length())
+    if (!o->arrayData()->length())
         return Encode(true);
 
-    if (o->arrayData->length() && !o->arrayData->attrs)
+    if (o->arrayData()->length() && !o->arrayData()->attrs)
         return Encode(false);
 
-    for (uint i = 0; i < o->arrayData->alloc; ++i) {
+    for (uint i = 0; i < o->arrayData()->alloc; ++i) {
         // ### Fix for sparse arrays
-        if (!o->arrayData->isEmpty(i))
-            if (o->arrayData->attributes(i).isConfigurable() || o->arrayData->attributes(i).isWritable())
+        if (!o->arrayData()->isEmpty(i))
+            if (o->arrayData()->attributes(i).isConfigurable() || o->arrayData()->attributes(i).isWritable())
                 return Encode(false);
     }
 
index 18d07b9..6187cf9 100644 (file)
@@ -389,8 +389,8 @@ ReturnedValue RegExpPrototype::method_exec(CallContext *ctx)
         array->arrayPut(i, v);
     }
     array->setArrayLengthUnchecked(len);
-    array->memberData[Index_ArrayIndex] = Primitive::fromInt32(result);
-    array->memberData[Index_ArrayInput] = arg.asReturnedValue();
+    array->memberData()[Index_ArrayIndex] = Primitive::fromInt32(result);
+    array->memberData()[Index_ArrayInput] = arg.asReturnedValue();
 
     regExpCtor->lastMatch = array;
     regExpCtor->lastInput = arg->stringValue();
index 23b51ac..48c88de 100644 (file)
@@ -588,8 +588,8 @@ ReturnedValue Runtime::getElement(ExecutionContext *ctx, const ValueRef object,
     }
 
     if (idx < UINT_MAX) {
-        if (!o->arrayData->hasAttributes()) {
-            ScopedValue v(scope, o->arrayData->get(idx));
+        if (!o->arrayData()->hasAttributes()) {
+            ScopedValue v(scope, o->arrayData()->get(idx));
             if (!v->isEmpty())
                 return v->asReturnedValue();
         }
@@ -613,7 +613,7 @@ void Runtime::setElement(ExecutionContext *ctx, const ValueRef object, const Val
     uint idx = index->asArrayIndex();
     if (idx < UINT_MAX) {
         if (o->arrayType() == ArrayData::Simple) {
-            SimpleArrayData *s = static_cast<SimpleArrayData *>(o->arrayData);
+            SimpleArrayData *s = static_cast<SimpleArrayData *>(o->arrayData());
             if (s && idx < s->len && !s->data[idx].isEmpty()) {
                 s->data[idx] = value;
                 return;
@@ -1160,7 +1160,7 @@ ReturnedValue Runtime::objectLiteral(QV4::ExecutionContext *ctx, const QV4::Valu
     }
 
     for (uint i = 0; i < klass->size; ++i)
-        o->memberData[i] = *args++;
+        o->memberData()[i] = *args++;
 
     if (arrayValueCount > 0) {
         ScopedValue entry(scope);
index 25b2b78..6ad4e8b 100644 (file)
@@ -152,7 +152,7 @@ void StringObject::advanceIterator(Managed *m, ObjectIterator *it, StringRef nam
                 return;
             }
         }
-        if (s->arrayData) {
+        if (s->arrayData()) {
             it->arrayNode = s->sparseBegin();
             // iterate until we're past the end of the string
             while (it->arrayNode && it->arrayNode->key() < slen)
index b0de533..e518920 100644 (file)
@@ -229,7 +229,7 @@ static QV4::ReturnedValue objectFromVariantMap(QV8Engine *engine, const QVariant
     for (QVariantMap::ConstIterator iter = map.begin(); iter != map.end(); ++iter) {
         s = e->newString(iter.key());
         uint idx = s->asArrayIndex();
-        if (idx > 16 && (!o->arrayData || idx > o->arrayData->length() * 2))
+        if (idx > 16 && (!o->arrayData() || idx > o->arrayData()->length() * 2))
             o->initSparseArray();
         o->put(s, (v = engine->fromVariant(iter.value())));
     }