aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/qml/jsruntime/qv4script.cpp33
-rw-r--r--src/qml/jsruntime/qv4script_p.h1
-rw-r--r--tools/v4/main.cpp2
3 files changed, 30 insertions, 6 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;
diff --git a/tools/v4/main.cpp b/tools/v4/main.cpp
index 0244afab34..225a4f11fb 100644
--- a/tools/v4/main.cpp
+++ b/tools/v4/main.cpp
@@ -206,13 +206,11 @@ int main(int argc, char *argv[])
QV4::Script script(ctx, code, fn);
script.parseAsBinding = runAsQml;
script.parse();
- script.function()->compilationUnit->ref();
QV4::Value result = script.run();
if (!result.isUndefined()) {
if (! qgetenv("SHOW_EXIT_VALUE").isEmpty())
std::cout << "exit value: " << qPrintable(result.toString(ctx)->toQString()) << std::endl;
}
- script.function()->compilationUnit->deref();
} catch (QV4::Exception& ex) {
ex.accept(ctx);
showException(ctx, ex);