diff options
author | Lars Knoll <lars.knoll@digia.com> | 2013-11-15 16:36:13 +0100 |
---|---|---|
committer | The Qt Project <gerrit-noreply@qt-project.org> | 2013-12-04 09:45:33 +0100 |
commit | 0fa9cf218bdd3054585f23abfb2b707e26ce987a (patch) | |
tree | 346592c0d570d138278c659dbbbbda23ec1d148d /src/qml/jsruntime/qv4function.cpp | |
parent | 608a9600142878574a509964941413bb15c91201 (diff) |
Use an internalClass to represent formals and locals in CallContexts
formals and locals in a CallContext where so far accessed through a
linear search in ExecutionContext::getProperty. Fix this by
introducing an internalClass for the Function used by the call
context.
Change-Id: I1141efa12b19d6de4a354bfd6e769c5ffcb8898b
Reviewed-by: Simon Hausmann <simon.hausmann@digia.com>
Diffstat (limited to 'src/qml/jsruntime/qv4function.cpp')
-rw-r--r-- | src/qml/jsruntime/qv4function.cpp | 33 |
1 files changed, 20 insertions, 13 deletions
diff --git a/src/qml/jsruntime/qv4function.cpp b/src/qml/jsruntime/qv4function.cpp index 950224386d..0e90e213c4 100644 --- a/src/qml/jsruntime/qv4function.cpp +++ b/src/qml/jsruntime/qv4function.cpp @@ -62,18 +62,29 @@ Function::Function(ExecutionEngine *engine, CompiledData::CompilationUnit *unit, name = compilationUnit->runtimeStrings[compiledFunction->nameIndex].asString(); - formals.resize(compiledFunction->nFormals); - formals.fill(0); - const quint32 *formalsIndices = compiledFunction->formalsTable(); - for (quint32 i = 0; i < compiledFunction->nFormals; ++i) - formals[i] = compilationUnit->runtimeStrings[formalsIndices[i]].asString(); + nArguments = compiledFunction->nFormals; + internalClass = engine->emptyClass; + const quint32 *formalsIndices = compiledFunction->formalsTable(); + // iterate backwards, so we get the right ordering for duplicate names + for (int i = static_cast<int>(compiledFunction->nFormals - 1); i >= 0; --i) { + String *arg = compilationUnit->runtimeStrings[formalsIndices[i]].asString(); + while (1) { + InternalClass *newClass = internalClass->addMember(arg, Attr_NotConfigurable); + if (newClass != internalClass) { + internalClass = newClass; + break; + } + // duplicate arguments, need some trick to store them + arg = new (engine->memoryManager) String(engine, arg, engine->newString(QString(0xfffe))->getPointer()); + } + } - locals.resize(compiledFunction->nLocals); - locals.fill(0); const quint32 *localsIndices = compiledFunction->localsTable(); - for (quint32 i = 0; i < compiledFunction->nLocals; ++i) - locals[i] = compilationUnit->runtimeStrings[localsIndices[i]].asString(); + for (quint32 i = 0; i < compiledFunction->nLocals; ++i) { + String *local = compilationUnit->runtimeStrings[localsIndices[i]].asString(); + internalClass = internalClass->addMember(local, Attr_NotConfigurable); + } } Function::~Function() @@ -84,10 +95,6 @@ Function::~Function() void Function::mark(ExecutionEngine *e) { name.mark(e); - for (int i = 0; i < formals.size(); ++i) - formals.at(i)->mark(e); - for (int i = 0; i < locals.size(); ++i) - locals.at(i)->mark(e); } namespace QV4 { |