aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml')
-rw-r--r--src/qml/jsruntime/qv4script.cpp33
-rw-r--r--src/qml/jsruntime/qv4script_p.h1
2 files changed, 30 insertions, 4 deletions
diff --git a/src/qml/jsruntime/qv4script.cpp b/src/qml/jsruntime/qv4script.cpp
index 2e75caa3b6..7f8e9e205e 100644
--- a/src/qml/jsruntime/qv4script.cpp
+++ b/src/qml/jsruntime/qv4script.cpp
@@ -61,6 +61,8 @@ using namespace QV4;
struct QmlBindingWrapper : FunctionObject
{
+ Q_MANAGED
+
QmlBindingWrapper(ExecutionContext *scope, Function *f, Object *qml)
: FunctionObject(scope, scope->engine->id_eval)
, qml(qml)
@@ -86,17 +88,39 @@ struct QmlBindingWrapper : FunctionObject
wrapper->qmlContext->mark();
}
-protected:
- static const ManagedVTable static_vtbl;
-
private:
Object *qml;
CallContext *qmlContext;
-
};
DEFINE_MANAGED_VTABLE(QmlBindingWrapper);
+struct CompilationUnitHolder : public QV4::Object
+{
+ Q_MANAGED
+
+ CompilationUnitHolder(ExecutionEngine *engine, CompiledData::CompilationUnit *unit)
+ : Object(engine)
+ , unit(unit)
+ {
+ unit->ref();
+ vtbl = &static_vtbl;
+ }
+ ~CompilationUnitHolder()
+ {
+ unit->deref();
+ }
+
+ static void destroy(Managed *that)
+ {
+ static_cast<CompilationUnitHolder*>(that)->~CompilationUnitHolder();
+ }
+
+ QV4::CompiledData::CompilationUnit *unit;
+};
+
+DEFINE_MANAGED_VTABLE(CompilationUnitHolder);
+
Value QmlBindingWrapper::call(Managed *that, const Value &, Value *, int)
{
ExecutionEngine *engine = that->engine();
@@ -170,6 +194,7 @@ void Script::parse()
isel->setUseFastLookups(false);
QV4::CompiledData::CompilationUnit *compilationUnit = isel->compile();
vmFunction = compilationUnit->linkToEngine(v4);
+ compilationUnitHolder = Value::fromObject(new (v4->memoryManager) CompilationUnitHolder(v4, compilationUnit));
}
if (!vmFunction)
diff --git a/src/qml/jsruntime/qv4script_p.h b/src/qml/jsruntime/qv4script_p.h
index 20f9285879..250fd73704 100644
--- a/src/qml/jsruntime/qv4script_p.h
+++ b/src/qml/jsruntime/qv4script_p.h
@@ -69,6 +69,7 @@ struct Q_QML_EXPORT Script {
bool inheritContext;
bool parsed;
QV4::PersistentValue qml;
+ QV4::PersistentValue compilationUnitHolder;
Function *vmFunction;
bool parseAsBinding;