Property pd = Property::fromAccessor(v4->thrower, v4->thrower);
Q_ASSERT(CalleePropertyIndex == internalClass->find(context->engine->id_callee));
Q_ASSERT(CallerPropertyIndex == internalClass->find(context->engine->id_caller));
- memberData[CalleePropertyIndex] = pd;
- memberData[CallerPropertyIndex] = pd;
+ *propertyAt(CalleePropertyIndex) = pd;
+ *propertyAt(CallerPropertyIndex) = pd;
arrayReserve(context->callData->argc);
arrayPut(0, context->callData->args, context->callData->argc);
} else {
hasAccessorProperty = 1;
Q_ASSERT(CalleePropertyIndex == internalClass->find(context->engine->id_callee));
- memberData[CalleePropertyIndex].value = context->function->asReturnedValue();
+ memberData[CalleePropertyIndex] = context->function->asReturnedValue();
}
Q_ASSERT(LengthPropertyIndex == internalClass->find(context->engine->id_length));
- Property *lp = memberData + ArrayObject::LengthPropertyIndex;
- lp->value = Primitive::fromInt32(context->realArgumentCount);
+ memberData[LengthPropertyIndex] = Primitive::fromInt32(context->realArgumentCount);
Q_ASSERT(internalClass->vtable == staticVTable());
}
enum {
LengthPropertyIndex = 0,
CalleePropertyIndex = 1,
- CallerPropertyIndex = 2
+ CallerPropertyIndex = 3
};
bool defineOwnProperty(ExecutionContext *ctx, uint index, const Property &desc, PropertyAttributes attrs);
static ReturnedValue getIndexed(Managed *m, uint index, bool *hasProperty);
{
needsActivation = false;
strictMode = false;
- memberData[Index_Prototype].value = 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].value = this->asReturnedValue();
- memberData[Index_Prototype].value = proto.asReturnedValue();
+ proto->memberData[Index_ProtoConstructor] = this->asReturnedValue();
+ memberData[Index_Prototype] = proto.asReturnedValue();
} else {
- // ### Empty or undefined?
- memberData[Index_Prototype].value = Encode::undefined();
+ memberData[Index_Prototype] = Encode::undefined();
}
ScopedValue v(s, n.asReturnedValue());
static FunctionObject *creatScriptFunction(ExecutionContext *scope, Function *function, bool createProto = true);
- ReturnedValue protoProperty() { return memberData[Index_Prototype].value.asReturnedValue(); }
+ ReturnedValue protoProperty() { return memberData[Index_Prototype].asReturnedValue(); }
protected:
FunctionObject(InternalClass *ic);
if (newClass->size > object->internalClass->size) {
Q_ASSERT(newClass->size == object->internalClass->size + 1);
- memmove(object->memberData + idx + 2, object->memberData + idx + 1, (object->internalClass->size - idx - 1)*sizeof(Property));
+ memmove(object->memberData + idx + 2, object->memberData + 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 + idx + 1, object->memberData + idx + 2, (object->internalClass->size - idx - 2)*sizeof(Property));
+ memmove(object->memberData + idx + 1, object->memberData + idx + 2, (object->internalClass->size - idx - 2)*sizeof(Value));
}
object->internalClass = newClass;
}
}
// remove the entry in memberdata
- memmove(object->memberData + propIdx, object->memberData + propIdx + 1, (object->internalClass->size - propIdx)*sizeof(Property));
+ memmove(object->memberData + propIdx, object->memberData + propIdx + 1, (object->internalClass->size - propIdx)*sizeof(Value));
oldClass->transitions.insert(t, object->internalClass);
}
m_sealed = m_sealed->changePrototype(prototype);
for (uint i = 0; i < size; ++i) {
PropertyAttributes attrs = propertyData.at(i);
+ if (attrs.isEmpty())
+ continue;
attrs.setConfigurable(false);
m_sealed = m_sealed->addMember(nameMap.at(i), attrs);
}
m_frozen = m_frozen->changePrototype(prototype);
for (uint i = 0; i < size; ++i) {
PropertyAttributes attrs = propertyData.at(i);
+ if (attrs.isEmpty())
+ continue;
attrs.setWritable(false);
attrs.setConfigurable(false);
m_frozen = m_frozen->addMember(nameMap.at(i), attrs);
if (index != UINT_MAX) {
level = i;
*attrs = obj->internalClass->propertyData.at(index);
- return !attrs->isAccessor() ? obj->memberData[index].value.asReturnedValue() : obj->getValue(thisObject, obj->memberData + 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].value.asReturnedValue() : obj->getValue(thisObject, obj->memberData + 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].value.asReturnedValue() : thisObject->getValue(obj->memberData + 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].value.asReturnedValue() : thisObject->getValue(obj->memberData + index, *attrs);
+ return !attrs->isAccessor() ? obj->memberData[index].asReturnedValue() : thisObject->getValue(obj->propertyAt(index), *attrs);
}
obj = obj->prototype();
// the internal class won't match
Object *o = object->objectValue();
if (l->classList[0] == o->internalClass)
- return static_cast<Object *>(o)->memberData[l->index].value.asReturnedValue();
+ return static_cast<Object *>(o)->memberData[l->index].asReturnedValue();
}
l->getter = getterGeneric;
return getterGeneric(l, object);
Object *o = object->objectValue();
if (l->classList[0] == o->internalClass &&
l->classList[1] == o->prototype()->internalClass)
- return o->prototype()->memberData[l->index].value.asReturnedValue();
+ return o->prototype()->memberData[l->index].asReturnedValue();
}
l->getter = getterGeneric;
return getterGeneric(l, object);
if (l->classList[1] == o->internalClass) {
o = o->prototype();
if (l->classList[2] == o->internalClass)
- return o->memberData[l->index].value.asReturnedValue();
+ return o->memberData[l->index].asReturnedValue();
}
}
}
Object *o = object->objectValue();
if (l->classList[0] == o->internalClass) {
Scope scope(o->engine());
- FunctionObject *getter = o->memberData[l->index].getter();
+ FunctionObject *getter = o->propertyAt(l->index)->getter();
if (!getter)
return Encode::undefined();
if (l->classList[0] == o->internalClass &&
l->classList[1] == o->prototype()->internalClass) {
Scope scope(o->engine());
- FunctionObject *getter = o->prototype()->memberData[l->index].getter();
+ FunctionObject *getter = o->prototype()->propertyAt(l->index)->getter();
if (!getter)
return Encode::undefined();
o = o->prototype();
if (l->classList[2] == o->internalClass) {
Scope scope(o->engine());
- FunctionObject *getter = o->memberData[l->index].getter();
+ FunctionObject *getter = o->propertyAt(l->index)->getter();
if (!getter)
return Encode::undefined();
if (object->type() == l->type) {
Object *o = l->proto;
if (l->classList[0] == o->internalClass)
- return o->memberData[l->index].value.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].value.asReturnedValue();
+ return o->prototype()->memberData[l->index].asReturnedValue();
}
l->getter = getterGeneric;
return getterGeneric(l, object);
Object *o = l->proto;
if (l->classList[0] == o->internalClass) {
Scope scope(o->engine());
- FunctionObject *getter = o->memberData[l->index].getter();
+ FunctionObject *getter = o->propertyAt(l->index)->getter();
if (!getter)
return Encode::undefined();
if (l->classList[0] == o->internalClass &&
l->classList[1] == o->prototype()->internalClass) {
Scope scope(o->engine());
- FunctionObject *getter = o->prototype()->memberData[l->index].getter();
+ FunctionObject *getter = o->prototype()->propertyAt(l->index)->getter();
if (!getter)
return Encode::undefined();
ReturnedValue Lookup::arrayLengthGetter(Lookup *l, const ValueRef object)
{
if (ArrayObject *a = object->asArrayObject())
- return a->memberData[ArrayObject::LengthPropertyIndex].value.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].value.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].value.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].value.asReturnedValue();
+ return o->prototype()->memberData[l->index].asReturnedValue();
}
}
}
Object *o = ctx->engine->globalObject;
if (l->classList[0] == o->internalClass) {
Scope scope(o->engine());
- FunctionObject *getter = o->memberData[l->index].getter();
+ FunctionObject *getter = o->propertyAt(l->index)->getter();
if (!getter)
return Encode::undefined();
if (l->classList[0] == o->internalClass &&
l->classList[1] == o->prototype()->internalClass) {
Scope scope(o->engine());
- FunctionObject *getter = o->prototype()->memberData[l->index].getter();
+ FunctionObject *getter = o->prototype()->propertyAt(l->index)->getter();
if (!getter)
return Encode::undefined();
o = o->prototype();
if (l->classList[2] == o->internalClass) {
Scope scope(o->engine());
- FunctionObject *getter = o->memberData[l->index].getter();
+ FunctionObject *getter = o->propertyAt(l->index)->getter();
if (!getter)
return Encode::undefined();
{
Object *o = object->asObject();
if (o && o->internalClass == l->classList[0]) {
- o->memberData[l->index].value = *value;
+ o->memberData[l->index] = *value;
return;
}
if (!o->prototype()) {
if (l->index >= o->memberDataAlloc)
o->ensureMemberIndex(l->index);
- o->memberData[l->index].value = *value;
+ o->memberData[l->index] = *value;
o->internalClass = l->classList[3];
return;
}
if (p && p->internalClass == l->classList[1]) {
if (l->index >= o->memberDataAlloc)
o->ensureMemberIndex(l->index);
- o->memberData[l->index].value = *value;
+ o->memberData[l->index] = *value;
o->internalClass = l->classList[3];
return;
}
if (p && p->internalClass == l->classList[2]) {
if (l->index >= o->memberDataAlloc)
o->ensureMemberIndex(l->index);
- o->memberData[l->index].value = *value;
+ o->memberData[l->index] = *value;
o->internalClass = l->classList[3];
return;
}
if (internalClass->size >= memberDataAlloc) {
memberDataAlloc = internalClass->size;
- memberData = new Property[memberDataAlloc];
+ memberData = new Value[memberDataAlloc];
}
}
{
Object *o = static_cast<Object *>(that);
- if (!o->hasAccessorProperty) {
- for (uint i = 0; i < o->internalClass->size; ++i)
- o->memberData[i].value.mark(e);
- } else {
- for (uint i = 0; i < o->internalClass->size; ++i) {
- const Property &pd = o->memberData[i];
- pd.value.mark(e);
- if (o->internalClass->propertyData[i].isAccessor())
- pd.set.mark(e);
- }
- }
+ for (uint i = 0; i < o->internalClass->size; ++i)
+ o->memberData[i].mark(e);
if (o->arrayData)
o->arrayData->mark(e);
}
{
if (idx >= memberDataAlloc) {
int newAlloc = qMax((uint)8, 2*memberDataAlloc);
- Property *newMemberData = new Property[newAlloc];
- memcpy(newMemberData, memberData, sizeof(Property)*memberDataAlloc);
- memset(newMemberData + memberDataAlloc, 0, sizeof(Property)*(newAlloc - memberDataAlloc));
+ Value *newMemberData = new Value[newAlloc];
+ memcpy(newMemberData, memberData, sizeof(Value)*memberDataAlloc);
+ memset(newMemberData + memberDataAlloc, 0, sizeof(Value)*(newAlloc - memberDataAlloc));
memberDataAlloc = newAlloc;
if (memberData != inlineProperties)
delete [] memberData;
uint idx;
InternalClass::addMember(this, s.getPointer(), attributes, &idx);
- if (attributes.isAccessor())
- hasAccessorProperty = 1;
ensureMemberIndex(internalClass->size);
- memberData[idx] = p;
+ if (attributes.isAccessor()) {
+ hasAccessorProperty = 1;
+ *propertyAt(idx) = p;
+ } else {
+ memberData[idx] = p.value;
+ }
}
// Section 8.12.1
if (member < UINT_MAX) {
if (attrs)
*attrs = internalClass->propertyData[member];
- return memberData + member;
+ return propertyAt(member);
}
if (attrs)
if (idx < UINT_MAX) {
if (attrs)
*attrs = o->internalClass->propertyData[idx];
- return o->memberData + idx;
+ return o->propertyAt(idx);
}
o = o->prototype();
l->classList[0] = o->internalClass;
l->index = idx;
l->setter = Lookup::setter0;
- o->memberData[idx].value = *value;
+ o->memberData[idx] = *value;
return;
}
if (idx != UINT_MAX) {
- o->putValue(o->memberData + idx, o->internalClass->propertyData[idx], value);
+ o->putValue(o->propertyAt(idx), o->internalClass->propertyData[idx], value);
return;
}
}
continue;
}
- Property *p = o->memberData + it->memberIndex;
+ Property *p = o->propertyAt(it->memberIndex);
PropertyAttributes a = o->internalClass->propertyData[it->memberIndex];
++it->memberIndex;
if (!(it->flags & ObjectIterator::EnumerableOnly) || a.isEnumerable()) {
if (idx < UINT_MAX) {
if (hasProperty)
*hasProperty = true;
- return getValue(o->memberData + idx, o->internalClass->propertyData.at(idx));
+ return getValue(o->propertyAt(idx), o->internalClass->propertyData.at(idx));
}
o = o->prototype();
Property *pd = 0;
PropertyAttributes attrs;
if (member < UINT_MAX) {
- pd = memberData + member;
+ pd = propertyAt(member);
attrs = internalClass->propertyData[member];
}
if (isArrayObject() && name->equals(ctx->engine->id_length)) {
assert(ArrayObject::LengthPropertyIndex == internalClass->find(ctx->engine->id_length));
- Property *lp = memberData + ArrayObject::LengthPropertyIndex;
+ Property *lp = propertyAt(ArrayObject::LengthPropertyIndex);
cattrs = internalClass->propertyData.constData() + ArrayObject::LengthPropertyIndex;
if (attrs.isEmpty() || p.isSubset(attrs, *lp, *cattrs))
return true;
// Clause 1
memberIndex = internalClass->find(name.getPointer());
- current = (memberIndex < UINT_MAX) ? memberData + memberIndex : 0;
+ current = (memberIndex < UINT_MAX) ? propertyAt(memberIndex) : 0;
cattrs = internalClass->propertyData.constData() + memberIndex;
if (!current) {
Property *current;
PropertyAttributes cattrs;
if (!member.isNull()) {
- current = memberData + index;
+ current = propertyAt(index);
cattrs = internalClass->propertyData[index];
} else {
current = arrayData->getProperty(index);
bool Object::setArrayLength(uint newLen)
{
Q_ASSERT(isArrayObject());
- const Property *lengthProperty = memberData + ArrayObject::LengthPropertyIndex;
- if (lengthProperty && !internalClass->propertyData[ArrayObject::LengthPropertyIndex].isWritable())
+ if (!internalClass->propertyData[ArrayObject::LengthPropertyIndex].isWritable())
return false;
uint oldLen = getLength();
bool ok = true;
{
Q_UNUSED(engine);
- memberData[LengthPropertyIndex].value = 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].value.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].value.isInteger())
- return a->memberData[ArrayObject::LengthPropertyIndex].value.integerValue();
- return Primitive::toUInt32(a->memberData[ArrayObject::LengthPropertyIndex].value.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
IsObject = true
};
uint memberDataAlloc;
- Property *memberData;
+ Value *memberData;
ArrayData *arrayData;
enum {
InlinePropertySize = 4
};
- Property inlineProperties[InlinePropertySize];
+ Value inlineProperties[InlinePropertySize];
+
+ Property *propertyAt(uint index) const { return reinterpret_cast<Property *>(memberData + index); }
Object(ExecutionEngine *engine);
Object(InternalClass *internalClass);
inline void Object::setArrayLengthUnchecked(uint l)
{
- if (isArrayObject()) {
- // length is always the first property of an array
- Property &lengthProperty = memberData[ArrayObject::LengthPropertyIndex];
- lengthProperty.value = Primitive::fromUInt32(l);
- }
+ if (isArrayObject())
+ memberData[ArrayObject::LengthPropertyIndex] = Primitive::fromUInt32(l);
}
inline void Object::push_back(const ValueRef v)
{
Q_UNUSED(ctx);
Q_ASSERT(0 == internalClass->find(ctx->engine->newIdentifier(QStringLiteral("lastIndex"))));
- return &memberData[0];
+ return propertyAt(0);
}
// Converts a JS RegExp to a QRegExp.
array->arrayPut(i, v);
}
array->setArrayLengthUnchecked(len);
- array->memberData[Index_ArrayIndex].value = Primitive::fromInt32(result);
- array->memberData[Index_ArrayInput].value = arg.asReturnedValue();
+ array->memberData[Index_ArrayIndex] = Primitive::fromInt32(result);
+ array->memberData[Index_ArrayInput] = arg.asReturnedValue();
regExpCtor->lastMatch = array;
regExpCtor->lastInput = arg->stringValue();
o->initSparseArray();
}
- for (uint i = 0; i < klass->size; ++i) {
- if (klass->propertyData[i].isData())
- o->memberData[i].value = *args++;
- else {
- o->memberData[i].value = *args;
- args++;
- o->memberData[i].set = *args;
- args++;
- }
- }
+ for (uint i = 0; i < klass->size; ++i)
+ o->memberData[i] = *args++;
ScopedValue entry(scope);
for (int i = 0; i < arrayValueCount; ++i) {