UNPKG

js-slang

Version:

Javascript-based implementations of Source, written in Typescript

72 lines 2.83 kB
"use strict"; 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