} 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());
}
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];
}
if (attrs.isWritable()) {
setArrayAttributes(index, mapAttrs);
- pd = arrayData->getProperty(index);
+ pd = arrayData()->getProperty(index);
pd->copy(map, mapAttrs);
}
}
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;
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));
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;
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);
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);
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;
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;
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)
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());
}
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();
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;
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();
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;
}
// 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;
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;
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)
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();
}
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();
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();
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
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);
}
if (!len)
return;
- if (!thisObject->arrayData->length())
+ if (!thisObject->arrayData()->length())
return;
if (!(comparefn->isUndefined() || comparefn->asObject())) {
// 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;
}
// ### 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();
}
}
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
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]);
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())
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) {
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) {
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;
}
{
managedData()->needsActivation = false;
managedData()->strictMode = false;
- memberData[Index_Prototype] = Encode::undefined();
+ memberData()[Index_Prototype] = Encode::undefined();
}
FunctionObject::~FunctionObject()
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());
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();
}
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; }
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);
}
}
// 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());
}
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();
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();
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();
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();
}
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();
}
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);
{
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;
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;
}
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;
// 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);
}
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);
}
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();
}
}
}
// 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);
// 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);
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;
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);
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);
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);
{
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);
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);
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();
}
}
}
{
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;
}
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;
}
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;
}
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;
}
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;
}
}
{
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);
}
}
{
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)
pp->value = p.value;
pp->set = p.set;
} else {
- memberData[idx] = p.value;
+ memberData()[idx] = p.value;
}
}
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()) {
{
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()) {
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();
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();
l->classList[0] = o->internalClass();
l->index = idx;
l->setter = Lookup::setter0;
- o->memberData[idx] = *value;
+ o->memberData()[idx] = *value;
return;
}
name = (String *)0;
*index = UINT_MAX;
- if (o->arrayData) {
+ if (o->arrayData()) {
if (!it->arrayIndex)
it->arrayNode = o->sparseBegin();
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;
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())) {
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()) {
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);
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)
// Clause 1
{
- current = arrayData->getProperty(index);
+ current = arrayData()->getProperty(index);
if (!current && isStringObject())
current = static_cast<StringObject *>(this)->getIndex(index);
}
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
// 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);
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();
}
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());
}
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;
{
Q_UNUSED(engine);
- memberData[LengthPropertyIndex] = Primitive::fromInt32(0);
+ memberData()[LengthPropertyIndex] = Primitive::fromInt32(0);
}
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);
}
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
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);
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) {
}
void arrayCreate() {
- if (!arrayData)
+ if (!arrayData())
ArrayData::realloc(this, ArrayData::Simple, 0, 0, false);
#ifdef CHECK_SPARSE_ARRAYS
initSparseArray();
}
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;
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)
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());
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);
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);
}
}
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();
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);
}
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);
}
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();
}
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();
}
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;
}
for (uint i = 0; i < klass->size; ++i)
- o->memberData[i] = *args++;
+ o->memberData()[i] = *args++;
if (arrayValueCount > 0) {
ScopedValue entry(scope);
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)
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())));
}