From ff99f697be0f2caa7675d79aee8627b01f4b5f4a Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Tue, 29 Jan 2013 11:24:43 +0100 Subject: [PATCH] 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 --- qmljs_environment.cpp | 4 ++-- qmljs_environment.h | 4 ++-- qv4functionobject.cpp | 27 +++++++-------------------- qv4functionobject.h | 8 ++++---- qv4globalobject.cpp | 2 +- 5 files changed, 16 insertions(+), 29 deletions(-) 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); -- 2.7.4