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