aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4internalclass.cpp
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2018-01-05 13:20:27 +0100
committerLars Knoll <lars.knoll@qt.io>2018-04-12 13:58:30 +0000
commitc7bac1588e0e6a65187042afbde072afa6b8cd9b (patch)
treeed9ebe3c03cf959111e6c7e422febb2dde2a89a7 /src/qml/jsruntime/qv4internalclass.cpp
parent340819e81cf36c01bd21a170fd1a932202257899 (diff)
Remove the pool allocator from InternalClass
Makes it easier to transition it over to be controlled by the GC. Change-Id: I6bea738b3852abfc7870b71e639efc595eeb28fc Reviewed-by: Simon Hausmann <simon.hausmann@qt.io>
Diffstat (limited to 'src/qml/jsruntime/qv4internalclass.cpp')
-rw-r--r--src/qml/jsruntime/qv4internalclass.cpp36
1 files changed, 13 insertions, 23 deletions
diff --git a/src/qml/jsruntime/qv4internalclass.cpp b/src/qml/jsruntime/qv4internalclass.cpp
index 69ca62cb5c..e734347e3e 100644
--- a/src/qml/jsruntime/qv4internalclass.cpp
+++ b/src/qml/jsruntime/qv4internalclass.cpp
@@ -142,8 +142,7 @@ InternalClass::InternalClass(ExecutionEngine *engine)
InternalClass::InternalClass(QV4::InternalClass *other)
- : QQmlJS::Managed()
- , engine(other->engine)
+ : engine(other->engine)
, vtable(other->vtable)
, prototype(other->prototype)
, parent(other)
@@ -538,7 +537,7 @@ InternalClass *InternalClass::asProtoClass()
return newClass;
}
-void InternalClass::destroy()
+void InternalClass::destroyAll()
{
std::vector<InternalClass *> destroyStack;
destroyStack.reserve(64);
@@ -547,15 +546,11 @@ void InternalClass::destroy()
while (!destroyStack.empty()) {
InternalClass *next = destroyStack.back();
destroyStack.pop_back();
- if (!next->engine)
- continue;
+ Q_ASSERT(next->engine);
next->engine = nullptr;
- next->propertyTable.~PropertyHash();
- next->nameMap.~SharedInternalClassData<Identifier *>();
- next->propertyData.~SharedInternalClassData<PropertyAttributes>();
- if (next->m_sealed)
+ if (next->m_sealed && next->m_sealed != next)
destroyStack.push_back(next->m_sealed);
- if (next->m_frozen)
+ if (next->m_frozen && next->m_frozen != next)
destroyStack.push_back(next->m_frozen);
for (size_t i = 0; i < next->transitions.size(); ++i) {
@@ -563,7 +558,7 @@ void InternalClass::destroy()
destroyStack.push_back(next->transitions.at(i).lookup);
}
- next->transitions.~vector<Transition>();
+ delete next;
}
}
@@ -596,24 +591,19 @@ void InternalClass::updateInternalClassIdRecursive()
}
}
-
-static void markChildren(MarkStack *markStack, InternalClass *ic)
+void InternalClass::markObjects(InternalClass *ic, MarkStack *stack)
{
if (ic->prototype)
- ic->prototype->mark(markStack);
+ ic->prototype->mark(stack);
for (auto &t : ic->transitions) {
Q_ASSERT(t.lookup);
- markChildren(markStack, t.lookup);
+ markObjects(t.lookup, stack);
}
-}
-
-
-void InternalClassPool::markObjects(MarkStack *markStack)
-{
- InternalClass *ic = markStack->engine->internalClasses[EngineBase::Class_Empty];
- Q_ASSERT(!ic->prototype);
- ::markChildren(markStack, ic);
+ if (ic->m_frozen)
+ markObjects(ic->m_frozen, stack);
+ if (ic->m_sealed)
+ markObjects(ic->m_sealed, stack);
}
QT_END_NAMESPACE