From af7ca3607cc6e530af8ed0d1fa5e6d132bc16ac1 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Thu, 6 Mar 2014 12:06:36 +0100 Subject: 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 --- src/qml/jsruntime/qv4internalclass.cpp | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'src/qml/jsruntime/qv4internalclass.cpp') 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); -- cgit v1.2.3