|
|
@ -4,6 +4,7 @@ const fs = require("fs");
|
|
|
|
const assert = require("assert");
|
|
|
|
const assert = require("assert");
|
|
|
|
|
|
|
|
|
|
|
|
const transpile = require("./src/transpile");
|
|
|
|
const transpile = require("./src/transpile");
|
|
|
|
|
|
|
|
const measureTime = require("./src/astformer/util/measure-time");
|
|
|
|
|
|
|
|
|
|
|
|
assert(process.argv[2] != null);
|
|
|
|
assert(process.argv[2] != null);
|
|
|
|
|
|
|
|
|
|
|
@ -12,13 +13,34 @@ const nixFile = fs.readFileSync(nixFilePath, "utf8");
|
|
|
|
|
|
|
|
|
|
|
|
let transpiled = transpile(nixFile);
|
|
|
|
let transpiled = transpile(nixFile);
|
|
|
|
|
|
|
|
|
|
|
|
console.log("-- EVALUATION RESULT:");
|
|
|
|
const api = {
|
|
|
|
|
|
|
|
|
|
|
|
console.log(eval(transpiled)({
|
|
|
|
|
|
|
|
builtins: {},
|
|
|
|
builtins: {},
|
|
|
|
$$jsNix$extend: function (base, props) {
|
|
|
|
$$jsNix$memoize: function (func) {
|
|
|
|
let newObject = Object.create(base);
|
|
|
|
let isCalled = false;
|
|
|
|
Object.assign(newObject, props);
|
|
|
|
let storedResult;
|
|
|
|
return newObject;
|
|
|
|
|
|
|
|
|
|
|
|
return function (arg) {
|
|
|
|
|
|
|
|
if (isCalled === false) {
|
|
|
|
|
|
|
|
storedResult = func(arg);
|
|
|
|
|
|
|
|
isCalled = true;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return storedResult;
|
|
|
|
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}));
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: Switch to Node `vm` API instead, and check whether there's a polyfill for it for non-Node environments, build a custom one if not
|
|
|
|
|
|
|
|
const context = { module: {}, exports: {} };
|
|
|
|
|
|
|
|
context.module.exports = exports;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
new Function("module", transpiled)(context.module);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
console.log("-- EVALUATION RESULT:");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// Warm-up for hot VM performance testing
|
|
|
|
|
|
|
|
// for (let i = 0; i < 10000; i++) {
|
|
|
|
|
|
|
|
// context.module.exports(api);
|
|
|
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
console.log(measureTime(() => context.module.exports(api)));
|
|
|
|