From b29a1aee35bc6e79beb028c92e5aab9bee0c18b3 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Fri, 9 Jan 2015 23:36:57 +0100 Subject: Move extensible into the internal class With this, we can now save one pointer per Heap object. Change-Id: I7f69193ff51c9fd9c5dbfba90aa1ebb3f93da2e6 Reviewed-by: Simon Hausmann --- src/qml/jsruntime/qv4internalclass.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'src/qml/jsruntime/qv4internalclass.cpp') diff --git a/src/qml/jsruntime/qv4internalclass.cpp b/src/qml/jsruntime/qv4internalclass.cpp index 8c44d65426..2115ee09a0 100644 --- a/src/qml/jsruntime/qv4internalclass.cpp +++ b/src/qml/jsruntime/qv4internalclass.cpp @@ -116,6 +116,7 @@ InternalClass::InternalClass(ExecutionEngine *engine) , m_sealed(0) , m_frozen(0) , size(0) + , extensible(true) { } @@ -130,7 +131,9 @@ InternalClass::InternalClass(const QV4::InternalClass &other) , m_sealed(0) , m_frozen(0) , size(other.size) + , extensible(other.extensible) { + Q_ASSERT(extensible); } void InternalClass::changeMember(Object *object, String *string, PropertyAttributes data, uint *index) @@ -228,6 +231,27 @@ InternalClass *InternalClass::changeVTable(const ManagedVTable *vt) return newClass; } +InternalClass *InternalClass::nonExtensible() +{ + if (!extensible) + return this; + + Transition temp; + temp.vtable = 0; + temp.lookup = 0; + temp.flags = Transition::NotExtensible; + + Transition &t = lookupOrInsertTransition(temp); + if (t.lookup) + return t.lookup; + + InternalClass *newClass = engine->newClass(*this); + newClass->extensible = false; + + t.lookup = newClass; + return newClass; +} + void InternalClass::addMember(Object *object, String *string, PropertyAttributes data, uint *index) { data.resolve(); @@ -357,6 +381,7 @@ InternalClass *InternalClass::sealed() attrs.setConfigurable(false); m_sealed = m_sealed->addMember(nameMap.at(i), attrs); } + m_sealed = m_sealed->nonExtensible(); m_sealed->m_sealed = m_sealed; return m_sealed; @@ -377,6 +402,7 @@ InternalClass *InternalClass::frozen() attrs.setConfigurable(false); m_frozen = m_frozen->addMember(nameMap.at(i), attrs); } + m_frozen = m_frozen->nonExtensible(); m_frozen->m_frozen = m_frozen; m_frozen->m_sealed = m_frozen; -- cgit v1.2.3