js-slang
Version:
Javascript-based implementations of Source, written in Typescript
182 lines • 7.42 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.stringifyProgram = exports.getName = void 0;
const opcodes_1 = require("./opcodes");
const OPCODES_STR = {
[ ]: 'NOP ',
[ ]: 'LDCI ',
[ ]: 'LGCI ',
[ ]: 'LDCF32',
[ ]: 'LGCF32',
[ ]: 'LDCF64',
[ ]: 'LGCF64',
[ ]: 'LDCB0 ',
[ ]: 'LDCB1 ',
[ ]: 'LGCB0 ',
[ ]: 'LGCB1 ',
[ ]: 'LGCU ',
[ ]: 'LGCN ',
[ ]: 'LGCS ',
[ ]: 'POPG ',
[ ]: 'POPB ',
[ ]: 'POPF ',
[ ]: 'ADDG ',
[ ]: 'ADDF ',
[ ]: 'SUBG ',
[ ]: 'SUBF ',
[ ]: 'MULG ',
[ ]: 'MULF ',
[ ]: 'DIVG ',
[ ]: 'DIVF ',
[ ]: 'MODG ',
[ ]: 'MODF ',
[ ]: 'NEGG ',
[ ]: 'NEGF ',
[ ]: 'NOTG ',
[ ]: 'NOTB ',
[ ]: 'LTG ',
[ ]: 'LTF ',
[ ]: 'GTG ',
[ ]: 'GTF ',
[ ]: 'LEG ',
[ ]: 'LEF ',
[ ]: 'GEG ',
[ ]: 'GEF ',
[ ]: 'EQG ',
[ ]: 'EQF ',
[ ]: 'EQB ',
[ ]: 'NEQG ',
[ ]: 'NEQF ',
[ ]: 'NEQB ',
[ ]: 'NEWC ',
[ ]: 'NEWA ',
[ ]: 'LDLG ',
[ ]: 'LDLF ',
[ ]: 'LDLB ',
[ ]: 'STLG ',
[ ]: 'STLB ',
[ ]: 'STLF ',
[ ]: 'LDPG ',
[ ]: 'LDPF ',
[ ]: 'LDPB ',
[ ]: 'STPG ',
[ ]: 'STPB ',
[ ]: 'STPF ',
[ ]: 'LDAG ',
[ ]: 'LDAB ',
[ ]: 'LDAF ',
[ ]: 'STAG ',
[ ]: 'STAB ',
[ ]: 'STAF ',
[ ]: 'BRT ',
[ ]: 'BRF ',
[ ]: 'BR ',
[ ]: 'JMP ',
[ ]: 'CALL ',
[ ]: 'CALLT ',
[ ]: 'CALLP ',
[ ]: 'CALLTP',
[ ]: 'CALLV ',
[ ]: 'CALLTV',
[ ]: 'RETG ',
[ ]: 'RETF ',
[ ]: 'RETB ',
[ ]: 'RETU ',
[ ]: 'RETN ',
[ ]: 'DUP ',
[ ]: 'NEWENV',
[ ]: 'POPENV',
[ ]: 'NEWCP ',
[ ]: 'NEWCV ',
[ ]: 'NEGG ',
[ ]: 'NEGF ',
[ ]: 'NEQG ',
[ ]: 'NEQF ',
[ ]: 'NEQB ',
// custom opcodes
[ ]: 'ARR_LEN',
[ ]: 'DISPLAY',
[ ]: 'DRAW_DATA',
[ ]: 'ERROR',
[ ]: 'IS_ARRAY',
[ ]: 'IS_BOOL',
[ ]: 'IS_FUNC',
[ ]: 'IS_NULL',
[ ]: 'IS_NUM',
[ ]: 'IS_STR',
[ ]: 'IS_UNDEF',
[ ]: 'MATH_ABS',
[ ]: 'MATH_ACOS',
[ ]: 'MATH_ACOSH',
[ ]: 'MATH_ASINH',
[ ]: 'MATH_ATAN',
[ ]: 'MATH_ATAN2',
[ ]: 'MATH_ATANH',
[ ]: 'MATH_CBRT',
[ ]: 'MATH_CEIL',
[ ]: 'MATH_CLZ32',
[ ]: 'MATH_COS',
[ ]: 'MATH_COSH',
[ ]: 'MATH_EXP',
[ ]: 'MATH_EXPM1',
[ ]: 'MATH_FLOOR',
[ ]: 'MATH_FROUND',
[ ]: 'MATH_HYPOT',
[ ]: 'MATH_IMUL',
[ ]: 'MATH_LOG',
[ ]: 'MATH_LOG1P',
[ ]: 'MATH_LOG2',
[ ]: 'MATH_LOG10',
[ ]: 'MATH_MAX',
[ ]: 'MATH_MIN',
[ ]: 'MATH_POW',
[ ]: 'MATH_RANDOM',
[ ]: 'MATH_ROUND',
[ ]: 'MATH_SIGN',
[ ]: 'MATH_SIN',
[ ]: 'MATH_SINH',
[ ]: 'MATH_SQRT',
[ ]: 'MATH_TAN',
[ ]: 'MATH_TANH',
[ ]: 'MATH_TRUNC',
[ ]: 'PARSE_INT',
[ ]: 'RUNTIME',
[ ]: 'STREAM',
[ ]: 'STRINGIFY',
[ ]: 'PROMPT',
[ ]: 'DISPLAY_LIST',
[ ]: 'CHAR_AT',
[ ]: 'ARITY',
// Concurrency Opcodes
[ ]: 'EXEC ',
[ ]: 'T&S ',
[ ]: 'CLEAR '
};
// get name of opcode for debugging
function getName(op) {
return OPCODES_STR[op]; // need to add guard in case op does not exist
}
exports.getName = getName;
// pretty-print the program
function stringifyProgram(P) {
const functions = P[1];
let programStr = '';
programStr += 'Entry function: ' + P[0] + '\n';
for (let i = 0; i < functions.length; i++) {
const f = functions[i];
let s = '#' + i + ':\nStack Size: ' + f[0] + '\nEnv Size: ' + f[1] + '\nNum Args: ' + f[2] + '\n';
for (let j = 0; j < f[3].length; j++) {
s += j;
const ins = f[3][j];
s += ': ' + getName(ins[0]);
for (let k = 1; k < ins.length; k++) {
s += ' ' + ins[k];
}
s += '\n';
}
programStr += s + '\n';
}
return programStr;
}
exports.stringifyProgram = stringifyProgram;
//# sourceMappingURL=util.js.map