diff options
author | Lars Knoll <[email protected]> | 2014-04-05 20:47:36 +0200 |
---|---|---|
committer | Simon Hausmann <[email protected]> | 2014-07-22 13:48:54 +0200 |
commit | 393c92a82170260fc322f7fc389a5594d71a8876 (patch) | |
tree | daa493130b95a53313f830b657f24859f8b5bfa5 /src | |
parent | 6452f7a57452dc35c414d7e3c13c79115dd145ed (diff) |
Move object data into internal structure
Change-Id: I1fcccd535ed356e736468337bd450270cd290044
Reviewed-by: Simon Hausmann <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/qml/jsruntime/qv4argumentsobject.cpp | 14 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4arraydata.cpp | 130 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4arrayobject.cpp | 24 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4functionobject.cpp | 12 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4functionobject_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4internalclass.cpp | 6 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4lookup.cpp | 78 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4object.cpp | 100 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4object_p.h | 47 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4objectproto.cpp | 40 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4regexpobject.cpp | 4 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4runtime.cpp | 8 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4stringobject.cpp | 2 | ||||
-rw-r--r-- | src/qml/qml/v8/qv8engine.cpp | 2 |
14 files changed, 240 insertions, 229 deletions
diff --git a/src/qml/jsruntime/qv4argumentsobject.cpp b/src/qml/jsruntime/qv4argumentsobject.cpp index 7d4df899a6..72629b4f83 100644 --- a/src/qml/jsruntime/qv4argumentsobject.cpp +++ b/src/qml/jsruntime/qv4argumentsobject.cpp @@ -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); } } diff --git a/src/qml/jsruntime/qv4arraydata.cpp b/src/qml/jsruntime/qv4arraydata.cpp index 93660a2616..71670146ff 100644 --- a/src/qml/jsruntime/qv4arraydata.cpp +++ b/src/qml/jsruntime/qv4arraydata.cpp @@ -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 diff --git a/src/qml/jsruntime/qv4arrayobject.cpp b/src/qml/jsruntime/qv4arrayobject.cpp index 1e120892a6..5c83eb0522 100644 --- a/src/qml/jsruntime/qv4arrayobject.cpp +++ b/src/qml/jsruntime/qv4arrayobject.cpp @@ -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; } diff --git a/src/qml/jsruntime/qv4functionobject.cpp b/src/qml/jsruntime/qv4functionobject.cpp index e5d210eae9..1edf6c7d0b 100644 --- a/src/qml/jsruntime/qv4functionobject.cpp +++ b/src/qml/jsruntime/qv4functionobject.cpp @@ -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(); } diff --git a/src/qml/jsruntime/qv4functionobject_p.h b/src/qml/jsruntime/qv4functionobject_p.h index 0160bfd986..53f2481ba1 100644 --- a/src/qml/jsruntime/qv4functionobject_p.h +++ b/src/qml/jsruntime/qv4functionobject_p.h @@ -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; } diff --git a/src/qml/jsruntime/qv4internalclass.cpp b/src/qml/jsruntime/qv4internalclass.cpp index e86a2d344b..354bedd311 100644 --- a/src/qml/jsruntime/qv4internalclass.cpp +++ b/src/qml/jsruntime/qv4internalclass.cpp @@ -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()); } diff --git a/src/qml/jsruntime/qv4lookup.cpp b/src/qml/jsruntime/qv4lookup.cpp index 024dc0aeee..f43ef0b74e 100644 --- a/src/qml/jsruntime/qv4lookup.cpp +++ b/src/qml/jsruntime/qv4lookup.cpp @@ -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; } } diff --git a/src/qml/jsruntime/qv4object.cpp b/src/qml/jsruntime/qv4object.cpp index 9d5a491753..d33e2941dc 100644 --- a/src/qml/jsruntime/qv4object.cpp +++ b/src/qml/jsruntime/qv4object.cpp @@ -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 diff --git a/src/qml/jsruntime/qv4object_p.h b/src/qml/jsruntime/qv4object_p.h index 9a443f0569..4fe3a776be 100644 --- a/src/qml/jsruntime/qv4object_p.h +++ b/src/qml/jsruntime/qv4object_p.h @@ -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); diff --git a/src/qml/jsruntime/qv4objectproto.cpp b/src/qml/jsruntime/qv4objectproto.cpp index 92c62d4cfd..a8b107e9f2 100644 --- a/src/qml/jsruntime/qv4objectproto.cpp +++ b/src/qml/jsruntime/qv4objectproto.cpp @@ -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); } diff --git a/src/qml/jsruntime/qv4regexpobject.cpp b/src/qml/jsruntime/qv4regexpobject.cpp index 18d07b9df5..6187cf9f16 100644 --- a/src/qml/jsruntime/qv4regexpobject.cpp +++ b/src/qml/jsruntime/qv4regexpobject.cpp @@ -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(); diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp index 23b51ac8b7..48c88de7aa 100644 --- a/src/qml/jsruntime/qv4runtime.cpp +++ b/src/qml/jsruntime/qv4runtime.cpp @@ -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); diff --git a/src/qml/jsruntime/qv4stringobject.cpp b/src/qml/jsruntime/qv4stringobject.cpp index 25b2b78025..6ad4e8b11e 100644 --- a/src/qml/jsruntime/qv4stringobject.cpp +++ b/src/qml/jsruntime/qv4stringobject.cpp @@ -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) diff --git a/src/qml/qml/v8/qv8engine.cpp b/src/qml/qml/v8/qv8engine.cpp index b0de533ea8..e5189202c5 100644 --- a/src/qml/qml/v8/qv8engine.cpp +++ b/src/qml/qml/v8/qv8engine.cpp @@ -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()))); } |