aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@digia.com>2014-04-05 20:47:36 +0200
committerSimon Hausmann <simon.hausmann@digia.com>2014-07-22 13:48:54 +0200
commit393c92a82170260fc322f7fc389a5594d71a8876 (patch)
treedaa493130b95a53313f830b657f24859f8b5bfa5 /src
parent6452f7a57452dc35c414d7e3c13c79115dd145ed (diff)
Move object data into internal structure
Change-Id: I1fcccd535ed356e736468337bd450270cd290044 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src')
-rw-r--r--src/qml/jsruntime/qv4argumentsobject.cpp14
-rw-r--r--src/qml/jsruntime/qv4arraydata.cpp130
-rw-r--r--src/qml/jsruntime/qv4arrayobject.cpp24
-rw-r--r--src/qml/jsruntime/qv4functionobject.cpp12
-rw-r--r--src/qml/jsruntime/qv4functionobject_p.h2
-rw-r--r--src/qml/jsruntime/qv4internalclass.cpp6
-rw-r--r--src/qml/jsruntime/qv4lookup.cpp78
-rw-r--r--src/qml/jsruntime/qv4object.cpp100
-rw-r--r--src/qml/jsruntime/qv4object_p.h47
-rw-r--r--src/qml/jsruntime/qv4objectproto.cpp40
-rw-r--r--src/qml/jsruntime/qv4regexpobject.cpp4
-rw-r--r--src/qml/jsruntime/qv4runtime.cpp8
-rw-r--r--src/qml/jsruntime/qv4stringobject.cpp2
-rw-r--r--src/qml/qml/v8/qv8engine.cpp2
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())));
}