2012-12-11 09:03:40 +00:00
|
|
|
#include "debugging.h"
|
|
|
|
#include "qmljs_engine.h"
|
|
|
|
#include "qv4ir_p.h"
|
2012-11-19 13:59:53 +00:00
|
|
|
#include "qv4isel_p.h"
|
2012-12-11 09:03:40 +00:00
|
|
|
#include "qv4isel_util_p.h"
|
|
|
|
|
|
|
|
#include <QString>
|
|
|
|
|
|
|
|
#include <cassert>
|
2012-11-19 13:59:53 +00:00
|
|
|
|
|
|
|
using namespace QQmlJS;
|
|
|
|
|
2012-12-11 09:03:40 +00:00
|
|
|
EvalInstructionSelection::EvalInstructionSelection(VM::ExecutionEngine *engine, IR::Module *module)
|
|
|
|
: _engine(engine)
|
|
|
|
{
|
|
|
|
assert(engine);
|
|
|
|
assert(module);
|
|
|
|
|
2012-12-13 11:09:04 +00:00
|
|
|
createFunctionMapping(engine, module->rootFunction);
|
|
|
|
foreach (IR::Function *f, module->functions) {
|
|
|
|
assert(_irToVM.contains(f));
|
|
|
|
}
|
2012-12-11 09:03:40 +00:00
|
|
|
}
|
|
|
|
|
2012-11-19 13:59:53 +00:00
|
|
|
EvalInstructionSelection::~EvalInstructionSelection()
|
|
|
|
{}
|
|
|
|
|
2012-11-20 12:41:49 +00:00
|
|
|
EvalISelFactory::~EvalISelFactory()
|
2012-11-19 13:59:53 +00:00
|
|
|
{}
|
2012-12-11 09:03:40 +00:00
|
|
|
|
|
|
|
VM::Function *EvalInstructionSelection::createFunctionMapping(VM::ExecutionEngine *engine, IR::Function *irFunction)
|
|
|
|
{
|
|
|
|
VM::Function *vmFunction = engine->newFunction(irFunction->name ? *irFunction->name : QString());
|
2012-12-13 11:09:04 +00:00
|
|
|
_irToVM.insert(irFunction, vmFunction);
|
|
|
|
|
2012-12-11 09:03:40 +00:00
|
|
|
vmFunction->hasDirectEval = irFunction->hasDirectEval;
|
|
|
|
vmFunction->isStrict = irFunction->isStrict;
|
|
|
|
|
|
|
|
foreach (const QString *formal, irFunction->formals)
|
|
|
|
if (formal)
|
|
|
|
vmFunction->formals.append(*formal);
|
|
|
|
foreach (const QString *local, irFunction->locals)
|
|
|
|
if (local)
|
|
|
|
vmFunction->locals.append(*local);
|
|
|
|
|
2012-12-13 11:09:04 +00:00
|
|
|
foreach (IR::Function *function, irFunction->nestedFunctions)
|
|
|
|
vmFunction->nestedFunctions.append(createFunctionMapping(engine, function));
|
|
|
|
|
2012-12-11 09:03:40 +00:00
|
|
|
if (engine->debugger)
|
|
|
|
engine->debugger->mapFunction(vmFunction, irFunction);
|
|
|
|
|
|
|
|
return vmFunction;
|
|
|
|
}
|
2012-12-13 11:09:04 +00:00
|
|
|
|
|
|
|
VM::Function *EvalInstructionSelection::vmFunction(IR::Function *f) {
|
|
|
|
VM::Function *function = _irToVM[f];
|
|
|
|
if (!function->code)
|
|
|
|
run(function, f);
|
|
|
|
return function;
|
|
|
|
}
|