for (int i = 0; i < data->stringTableSize; ++i)
runtimeStrings[i] = engine->newIdentifier(data->stringAt(i)->qString());
+ runtimeFunctions.resize(data->functionTableSize);
+ for (int i = 0; i < data->functionTableSize; ++i)
+ runtimeFunctions[i] = new QV4::Function(engine, runtimeStrings[data->functionAt(i)->nameIndex]);
+
runtimeRegularExpressions = new QV4::Value[data->regexpTableSize];
for (int i = 0; i < data->regexpTableSize; ++i) {
const CompiledData::RegExp *re = data->regexpAt(i);
delete _as;
}
-void InstructionSelection::run(QV4::Function *vmFunction, V4IR::Function *function)
+void InstructionSelection::run(V4IR::Function *function)
{
QVector<Lookup> lookups;
QSet<V4IR::BasicBlock*> reentryBlocks;
compilationUnit->runtimeFunctions.reserve(jsUnitGenerator.irModule->functions.size());
compilationUnit->codeRefs.resize(jsUnitGenerator.irModule->functions.size());
int i = 0;
- foreach (V4IR::Function *irFunction, jsUnitGenerator.irModule->functions) {
- compilationUnit->runtimeFunctions << _irToVM[irFunction];
+ foreach (V4IR::Function *irFunction, jsUnitGenerator.irModule->functions)
compilationUnit->codeRefs[i++] = codeRefs[irFunction];
- }
return compilationUnit;
}
InstructionSelection(QV4::ExecutionEngine *engine, V4IR::Module *module);
~InstructionSelection();
- virtual void run(QV4::Function *vmFunction, V4IR::Function *function);
+ virtual void run(V4IR::Function *function);
protected:
virtual QV4::CompiledData::CompilationUnit *backendCompileStep();
InstructionSelection::InstructionSelection(QV4::ExecutionEngine *engine, V4IR::Module *module)
: EvalInstructionSelection(engine, module)
, _function(0)
- , _vmFunction(0)
, _block(0)
, _codeStart(0)
, _codeNext(0)
{
}
-void InstructionSelection::run(QV4::Function *vmFunction, V4IR::Function *function)
+void InstructionSelection::run(V4IR::Function *function)
{
V4IR::BasicBlock *block = 0, *nextBlock = 0;
uchar *codeEnd = codeStart + codeSize;
qSwap(_function, function);
- qSwap(_vmFunction, vmFunction);
qSwap(block, _block);
qSwap(nextBlock, _nextBlock);
qSwap(patches, _patches);
qSwap(_stackSlotAllocator, stackSlotAllocator);
delete stackSlotAllocator;
qSwap(_function, function);
- qSwap(_vmFunction, vmFunction);
qSwap(block, _block);
qSwap(nextBlock, _nextBlock);
qSwap(patches, _patches);
compilationUnit->runtimeFunctions.reserve(jsUnitGenerator.irModule->functions.size());
compilationUnit->codeRefs.resize(jsUnitGenerator.irModule->functions.size());
int i = 0;
- foreach (V4IR::Function *irFunction, jsUnitGenerator.irModule->functions) {
- compilationUnit->runtimeFunctions << _irToVM[irFunction];
+ foreach (V4IR::Function *irFunction, jsUnitGenerator.irModule->functions)
compilationUnit->codeRefs[i++] = codeRefs[irFunction];
- }
return compilationUnit;
}
InstructionSelection(QV4::ExecutionEngine *engine, V4IR::Module *module);
~InstructionSelection();
- virtual void run(QV4::Function *vmFunction, V4IR::Function *function);
+ virtual void run(V4IR::Function *function);
protected:
virtual QV4::CompiledData::CompilationUnit *backendCompileStep();
QByteArray squeezeCode() const;
V4IR::Function *_function;
- QV4::Function *_vmFunction;
V4IR::BasicBlock *_block;
V4IR::BasicBlock *_nextBlock;
{
assert(engine);
assert(module);
-
- createFunctionMapping(0, module->rootFunction);
- foreach (V4IR::Function *f, module->functions) {
- assert(_irToVM.contains(f));
- }
}
EvalInstructionSelection::~EvalInstructionSelection()
EvalISelFactory::~EvalISelFactory()
{}
-QV4::Function *EvalInstructionSelection::createFunctionMapping(QV4::Function *outer, Function *irFunction)
-{
- QV4::Function *vmFunction = _engine->newFunction(irFunction->name ? *irFunction->name : QString());
- _irToVM.insert(irFunction, vmFunction);
-
- foreach (V4IR::Function *function, irFunction->nestedFunctions)
- createFunctionMapping(vmFunction, function);
-
- return vmFunction;
-}
-
QV4::CompiledData::CompilationUnit *EvalInstructionSelection::compile()
{
Function *rootFunction = jsUnitGenerator.irModule->rootFunction;
if (!rootFunction)
return 0;
- for (QHash<V4IR::Function*, QV4::Function*>::Iterator it = _irToVM.begin(), end = _irToVM.end();
- it != end; ++it) {
- if (!(*it)->code)
- run(it.value(), it.key());
- }
+ foreach (V4IR::Function *f, jsUnitGenerator.irModule->functions)
+ run(f);
return backendCompileStep();
}
int registerJSClass(QQmlJS::V4IR::ExprList *args) { return jsUnitGenerator.registerJSClass(args); }
protected:
- QV4::Function *createFunctionMapping(QV4::Function *outer, V4IR::Function *irFunction);
QV4::ExecutionEngine *engine() const { return _engine; }
- virtual void run(QV4::Function *vmFunction, V4IR::Function *function) = 0;
+ virtual void run(V4IR::Function *function) = 0;
virtual QV4::CompiledData::CompilationUnit *backendCompileStep() = 0;
private:
QV4::ExecutionEngine *_engine;
protected:
- QHash<V4IR::Function *, QV4::Function *> _irToVM;
bool useFastLookups;
QV4::Compiler::JSUnitGenerator jsUnitGenerator;
};
return current;
}
-Function *ExecutionEngine::newFunction(const QString &name)
-{
- Function *f = new Function(this, newIdentifier(name));
- return f;
-}
-
FunctionObject *ExecutionEngine::newBuiltinFunction(ExecutionContext *scope, String *name, Value (*code)(SimpleCallContext *))
{
BuiltinFunctionOld *f = new (memoryManager) BuiltinFunctionOld(scope, name, code);
void pushContext(SimpleCallContext *context);
ExecutionContext *popContext();
- Function *newFunction(const QString &name);
-
FunctionObject *newBuiltinFunction(ExecutionContext *scope, String *name, Value (*code)(SimpleCallContext *));
FunctionObject *newScriptFunction(ExecutionContext *scope, Function *function);
BoundFunction *newBoundFunction(ExecutionContext *scope, FunctionObject *target, Value boundThis, const QVector<Value> &boundArgs);