From: Lars Knoll Date: Tue, 29 Jan 2013 10:24:43 +0000 (+0100) Subject: Don't copy formals and locals from VM::Function to FunctionObject X-Git-Tag: upstream/5.2.1~669^2~659^2~355 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ff99f697be0f2caa7675d79aee8627b01f4b5f4a;p=platform%2Fupstream%2Fqtdeclarative.git Don't copy formals and locals from VM::Function to FunctionObject This should make creation of a FunctionObject quite a bit cheaper Change-Id: I0937f9f2354b7abc47c3673f4957bd70ff9a97b8 Reviewed-by: Simon Hausmann --- diff --git a/qmljs_environment.cpp b/qmljs_environment.cpp index d76bbb9..007928c 100644 --- a/qmljs_environment.cpp +++ b/qmljs_environment.cpp @@ -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; } diff --git a/qmljs_environment.h b/qmljs_environment.h index 97c8561..ec135a4 100644 --- a/qmljs_environment.h +++ b/qmljs_environment.h @@ -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; diff --git a/qv4functionobject.cpp b/qv4functionobject.cpp index dfc22a3..e463550 100644 --- a/qv4functionobject.cpp +++ b/qv4functionobject.cpp @@ -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) diff --git a/qv4functionobject.h b/qv4functionobject.h index dfdcf74..f554456 100644 --- a/qv4functionobject.h +++ b/qv4functionobject.h @@ -105,8 +105,8 @@ struct Function { const uchar *codeData; JSC::MacroAssemblerCodeRef codeRef; - QList formals; - QList locals; + QVector formals; + QVector locals; QVector generatedValues; QVector 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; diff --git a/qv4globalobject.cpp b/qv4globalobject.cpp index 9adffce..a446f6f 100644 --- a/qv4globalobject.cpp +++ b/qv4globalobject.cpp @@ -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);