aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/jsruntime/qv4argumentsobject.cpp9
-rw-r--r--src/qml/jsruntime/qv4argumentsobject_p.h2
-rw-r--r--src/qml/jsruntime/qv4functionobject.cpp9
-rw-r--r--src/qml/jsruntime/qv4functionobject_p.h2
-rw-r--r--src/qml/jsruntime/qv4internalclass.cpp10
-rw-r--r--src/qml/jsruntime/qv4lookup.cpp50
-rw-r--r--src/qml/jsruntime/qv4object.cpp63
-rw-r--r--src/qml/jsruntime/qv4object_p.h13
-rw-r--r--src/qml/jsruntime/qv4regexpobject.cpp6
-rw-r--r--src/qml/jsruntime/qv4runtime.cpp12
10 files changed, 81 insertions, 95 deletions
diff --git a/src/qml/jsruntime/qv4argumentsobject.cpp b/src/qml/jsruntime/qv4argumentsobject.cpp
index 1f2821910a..3a0aad2fcf 100644
--- a/src/qml/jsruntime/qv4argumentsobject.cpp
+++ b/src/qml/jsruntime/qv4argumentsobject.cpp
@@ -61,8 +61,8 @@ ArgumentsObject::ArgumentsObject(CallContext *context)
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);
@@ -70,11 +70,10 @@ ArgumentsObject::ArgumentsObject(CallContext *context)
} 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());
}
diff --git a/src/qml/jsruntime/qv4argumentsobject_p.h b/src/qml/jsruntime/qv4argumentsobject_p.h
index b50c4f081d..a7904105e4 100644
--- a/src/qml/jsruntime/qv4argumentsobject_p.h
+++ b/src/qml/jsruntime/qv4argumentsobject_p.h
@@ -92,7 +92,7 @@ struct ArgumentsObject: Object {
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);
diff --git a/src/qml/jsruntime/qv4functionobject.cpp b/src/qml/jsruntime/qv4functionobject.cpp
index 9a3aa331dc..9b502a0927 100644
--- a/src/qml/jsruntime/qv4functionobject.cpp
+++ b/src/qml/jsruntime/qv4functionobject.cpp
@@ -111,7 +111,7 @@ FunctionObject::FunctionObject(InternalClass *ic)
{
needsActivation = false;
strictMode = false;
- memberData[Index_Prototype].value = Encode::undefined();
+ memberData[Index_Prototype] = Encode::undefined();
}
FunctionObject::~FunctionObject()
@@ -130,11 +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].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());
diff --git a/src/qml/jsruntime/qv4functionobject_p.h b/src/qml/jsruntime/qv4functionobject_p.h
index a08dc603ff..778b3157e8 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 *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);
diff --git a/src/qml/jsruntime/qv4internalclass.cpp b/src/qml/jsruntime/qv4internalclass.cpp
index 7c4a8de284..4fe8f0bd44 100644
--- a/src/qml/jsruntime/qv4internalclass.cpp
+++ b/src/qml/jsruntime/qv4internalclass.cpp
@@ -160,10 +160,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 + 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;
}
@@ -368,7 +368,7 @@ void InternalClass::removeMember(Object *object, Identifier *id)
}
// 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);
}
@@ -400,6 +400,8 @@ InternalClass *InternalClass::sealed()
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);
}
@@ -418,6 +420,8 @@ InternalClass *InternalClass::frozen()
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);
diff --git a/src/qml/jsruntime/qv4lookup.cpp b/src/qml/jsruntime/qv4lookup.cpp
index 4a75272843..3508316c80 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].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();
@@ -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].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();
@@ -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].value.asReturnedValue() : thisObject->getValue(obj->memberData + 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].value.asReturnedValue() : thisObject->getValue(obj->memberData + index, *attrs);
+ return !attrs->isAccessor() ? obj->memberData[index].asReturnedValue() : thisObject->getValue(obj->propertyAt(index), *attrs);
}
obj = obj->prototype();
@@ -295,7 +295,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 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);
@@ -309,7 +309,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].value.asReturnedValue();
+ return o->prototype()->memberData[l->index].asReturnedValue();
}
l->getter = getterGeneric;
return getterGeneric(l, object);
@@ -326,7 +326,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].value.asReturnedValue();
+ return o->memberData[l->index].asReturnedValue();
}
}
}
@@ -342,7 +342,7 @@ ReturnedValue Lookup::getterAccessor0(Lookup *l, const ValueRef object)
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();
@@ -364,7 +364,7 @@ ReturnedValue Lookup::getterAccessor1(Lookup *l, const ValueRef object)
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();
@@ -389,7 +389,7 @@ ReturnedValue Lookup::getterAccessor2(Lookup *l, const ValueRef object)
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();
@@ -410,7 +410,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].value.asReturnedValue();
+ return o->memberData[l->index].asReturnedValue();
}
l->getter = getterGeneric;
return getterGeneric(l, object);
@@ -422,7 +422,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].value.asReturnedValue();
+ return o->prototype()->memberData[l->index].asReturnedValue();
}
l->getter = getterGeneric;
return getterGeneric(l, object);
@@ -434,7 +434,7 @@ ReturnedValue Lookup::primitiveGetterAccessor0(Lookup *l, const ValueRef 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();
@@ -454,7 +454,7 @@ ReturnedValue Lookup::primitiveGetterAccessor1(Lookup *l, const ValueRef object)
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();
@@ -479,7 +479,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].value.asReturnedValue();
+ return a->memberData[ArrayObject::LengthPropertyIndex].asReturnedValue();
l->getter = getterGeneric;
return getterGeneric(l, object);
@@ -519,7 +519,7 @@ ReturnedValue Lookup::globalGetter0(Lookup *l, ExecutionContext *ctx)
{
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);
@@ -530,7 +530,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].value.asReturnedValue();
+ return o->prototype()->memberData[l->index].asReturnedValue();
l->globalGetter = globalGetterGeneric;
return globalGetterGeneric(l, ctx);
@@ -544,7 +544,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].value.asReturnedValue();
+ return o->prototype()->memberData[l->index].asReturnedValue();
}
}
}
@@ -557,7 +557,7 @@ ReturnedValue Lookup::globalGetterAccessor0(Lookup *l, ExecutionContext *ctx)
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();
@@ -575,7 +575,7 @@ ReturnedValue Lookup::globalGetterAccessor1(Lookup *l, ExecutionContext *ctx)
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();
@@ -596,7 +596,7 @@ ReturnedValue Lookup::globalGetterAccessor2(Lookup *l, ExecutionContext *ctx)
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();
@@ -629,7 +629,7 @@ void Lookup::setter0(Lookup *l, const ValueRef object, const ValueRef value)
{
Object *o = object->asObject();
if (o && o->internalClass == l->classList[0]) {
- o->memberData[l->index].value = *value;
+ o->memberData[l->index] = *value;
return;
}
@@ -644,7 +644,7 @@ void Lookup::setterInsert0(Lookup *l, const ValueRef object, const ValueRef valu
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;
}
@@ -662,7 +662,7 @@ void Lookup::setterInsert1(Lookup *l, const ValueRef object, const ValueRef valu
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;
}
@@ -682,7 +682,7 @@ void Lookup::setterInsert2(Lookup *l, const ValueRef object, const ValueRef valu
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;
}
diff --git a/src/qml/jsruntime/qv4object.cpp b/src/qml/jsruntime/qv4object.cpp
index d0fc30005b..7ad3189dd1 100644
--- a/src/qml/jsruntime/qv4object.cpp
+++ b/src/qml/jsruntime/qv4object.cpp
@@ -83,7 +83,7 @@ Object::Object(InternalClass *ic)
if (internalClass->size >= memberDataAlloc) {
memberDataAlloc = internalClass->size;
- memberData = new Property[memberDataAlloc];
+ memberData = new Value[memberDataAlloc];
}
}
@@ -222,17 +222,8 @@ void Object::markObjects(Managed *that, ExecutionEngine *e)
{
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);
}
@@ -241,9 +232,9 @@ void Object::ensureMemberIndex(uint idx)
{
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;
@@ -256,12 +247,15 @@ void Object::insertMember(const StringRef s, const Property &p, PropertyAttribut
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
@@ -275,7 +269,7 @@ Property *Object::__getOwnProperty__(const StringRef name, PropertyAttributes *a
if (member < UINT_MAX) {
if (attrs)
*attrs = internalClass->propertyData[member];
- return memberData + member;
+ return propertyAt(member);
}
if (attrs)
@@ -316,7 +310,7 @@ Property *Object::__getPropertyDescriptor__(const StringRef name, PropertyAttrib
if (idx < UINT_MAX) {
if (attrs)
*attrs = o->internalClass->propertyData[idx];
- return o->memberData + idx;
+ return o->propertyAt(idx);
}
o = o->prototype();
@@ -515,12 +509,12 @@ 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 = *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;
}
}
@@ -604,7 +598,7 @@ void Object::advanceIterator(Managed *m, ObjectIterator *it, StringRef name, uin
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()) {
@@ -633,7 +627,7 @@ ReturnedValue Object::internalGet(const StringRef name, bool *hasProperty)
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();
@@ -694,7 +688,7 @@ void Object::internalPut(const StringRef name, const ValueRef value)
Property *pd = 0;
PropertyAttributes attrs;
if (member < UINT_MAX) {
- pd = memberData + member;
+ pd = propertyAt(member);
attrs = internalClass->propertyData[member];
}
@@ -886,7 +880,7 @@ bool Object::__defineOwnProperty__(ExecutionContext *ctx, const StringRef name,
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;
@@ -914,7 +908,7 @@ bool Object::__defineOwnProperty__(ExecutionContext *ctx, const StringRef name,
// 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) {
@@ -995,7 +989,7 @@ bool Object::__defineOwnProperty__(ExecutionContext *ctx, uint index, const Stri
Property *current;
PropertyAttributes cattrs;
if (!member.isNull()) {
- current = memberData + index;
+ current = propertyAt(index);
cattrs = internalClass->propertyData[index];
} else {
current = arrayData->getProperty(index);
@@ -1138,8 +1132,7 @@ uint Object::getLength(const Managed *m)
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;
@@ -1194,7 +1187,7 @@ void ArrayObject::init(ExecutionEngine *engine)
{
Q_UNUSED(engine);
- memberData[LengthPropertyIndex].value = Primitive::fromInt32(0);
+ memberData[LengthPropertyIndex] = Primitive::fromInt32(0);
}
ReturnedValue ArrayObject::getLookup(Managed *m, Lookup *l)
@@ -1203,7 +1196,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].value.asReturnedValue();
+ return a->memberData[ArrayObject::LengthPropertyIndex].asReturnedValue();
}
return Object::getLookup(m, l);
}
@@ -1211,9 +1204,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].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
diff --git a/src/qml/jsruntime/qv4object_p.h b/src/qml/jsruntime/qv4object_p.h
index e3361ae160..5c8590f037 100644
--- a/src/qml/jsruntime/qv4object_p.h
+++ b/src/qml/jsruntime/qv4object_p.h
@@ -108,14 +108,16 @@ struct Q_QML_EXPORT Object: Managed {
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);
@@ -355,11 +357,8 @@ struct ArrayObject: Object {
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)
diff --git a/src/qml/jsruntime/qv4regexpobject.cpp b/src/qml/jsruntime/qv4regexpobject.cpp
index 74c8a2d35e..790eaf79f7 100644
--- a/src/qml/jsruntime/qv4regexpobject.cpp
+++ b/src/qml/jsruntime/qv4regexpobject.cpp
@@ -186,7 +186,7 @@ Property *RegExpObject::lastIndexProperty(ExecutionContext *ctx)
{
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.
@@ -394,8 +394,8 @@ ReturnedValue RegExpPrototype::method_exec(CallContext *ctx)
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();
diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp
index 2b63632780..04a0d6fdec 100644
--- a/src/qml/jsruntime/qv4runtime.cpp
+++ b/src/qml/jsruntime/qv4runtime.cpp
@@ -1112,16 +1112,8 @@ ReturnedValue __qmljs_builtin_define_object_literal(QV4::ExecutionContext *ctx,
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) {