diff options
-rw-r--r-- | src/qml/jsruntime/qv4engine.cpp | 11 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4engine_p.h | 2 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4internalclass.cpp | 36 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4internalclass_p.h | 13 |
4 files changed, 22 insertions, 40 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp index 82ce54224b..7f908ccef9 100644 --- a/src/qml/jsruntime/qv4engine.cpp +++ b/src/qml/jsruntime/qv4engine.cpp @@ -199,9 +199,7 @@ ExecutionEngine::ExecutionEngine(QJSEngine *jsEngine) identifierTable = new IdentifierTable(this); - classPool = new InternalClassPool; - - internalClasses[Class_Empty] = new (classPool) InternalClass(this); + internalClasses[Class_Empty] = new InternalClass(this); internalClasses[Class_String] = internalClasses[EngineBase::Class_Empty]->changeVTable(QV4::String::staticVTable()); internalClasses[Class_MemberData] = internalClasses[EngineBase::Class_Empty]->changeVTable(QV4::MemberData::staticVTable()); internalClasses[Class_SimpleArrayData] = internalClasses[EngineBase::Class_Empty]->changeVTable(QV4::SimpleArrayData::staticVTable()); @@ -497,8 +495,7 @@ ExecutionEngine::~ExecutionEngine() while (!compilationUnits.isEmpty()) (*compilationUnits.begin())->unlink(); - internalClasses[Class_Empty]->destroy(); - delete classPool; + internalClasses[Class_Empty]->destroyAll(); delete bumperPointerAllocator; delete regExpCache; delete regExpAllocator; @@ -536,7 +533,7 @@ void ExecutionEngine::initRootContext() InternalClass *ExecutionEngine::newClass(InternalClass *other) { - return new (classPool) InternalClass(other); + return new InternalClass(other); } InternalClass *ExecutionEngine::newInternalClass(const VTable *vtable, Object *prototype) @@ -922,7 +919,7 @@ void ExecutionEngine::markObjects(MarkStack *markStack) setter->mark(markStack); } - classPool->markObjects(markStack); + InternalClass::markObjects(internalClasses[EngineBase::Class_Empty], markStack); markStack->drain(); for (auto compilationUnit: compilationUnits) { diff --git a/src/qml/jsruntime/qv4engine_p.h b/src/qml/jsruntime/qv4engine_p.h index 3b515791a4..d5897c1f36 100644 --- a/src/qml/jsruntime/qv4engine_p.h +++ b/src/qml/jsruntime/qv4engine_p.h @@ -88,7 +88,6 @@ struct CompilationUnit; } struct Function; -struct InternalClassPool; struct Q_QML_EXPORT CppStackFrame { CppStackFrame *parent; @@ -260,7 +259,6 @@ public: Object *valueTypeWrapperPrototype() const { return reinterpret_cast<Object *>(jsObjects + ValueTypeProto); } Object *signalHandlerPrototype() const { return reinterpret_cast<Object *>(jsObjects + SignalHandlerProto); } - InternalClassPool *classPool; EvalFunction *evalFunction() const { return reinterpret_cast<EvalFunction *>(jsObjects + Eval_Function); } FunctionObject *getStackFunction() const { return reinterpret_cast<FunctionObject *>(jsObjects + GetStack_Function); } FunctionObject *thrower() const { return reinterpret_cast<FunctionObject *>(jsObjects + ThrowerObject); } 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 diff --git a/src/qml/jsruntime/qv4internalclass_p.h b/src/qml/jsruntime/qv4internalclass_p.h index 53fc25e42b..168ed6c950 100644 --- a/src/qml/jsruntime/qv4internalclass_p.h +++ b/src/qml/jsruntime/qv4internalclass_p.h @@ -53,7 +53,6 @@ #include "qv4global_p.h" #include <QHash> -#include <private/qqmljsmemorypool_p.h> #include <private/qv4identifier_p.h> QT_BEGIN_NAMESPACE @@ -259,7 +258,7 @@ struct InternalClassTransition { return id < other.id || (id == other.id && flags < other.flags); } }; -struct InternalClass : public QQmlJS::Managed { +struct InternalClass { int id = 0; // unique across the engine, gets changed also when proto chain changes ExecutionEngine *engine; const VTable *vtable; @@ -315,10 +314,13 @@ struct InternalClass : public QQmlJS::Managed { Q_REQUIRED_RESULT InternalClass *asProtoClass(); - void destroy(); + void destroyAll(); void updateProtoUsage(Heap::Object *o); + static void markObjects(InternalClass *ic, MarkStack *stack); + + private: Q_QML_EXPORT InternalClass *changeVTableImpl(const VTable *vt); Q_QML_EXPORT InternalClass *changePrototypeImpl(Heap::Object *proto); @@ -329,11 +331,6 @@ private: InternalClass(InternalClass *other); }; -struct InternalClassPool : public QQmlJS::MemoryPool -{ - void markObjects(MarkStack *markStack); -}; - } QT_END_NAMESPACE |