js-slang
Version:
Javascript-based implementations of Source, written in Typescript
72 lines • 2.83 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
/* eslint-disable @typescript-eslint/no-unused-vars */
const astring_1 = require("astring");
const constants_1 = require("../constants");
const runtimeSourceError_1 = require("../errors/runtimeSourceError");
const parser_1 = require("../parser/parser");
const transpiler_1 = require("../transpiler/transpiler");
const create = require("../utils/ast/astCreator");
const uniqueIds_1 = require("../utils/uniqueIds");
const errors_1 = require("./errors");
const utils_1 = require("./utils");
function fullJSEval(code, nativeStorage) {
if (nativeStorage.evaller) {
return nativeStorage.evaller(code);
}
else {
return eval(code);
}
}
function preparePrelude(context) {
if (context.prelude === null) {
return [];
}
const prelude = context.prelude;
context.prelude = null;
const program = (0, parser_1.parse)(prelude, context);
if (program === null) {
return undefined;
}
return program.body;
}
function containsPrevEval(context) {
return context.nativeStorage.evaller != null;
}
const fullJSRunner = async (program, context) => {
// prelude & builtins
// only process builtins and preludes if it is a fresh eval context
const prelude = preparePrelude(context);
if (prelude === undefined) {
return utils_1.resolvedErrorPromise;
}
const preludeAndBuiltins = containsPrevEval(context)
? []
: [...(0, transpiler_1.getBuiltins)(context.nativeStorage), ...prelude];
// evaluate and create a separate block for preludes and builtins
const preEvalProgram = create.program([
...preludeAndBuiltins,
(0, transpiler_1.evallerReplacer)(create.identifier(constants_1.NATIVE_STORAGE_ID), new Set())
]);
(0, uniqueIds_1.getFunctionDeclarationNamesInProgram)(preEvalProgram).forEach(id => context.nativeStorage.previousProgramsIdentifiers.add(id));
(0, transpiler_1.getGloballyDeclaredIdentifiers)(preEvalProgram).forEach(id => context.nativeStorage.previousProgramsIdentifiers.add(id));
const preEvalCode = (0, astring_1.generate)(preEvalProgram);
fullJSEval(preEvalCode, context.nativeStorage);
let transpiled;
let sourceMapJson;
try {
;
({ transpiled, sourceMapJson } = (0, transpiler_1.transpile)(program, context));
return {
status: 'finished',
context,
value: fullJSEval(transpiled, context.nativeStorage)
};
}
catch (error) {
context.errors.push(error instanceof runtimeSourceError_1.RuntimeSourceError ? error : await (0, errors_1.toSourceError)(error, sourceMapJson));
return utils_1.resolvedErrorPromise;
}
};
exports.default = fullJSRunner;
//# sourceMappingURL=fullJSRunner.js.map
;