diff options
-rw-r--r-- | src/qml/jsruntime/qv4script.cpp | 33 | ||||
-rw-r--r-- | src/qml/jsruntime/qv4script_p.h | 1 | ||||
-rw-r--r-- | tools/v4/main.cpp | 2 |
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); |