aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/jsruntime/qv4engine.cpp11
-rw-r--r--src/qml/jsruntime/qv4engine_p.h2
-rw-r--r--src/qml/jsruntime/qv4internalclass.cpp36
-rw-r--r--src/qml/jsruntime/qv4internalclass_p.h13
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