// quint32 offsetForInnerFunctions[nInnerFunctions]
// Function[nInnerFunctions]
+ const quint32 *formalsTable() const { return reinterpret_cast<const quint32 *>(reinterpret_cast<const char *>(this) + formalsOffset); }
+ const quint32 *localsTable() const { return reinterpret_cast<const quint32 *>(reinterpret_cast<const char *>(this) + localsOffset); }
+
static int calculateSize(int nFormals, int nLocals, int nInnerfunctions) {
return (sizeof(Function) + (nFormals + nLocals + nInnerfunctions) * sizeof(quint32) + 7) & ~0x7;
}
QV4::Function *runtimeFunction = runtimeFunctions.at(i);
const CompiledData::Function *compiledFunction = data->functionAt(i);
- runtimeFunction->compilationUnit = this;
- runtimeFunction->compilationUnit->ref();
- runtimeFunction->compiledFunction = compiledFunction;
+ runtimeFunction->init(this, compiledFunction);
if (compiledFunction == compiledRootFunction) {
assert(!rootRuntimeFunction);
if (outer)
outer->addNestedFunction(vmFunction);
- foreach (const QString *formal, irFunction->formals)
- if (formal)
- vmFunction->formals.append(_engine->newString(*formal));
- foreach (const QString *local, irFunction->locals)
- if (local)
- vmFunction->locals.append(_engine->newString(*local));
-
foreach (V4IR::Function *function, irFunction->nestedFunctions)
createFunctionMapping(vmFunction, function);
compilationUnit->deref();
}
+void Function::init(CompiledData::CompilationUnit *unit, const CompiledData::Function *function)
+{
+ Q_ASSERT(!compilationUnit);
+ compilationUnit = unit;
+ compilationUnit->ref();
+ compiledFunction = function;
+
+ formals.resize(compiledFunction->nFormals);
+ const quint32 *formalsIndices = compiledFunction->formalsTable();
+ for (int i = 0; i < compiledFunction->nFormals; ++i)
+ formals[i] = engine->newString(unit->data->stringAt(formalsIndices[i])->qString());
+
+
+ locals.resize(compiledFunction->nLocals);
+ const quint32 *localsIndices = compiledFunction->localsTable();
+ for (int i = 0; i < compiledFunction->nLocals; ++i)
+ locals[i] = engine->newString(unit->data->stringAt(localsIndices[i])->qString());
+}
+
void Function::mark()
{
if (name)
{}
~Function();
+ // ### Merge with constructor later.
+ void init(CompiledData::CompilationUnit *unit, const CompiledData::Function *function);
+
void ref() { ++refCount; }
void deref() { if (!--refCount) delete this; }