assemblyscript/tests/compiler.js

117 lines
4.0 KiB
JavaScript
Raw Normal View History

var fs = require("fs");
var path = require("path");
var chalk = require("chalk");
var glob = require("glob");
var diff = require("./util/diff");
require("ts-node").register({ project: require("path").join(__dirname, "..", "src") });
require("../src/glue/js");
var Compiler = require("../src/compiler").Compiler;
var Module = require("../src/module").Module;
var Parser = require("../src/parser").Parser;
var isCreate = process.argv[2] === "--create";
2017-12-16 02:27:39 +01:00
var filter = process.argv.length > 2 && !isCreate ? "**/" + process.argv[2] + ".ts" : "**/*.ts";
var stdFiles = glob.sync("*.ts", { cwd: __dirname + "/../std/assembly" });
glob.sync(filter, { cwd: __dirname + "/compiler" }).forEach(filename => {
2017-12-16 02:27:39 +01:00
if (filename.charAt(0) == "_")
return;
console.log(chalk.default.whiteBright("Testing compiler/" + filename));
2017-12-16 02:27:39 +01:00
var fixture = path.basename(filename, ".ts");
var parser = new Parser();
2017-12-16 02:27:39 +01:00
if (filename.startsWith("std/")) {
stdFiles.forEach(file => {
parser.parseFile(fs.readFileSync(__dirname + "/../std/assembly/" + file, { encoding: "utf8" }), "std:" + path.basename(file), false);
2017-12-16 02:27:39 +01:00
});
fixture = "std/" + fixture;
}
var sourceText = fs.readFileSync(__dirname + "/compiler/" + filename, { encoding: "utf8" });
parser.parseFile(sourceText, filename, true);
var nextFile;
while ((nextFile = parser.nextFile()) !== null) {
var nextSourceText;
try {
nextSourceText = fs.readFileSync(path.join(__dirname, "compiler", nextFile + ".ts"), { encoding: "utf8" });
} catch (e) {
nextSourceText = fs.readFileSync(path.join(__dirname, "compiler", nextFile, "index.ts"), { encoding: "utf8" });
}
parser.parseFile(nextSourceText, nextFile, false);
}
var program = parser.finish();
var module = Compiler.compile(program);
var actual = module.toText() + "(;\n[program.elements]\n " + iterate(program.elements.keys()).join("\n ") + "\n[program.exports]\n " + iterate(program.exports.keys()).join("\n ") + "\n;)\n";
var actualOptimized = null;
var actualInlined = null;
if (module.validate()) {
console.log(chalk.default.green("validate OK"));
try {
module.interpret();
console.log(chalk.default.green("interpret OK"));
} catch (e) {
process.exitCode = 1;
console.log(chalk.default.red("interpret ERROR"));
}
2017-12-04 16:26:34 +01:00
module.optimize();
actualOptimized = module.toText();
module.runPasses([ "inlining" ]);
actualInlined = module.toText();
2017-12-05 01:45:15 +01:00
} else {
process.exitCode = 1;
2017-12-04 16:26:34 +01:00
console.log(chalk.default.red("validate ERROR"));
2017-12-05 01:45:15 +01:00
}
if (isCreate) {
2017-12-16 02:27:39 +01:00
fs.writeFileSync(__dirname + "/compiler/" + fixture + ".wast", actual, { encoding: "utf8" });
console.log("Created");
2017-12-04 16:26:34 +01:00
if (actualOptimized != null) {
2017-12-16 02:27:39 +01:00
fs.writeFileSync(__dirname + "/compiler/" + fixture + ".optimized.wast", actualOptimized, { encoding: "utf8" });
2017-12-04 16:26:34 +01:00
console.log("Created optimized");
}
if (actualInlined != null) {
if (actualInlined != actualOptimized) {
2017-12-16 02:27:39 +01:00
fs.writeFileSync(__dirname + "/compiler/" + fixture + ".optimized-inlined.wast", actualInlined, { encoding: "utf8" });
console.log("Created optimized & inlined");
} else {
try {
2017-12-16 02:27:39 +01:00
fs.unlinkSync(__dirname + "/compiler/" + fixture + ".optimized-inlined.wast");
console.log("Deleted optimized & inlined");
} catch (e) {}
}
}
} else {
try {
2017-12-16 02:27:39 +01:00
var expected = fs.readFileSync(__dirname + "/compiler/" + fixture + ".wast", { encoding: "utf8" });
var diffs = diff(filename + ".wast", expected, actual);
if (diffs !== null) {
process.exitCode = 1;
console.log(diffs);
console.log(chalk.default.red("diff ERROR"));
} else {
console.log(chalk.default.green("diff OK"));
}
} catch (e) {
process.exitCode = 1;
console.log(e.message);
console.log(chalk.default.red("diff ERROR"));
}
}
module.dispose();
console.log();
});
function iterate(it) {
var current;
var arr = [];
while ((current = it.next()) && !current.done)
arr.push(current.value);
return arr;
}