aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/jsruntime/qv4engine.cpp16
1 files changed, 15 insertions, 1 deletions
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
index a090ac7c47..d571337ecf 100644
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -927,8 +927,18 @@ void ExecutionEngine::requireArgumentsAccessors(int n)
}
}
+static void drainMarkStack(ExecutionEngine *engine, Value *markBase)
+{
+ while (engine->jsStackTop > markBase) {
+ Heap::Base *h = engine->popForGC();
+ Q_ASSERT (h->vtable()->markObjects);
+ h->vtable()->markObjects(h, engine);
+ }
+}
+
void ExecutionEngine::markObjects()
{
+ Value *markBase = jsStackTop;
identifierTable->mark(this);
for (int i = 0; i < nArgumentsAccessors; ++i) {
@@ -941,9 +951,13 @@ void ExecutionEngine::markObjects()
classPool->markObjects(this);
+ drainMarkStack(this, markBase);
+
for (QSet<CompiledData::CompilationUnit*>::ConstIterator it = compilationUnits.constBegin(), end = compilationUnits.constEnd();
- it != end; ++it)
+ it != end; ++it) {
(*it)->markObjects(this);
+ drainMarkStack(this, markBase);
+ }
}
ReturnedValue ExecutionEngine::throwError(const Value &value)