import { traverse, identifier, func, program as tProgram } from "@webassemblyjs/ast";
import { flatten } from "@webassemblyjs/helper-flatten-ast";
import { Module } from "./module";
export { kStart } from "./module";
export function toIR(ast) {
var program = {};
var funcTable = []; // flatten the ast first
// TODO(sven): do it in a single pass?
flatten(ast);
var module = new Module(ast);
traverse(ast, {
Start: function (_Start) {
function Start(_x) {
return _Start.apply(this, arguments);
}
Start.toString = function () {
return _Start.toString();
};
return Start;
}(function (_ref) {
var node = _ref.node;
var _module$emitStartFunc = module.emitStartFunc(parseInt(node.index.value)),
name = _module$emitStartFunc.name,
startAt = _module$emitStartFunc.startAt;
funcTable.push({
name: name,
startAt: startAt
});
}),
Func: function (_Func) {
function Func(_x2) {
return _Func.apply(this, arguments);
}
Func.toString = function () {
return _Func.toString();
};
return Func;
}(function (funcPath) {
module.beginFuncBody(funcPath.node);
traverse(funcPath.node, {
Instruction: function (_Instruction) {
function Instruction(_x3) {
return _Instruction.apply(this, arguments);
}
Instruction.toString = function () {
return _Instruction.toString();
};
return Instruction;
}(function (path) {
module.onFuncInstruction(path.node);
})
});
var _module$finalizeFunc = module.finalizeFunc(funcPath.node),
name = _module$finalizeFunc.name,
instructions = _module$finalizeFunc.instructions,
startAt = _module$finalizeFunc.startAt;
funcTable.push({
name: name,
startAt: startAt
});
instructions.forEach(function (instruction) {
program[instruction.offset] = instruction.node;
});
})
});
return {
// $FlowIgnore
funcTable: funcTable,
program: program
};
}
export function listOfInstructionsToIr(instrs) {
var program = {};
var funcTable = [];
var module = new Module(tProgram([]));
var fakeFunc = func(identifier("main"), [], instrs);
module.beginFuncBody(fakeFunc);
instrs.forEach(function (i) {
return module.onFuncInstruction(i);
});
var _module$finalizeFunc2 = module.finalizeFunc(fakeFunc),
name = _module$finalizeFunc2.name,
instructions = _module$finalizeFunc2.instructions,
startAt = _module$finalizeFunc2.startAt;
funcTable.push({
name: name,
startAt: startAt
});
instructions.forEach(function (instruction) {
program[instruction.offset] = instruction.node;
});
return {
// $FlowIgnore
funcTable: funcTable,
program: program
};
}
export * from "./printer"; |