aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4internalclass.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@theqtcompany.com>2015-01-09 23:36:57 +0100
committerSimon Hausmann <simon.hausmann@digia.com>2015-01-12 11:04:36 +0100
commitb29a1aee35bc6e79beb028c92e5aab9bee0c18b3 (patch)
treefff5e8400fa797108f1835128c775bdab934bdb3 /src/qml/jsruntime/qv4internalclass.cpp
parent431458b685fa9f7355f50d21a09ee9f93bcb42d5 (diff)
Move extensible into the internal class
With this, we can now save one pointer per Heap object. Change-Id: I7f69193ff51c9fd9c5dbfba90aa1ebb3f93da2e6 Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jsruntime/qv4internalclass.cpp')
-rw-r--r--src/qml/jsruntime/qv4internalclass.cpp26
1 files changed, 26 insertions, 0 deletions
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;