Runtime strings are identifiers, but they still require to be marked. Keep
track of all compilation units in the engine (one per file) and mark its
run-time strings.
Change-Id: Ie70b00dfa373c4567279591de2f717e8103c288f
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
CompilationUnit::~CompilationUnit()
{
+ engine->compilationUnits.erase(engine->compilationUnits.find(this));
free(data);
free(runtimeStrings);
delete [] runtimeLookups;
QV4::Function *CompilationUnit::linkToEngine(ExecutionEngine *engine)
{
+ this->engine = engine;
+ engine->compilationUnits.insert(this);
+
assert(!runtimeStrings);
assert(data);
runtimeStrings = (QV4::String**)malloc(data->stringTableSize * sizeof(QV4::String*));
return linkBackendToEngine(engine);
}
+void CompilationUnit::markObjects()
+{
+ for (int i = 0; i < data->stringTableSize; ++i)
+ runtimeStrings[i]->mark();
+}
+
}
}
{
CompilationUnit()
: refCount(0)
+ , engine(0)
, data(0)
, runtimeStrings(0)
, runtimeLookups(0)
void deref() { if (!--refCount) delete this; }
int refCount;
+ ExecutionEngine *engine;
Unit *data;
QString fileName() const { return data->stringAt(data->sourceFileIndex)->qString(); }
// ### runtime data
// pointer to qml data for QML unit
+ void markObjects();
+
protected:
virtual QV4::Function *linkBackendToEngine(QV4::ExecutionEngine *engine) = 0;
};
if (m_qmlExtensions)
m_qmlExtensions->markObjects();
+
+ for (QSet<CompiledData::CompilationUnit*>::ConstIterator it = compilationUnits.constBegin(), end = compilationUnits.constEnd();
+ it != end; ++it)
+ (*it)->markObjects();
}
namespace {
namespace Debugging {
class Debugger;
} // namespace Debugging
+namespace CompiledData {
+struct CompilationUnit;
+}
}
namespace QV4 {
mutable QVector<Function *> functions;
mutable bool functionsNeedSort;
+ QSet<CompiledData::CompilationUnit*> compilationUnits;
+
quint32 m_engineId;
RegExpCache *regExpCache;