Refcount the compilation unit and remove refcount from runtime function
authorSimon Hausmann <simon.hausmann@digia.com>
Fri, 16 Aug 2013 15:25:58 +0000 (17:25 +0200)
committerLars Knoll <lars.knoll@digia.com>
Fri, 16 Aug 2013 17:18:48 +0000 (19:18 +0200)
Change-Id: Iaa2f96a6814f1b39589ffcfe3c84e3c229e25f1f
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
src/qml/compiler/qv4compileddata.cpp
src/qml/compiler/qv4isel_p.cpp
src/qml/jsruntime/qv4function.cpp
src/qml/jsruntime/qv4function_p.h
src/qml/jsruntime/qv4functionobject.cpp
src/qml/jsruntime/qv4script.cpp
tools/v4/main.cpp

index 4b7f132..59c6a9b 100644 (file)
@@ -58,6 +58,7 @@ CompilationUnit::~CompilationUnit()
     delete [] runtimeLookups;
     delete [] runtimeRegularExpressions;
     free(runtimeClasses);
+    qDeleteAll(runtimeFunctions);
 }
 
 QV4::Function *CompilationUnit::linkToEngine(ExecutionEngine *engine)
index c81f5df..6cfe762 100644 (file)
@@ -83,9 +83,6 @@ QV4::Function *EvalInstructionSelection::createFunctionMapping(QV4::Function *ou
     QV4::Function *vmFunction = _engine->newFunction(irFunction->name ? *irFunction->name : QString());
     _irToVM.insert(irFunction, vmFunction);
 
-    if (outer)
-        outer->addNestedFunction(vmFunction);
-
     foreach (V4IR::Function *function, irFunction->nestedFunctions)
         createFunctionMapping(vmFunction, function);
 
index 32fd9c3..c96935d 100644 (file)
@@ -55,12 +55,6 @@ Function::~Function()
 {
     engine->functions.remove(engine->functions.indexOf(this));
     UnwindHelper::deregisterFunction(this); // ### move to masm compilation unit
-
-    Q_ASSERT(!refCount);
-    foreach (Function *f, nestedFunctions)
-        f->deref();
-    if (compilationUnit)
-        compilationUnit->deref();
 }
 
 void Function::init(CompiledData::CompilationUnit *unit, const CompiledData::Function *function, Value (*codePtr)(ExecutionContext *, const uchar *),
@@ -68,7 +62,6 @@ void Function::init(CompiledData::CompilationUnit *unit, const CompiledData::Fun
 {
     Q_ASSERT(!compilationUnit);
     compilationUnit = unit;
-    compilationUnit->ref();
     compiledFunction = function;
 
     code = codePtr;
index 47215cf..d9ba9dc 100644 (file)
@@ -87,7 +87,6 @@ struct LineNumberMapping
 };
 
 struct Function {
-    int refCount;
     String *name;
 
     const CompiledData::Function *compiledFunction;
@@ -98,13 +97,11 @@ struct Function {
 
     QVector<String *> formals;
     QVector<String *> locals;
-    QVector<Function *> nestedFunctions;
 
     ExecutionEngine *engine;
 
     Function(ExecutionEngine *engine, String *name)
-        : refCount(0)
-        , name(name)
+        : name(name)
         , compiledFunction(0)
         , compilationUnit(0)
         , code(0)
@@ -118,15 +115,6 @@ struct Function {
     void init(CompiledData::CompilationUnit *unit, const CompiledData::Function *function,
               Value (*codePtr)(ExecutionContext *, const uchar *), quint32 _codeSize);
 
-    void ref() { ++refCount; }
-    void deref() { if (!--refCount) delete this; }
-
-    void addNestedFunction(Function *f)
-    {
-        f->ref();
-        nestedFunctions.append(f);
-    }
-
     inline QString sourceFile() const { return compilationUnit->fileName(); }
 
     inline bool usesArgumentsObject() const { return compiledFunction->flags & CompiledData::Function::UsesArgumentsObject; }
index fd9c92f..fc5300c 100644 (file)
@@ -96,7 +96,7 @@ FunctionObject::FunctionObject(ExecutionContext *scope, String *name)
 FunctionObject::~FunctionObject()
 {
     if (function)
-        function->deref();
+        function->compilationUnit->deref();
 }
 
 Value FunctionObject::newInstance()
@@ -325,7 +325,7 @@ ScriptFunction::ScriptFunction(ExecutionContext *scope, Function *function)
 {
     vtbl = &static_vtbl;
     this->function = function;
-    this->function->ref();
+    this->function->compilationUnit->ref();
     assert(function);
     assert(function->code);
 
index 70ab3d4..2997604 100644 (file)
@@ -67,7 +67,7 @@ struct QmlBindingWrapper : FunctionObject
     {
         vtbl = &static_vtbl;
         function = f;
-        function->ref();
+        function->compilationUnit->ref();
         usesArgumentsObject = function->usesArgumentsObject();
         needsActivation = function->needsActivation();
         defineReadonlyProperty(scope->engine->id_length, Value::fromInt32(1));
index 69090c7..14b08d3 100644 (file)
@@ -218,11 +218,13 @@ 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);