Don't copy formals and locals from VM::Function to FunctionObject
authorLars Knoll <lars.knoll@digia.com>
Tue, 29 Jan 2013 10:24:43 +0000 (11:24 +0100)
committerLars Knoll <lars.knoll@digia.com>
Tue, 29 Jan 2013 19:16:50 +0000 (20:16 +0100)
This should make creation of a FunctionObject quite a bit cheaper

Change-Id: I0937f9f2354b7abc47c3673f4957bd70ff9a97b8
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
qmljs_environment.cpp
qmljs_environment.h
qv4functionobject.cpp
qv4functionobject.h
qv4globalobject.cpp

index d76bbb9..007928c 100644 (file)
@@ -188,7 +188,7 @@ ExecutionContext *ExecutionContext::popScope()
     return engine->current;
 }
 
-String **ExecutionContext::formals() const
+String * const *ExecutionContext::formals() const
 {
     return function ? function->formalParameterList : 0;
 }
@@ -198,7 +198,7 @@ unsigned int ExecutionContext::formalCount() const
     return function ? function->formalParameterCount : 0;
 }
 
-String **ExecutionContext::variables() const
+String * const *ExecutionContext::variables() const
 {
     return function ? function->varList : 0;
 }
index 97c8561..ec135a4 100644 (file)
@@ -83,9 +83,9 @@ struct ExecutionContext
     unsigned int argumentCount;
     Value *locals;
 
-    String **formals() const;
+    String * const *formals() const;
     unsigned int formalCount() const;
-    String **variables() const;
+    String * const *variables() const;
     unsigned int variableCount() const;
 
     bool strictMode;
index dfc22a3..e463550 100644 (file)
@@ -165,10 +165,11 @@ void FunctionObject::markObjects()
 {
     if (name)
         name->mark();
-    for (uint i = 0; i < formalParameterCount; ++i)
-        formalParameterList[i]->mark();
-    for (uint i = 0; i < varCount; ++i)
-        varList[i]->mark();
+    // these are marked in VM::Function:
+//    for (uint i = 0; i < formalParameterCount; ++i)
+//        formalParameterList[i]->mark();
+//    for (uint i = 0; i < varCount; ++i)
+//        varList[i]->mark();
     scope->mark();
     Object::markObjects();
 }
@@ -337,23 +338,11 @@ ScriptFunction::ScriptFunction(ExecutionContext *scope, VM::Function *function)
     usesArgumentsObject = function->usesArgumentsObject;
     strictMode = function->isStrict;
     formalParameterCount = function->formals.size();
-    // ### no need to copy
-    if (formalParameterCount) {
-        formalParameterList = new String*[formalParameterCount];
-        for (unsigned int i = 0; i < formalParameterCount; ++i) {
-            formalParameterList[i] = function->formals.at(i);
-        }
-    }
+    formalParameterList = function->formals.constData();
     defineReadonlyProperty(scope->engine->id_length, Value::fromInt32(formalParameterCount));
 
     varCount = function->locals.size();
-    // ### no need to copy
-    if (varCount) {
-        varList = new String*[varCount];
-        for (unsigned int i = 0; i < varCount; ++i) {
-            varList[i] = function->locals.at(i);
-        }
-    }
+    varList = function->locals.constData();
 
     Object *proto = scope->engine->newObject();
     proto->defineDefaultProperty(scope->engine->id_constructor, Value::fromObject(this));
@@ -376,8 +365,6 @@ ScriptFunction::ScriptFunction(ExecutionContext *scope, VM::Function *function)
 
 ScriptFunction::~ScriptFunction()
 {
-    delete[] formalParameterList;
-    delete[] varList;
 }
 
 Value ScriptFunction::call(VM::ExecutionContext *ctx)
index dfdcf74..f554456 100644 (file)
@@ -105,8 +105,8 @@ struct Function {
     const uchar *codeData;
     JSC::MacroAssemblerCodeRef codeRef;
 
-    QList<String *> formals;
-    QList<String *> locals;
+    QVector<String *> formals;
+    QVector<String *> locals;
     QVector<Value> generatedValues;
     QVector<String *> identifiers;
 
@@ -134,8 +134,8 @@ struct Function {
 struct FunctionObject: Object {
     ExecutionContext *scope;
     String *name;
-    String **formalParameterList;
-    String **varList;
+    String * const *formalParameterList;
+    String * const *varList;
     unsigned int formalParameterCount;
     unsigned int varCount;
 
index 9adffce..a446f6f 100644 (file)
@@ -428,7 +428,7 @@ QQmlJS::VM::Function *EvalFunction::parseSource(QQmlJS::VM::ExecutionContext *ct
 
             QStringList inheritedLocals;
             if (inheritContext)
-                for (String **i = ctx->variables(), **ei = i + ctx->variableCount(); i < ei; ++i)
+                for (String * const *i = ctx->variables(), * const *ei = i + ctx->variableCount(); i < ei; ++i)
                     inheritedLocals.append(*i ? (*i)->toQString() : QString());
 
             Codegen cg(ctx, strictMode);