diff options
author | Lars Knoll <lars.knoll@qt.io> | 2018-01-05 13:20:27 +0100 |
---|---|---|
committer | Lars Knoll <lars.knoll@qt.io> | 2018-04-12 13:58:30 +0000 |
commit | c7bac1588e0e6a65187042afbde072afa6b8cd9b (patch) | |
tree | ed9ebe3c03cf959111e6c7e422febb2dde2a89a7 /src/qml/jsruntime/qv4internalclass.cpp | |
parent | 340819e81cf36c01bd21a170fd1a932202257899 (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.cpp | 36 |
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 |