/** * @fileoverview Common intermediates shared amongst parts of the compiler. */ /** * An IntermediateScript describes a single script. * Scripts do not necessarily have hats. */ class IntermediateScript { constructor () { /** * The ID of the top block of this script. * @type {string} */ this.topBlockId = null; /** * List of nodes that make up this script. * @type {Array|null} */ this.stack = null; /** * Whether this script is a procedure. * @type {boolean} */ this.isProcedure = false; /** * This procedure's code, if any. * @type {string} */ this.procedureCode = ''; /** * List of names of arguments accepted by this function, if it is a procedure. * @type {string[]} */ this.arguments = []; /** * Whether this script should be run in warp mode. * @type {boolean} */ this.isWarp = false; /** * pm: Whether this script should use dangerous optimizations. * @type {boolean} */ this.isOptimized = false; /** * pm: An object containing stuff for optimization. * @type {object} */ this.optimizationUtil = {}; /** * Whether this script can `yield` * If false, this script will be compiled as a regular JavaScript function (function) * If true, this script will be compiled as a generator function (function*) * @type {boolean} */ this.yields = true; /** * Whether this script should use the "warp timer" * @type {boolean} */ this.warpTimer = false; /** * List of procedure IDs that this script needs. * @readonly */ this.dependedProcedures = []; /** * Cached result of compiling this script. * @type {Function|null} */ this.cachedCompileResult = null; /** * Whether the top block of this script is an executable hat. * @type {boolean} */ this.executableHat = false; } } /** * An IntermediateRepresentation contains scripts. */ class IntermediateRepresentation { constructor () { /** * The entry point of this IR. * @type {IntermediateScript} */ this.entry = null; /** * Maps procedure variants to their intermediate script. * @type {Object.} */ this.procedures = {}; } } module.exports = { IntermediateScript, IntermediateRepresentation };