diff options
| author | Lars Knoll <lars.knoll@digia.com> | 2014-03-06 12:06:36 +0100 |
|---|---|---|
| committer | The Qt Project <gerrit-noreply@qt-project.org> | 2014-03-07 21:16:01 +0100 |
| commit | af7ca3607cc6e530af8ed0d1fa5e6d132bc16ac1 (patch) | |
| tree | 7be76616922e984d8ea59e40d5e1f797a4adc3e7 /src/qml/jsruntime/qv4object.cpp | |
| parent | 19cd5c46693a287c08025c01ded8eaf140e21317 (diff) | |
Use an array of Value's for Object::memberData
This cuts the memory required to store properties
in an object in half for the common case. Accessor
properties require two slots inside memberData,
but data properties only one.
Change-Id: I0bab1b88ca9ed5930abf065c77c89985b9ed5320
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jsruntime/qv4object.cpp')
| -rw-r--r-- | src/qml/jsruntime/qv4object.cpp | 63 |
1 files changed, 28 insertions, 35 deletions
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 |
