mirror of
https://github.com/rizinorg/jsdec.git
synced 2026-11-09 12:51:24 -10:00
168 lines
6.5 KiB
JavaScript
168 lines
6.5 KiB
JavaScript
// SPDX-FileCopyrightText: 2018-2023 Giovanni Dante Grazioli <[email protected]>
|
|
// SPDX-License-Identifier: BSD-3-Clause
|
|
|
|
import Extra from './extra.js';
|
|
var __debug = false;
|
|
|
|
function _print_locals(locals, address, spaced) {
|
|
if (Global().evars.honor.blocks) {
|
|
return;
|
|
}
|
|
var a = Global().printer.auto;
|
|
for (var i = 0; i < locals.length; i++) {
|
|
var local = Extra.is.string(locals[i]) ? a(locals[i]) : locals[i].toString(true);
|
|
Global().context.printLine(Global().context.identfy() + local + ';', address);
|
|
}
|
|
if (spaced && locals.length > 0) {
|
|
Global().context.printLine(Global().context.identfy(), address);
|
|
}
|
|
}
|
|
|
|
function _print_block_data(block) {
|
|
if (Global().evars.honor.blocks) {
|
|
var t = Global().printer.theme;
|
|
var ident = Global().context.identfy();
|
|
var addr = block.address.toString(16);
|
|
Global().context.printLine(ident + t.comment('/* address 0x' + addr + ' */'), block.address);
|
|
}
|
|
}
|
|
|
|
export default {
|
|
brace: function(address) {
|
|
this.address = address;
|
|
this.toString = function() {
|
|
return '}' + (__debug ? Global().printer.theme.comment(' // 0x' + this.address.toString(16)) : '');
|
|
};
|
|
this.print = function() {
|
|
Global().context.identOut();
|
|
var offset = Global().evars.honor.offsets ? Extra.align_address(this.address) : '';
|
|
Global().context.printLine(Global().context.identfy(offset.length, Global().printer.theme.integers(offset)) + this.toString(), this.address);
|
|
};
|
|
},
|
|
custom: function(address, colorname) {
|
|
this.address = address;
|
|
this.colorname = colorname;
|
|
this.toString = function() {
|
|
return this.colorname + ' {' + (__debug ? Global().printer.theme.comment(' // 0x' + this.address.toString(16)) : '');
|
|
};
|
|
this.print = function() {
|
|
var offset = Global().evars.honor.offsets ? Extra.align_address(this.address) : '';
|
|
Global().context.printLine(Global().context.identfy(offset.length, Global().printer.theme.integers(offset)) + this.toString(), this.address);
|
|
Global().context.identIn();
|
|
_print_block_data(this);
|
|
};
|
|
},
|
|
routine: function(address, extra) {
|
|
this.address = address;
|
|
this.extra = extra;
|
|
this.toString = function() {
|
|
var e = this.extra;
|
|
var t = Global().printer.theme;
|
|
var a = Global().printer.auto;
|
|
return t.types(e.returns) + ' ' + t.callname(e.routine_name) + ' (' + e.args.map(function(x) {
|
|
return Extra.is.string(x) ? a(x) : x.toString(true);
|
|
}).join(', ') + ') {' + (__debug ? t.comment(' // 0x' + this.address.toString(16)) : '');
|
|
};
|
|
this.print = function() {
|
|
var e = this.extra;
|
|
var t = Global().printer.theme;
|
|
_print_locals(e.globals, this.address, true);
|
|
var asmname = Global().evars.honor.offsets ? Extra.align_address(this.address) : '; (fcn) ' + e.name + ' ()';
|
|
var color = Global().evars.honor.offsets ? 'integers' : 'comment';
|
|
var ident = Global().context.identfy(asmname.length, t[color](asmname));
|
|
Global().context.printLine(ident + this.toString(), this.address);
|
|
Global().context.identIn();
|
|
_print_block_data(this);
|
|
_print_locals(e.locals, this.address);
|
|
};
|
|
},
|
|
if: function(address, condition, locals) {
|
|
this.address = address;
|
|
this.condition = condition;
|
|
this.locals = locals || [];
|
|
this.toString = function() {
|
|
var t = Global().printer.theme;
|
|
return t.flow('if') + ' (' + this.condition + ') {' + (__debug ? t.comment(' // 0x' + this.address.toString(16)) : '');
|
|
};
|
|
this.print = function() {
|
|
var offset = Global().evars.honor.offsets ? Extra.align_address(this.address) : '';
|
|
Global().context.printLine(Global().context.identfy(offset.length, Global().printer.theme.integers(offset)) + this.toString(), this.address);
|
|
Global().context.identIn();
|
|
_print_block_data(this);
|
|
_print_locals(this.locals, this.address);
|
|
};
|
|
},
|
|
else: function(address, locals) {
|
|
this.isElse = true;
|
|
this.address = address;
|
|
this.locals = locals || [];
|
|
this.toString = function() {
|
|
var t = Global().printer.theme;
|
|
return '} ' + t.flow('else') + ' {' + (__debug ? t.comment(' // 0x' + this.address.toString(16)) : '');
|
|
};
|
|
this.print = function() {
|
|
Global().context.identOut();
|
|
var offset = Global().evars.honor.offsets ? Extra.align_address(this.address) : '';
|
|
Global().context.printLine(Global().context.identfy(offset.length, Global().printer.theme.integers(offset)) + this.toString(), this.address);
|
|
Global().context.identIn();
|
|
_print_block_data(this);
|
|
_print_locals(this.locals, this.address);
|
|
};
|
|
},
|
|
do: function(address, locals) {
|
|
this.address = address;
|
|
this.locals = locals || [];
|
|
this.toString = function() {
|
|
var t = Global().printer.theme;
|
|
return t.flow('do') + ' {' + (__debug ? t.comment(' // 0x' + this.address.toString(16)) : '');
|
|
};
|
|
this.print = function() {
|
|
Global().context.printLine(Global().context.identfy() + this.toString(), this.address);
|
|
Global().context.identIn();
|
|
_print_block_data(this);
|
|
_print_locals(this.locals, this.address);
|
|
};
|
|
},
|
|
while: function(address, condition, locals) {
|
|
this.address = address;
|
|
this.condition = condition;
|
|
this.locals = locals || [];
|
|
this.toString = function() {
|
|
var t = Global().printer.theme;
|
|
return t.flow('while') + ' (' + this.condition + ') {' + (__debug ? t.comment(' // 0x' + this.address.toString(16)) : '');
|
|
};
|
|
this.print = function() {
|
|
var offset = Global().evars.honor.offsets ? Extra.align_address(this.address) : '';
|
|
Global().context.printLine(Global().context.identfy(offset.length, Global().printer.theme.integers(offset)) + this.toString(), this.address);
|
|
Global().context.identIn();
|
|
_print_block_data(this);
|
|
_print_locals(this.locals, this.address);
|
|
};
|
|
},
|
|
whileEnd: function(address, condition) {
|
|
this.address = address;
|
|
this.condition = condition;
|
|
this.toString = function() {
|
|
var t = Global().printer.theme;
|
|
return '} ' + t.flow('while') + ' (' + this.condition + ');' + (__debug ? t.comment(' // 0x' + this.address.toString(16)) : '');
|
|
};
|
|
this.print = function() {
|
|
Global().context.identOut();
|
|
Global().context.printLine(Global().context.identfy() + this.toString(), this.address);
|
|
};
|
|
},
|
|
whileInline: function(address, condition) {
|
|
this.address = address;
|
|
this.condition = condition;
|
|
this.toString = function() {
|
|
var t = Global().printer.theme;
|
|
return t.flow('while') + ' (' + this.condition + ');' + (__debug ? t.comment(' // 0x' + this.address.toString(16)) : '');
|
|
};
|
|
this.print = function() {
|
|
_print_block_data(this);
|
|
var offset = Global().evars.honor.offsets ? Extra.align_address(this.address) : '';
|
|
Global().context.printLine(Global().context.identfy(offset.length, Global().printer.theme.integers(offset)) + this.toString(), this.address);
|
|
};
|
|
}
|
|
};
|