YJIT: Only enable disassembly colors for tty (#12283)
* YJIT: Use fully-qualified name for OPTIONS in get_options! * YJIT: Only enable disassembly colors for tty
This commit is contained in:
parent
b11287706f
commit
8010d79bb4
Notes:
git
2024-12-09 15:36:38 +00:00
Merged-By: maximecb <maximecb@ruby-lang.org>
@ -7,6 +7,37 @@ use crate::options::DumpDisasm;
|
|||||||
|
|
||||||
use std::fmt::Write;
|
use std::fmt::Write;
|
||||||
|
|
||||||
|
#[derive(Copy, Clone, Debug)]
|
||||||
|
pub struct TerminalColor {
|
||||||
|
pub blue_begin: &'static str,
|
||||||
|
pub blue_end: &'static str,
|
||||||
|
pub bold_begin: &'static str,
|
||||||
|
pub bold_end: &'static str,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub static TTY_TERMINAL_COLOR: TerminalColor = TerminalColor {
|
||||||
|
blue_begin: "\x1b[34m",
|
||||||
|
blue_end: "\x1b[0m",
|
||||||
|
bold_begin: "\x1b[1m",
|
||||||
|
bold_end: "\x1b[22m",
|
||||||
|
};
|
||||||
|
|
||||||
|
pub static NON_TTY_TERMINAL_COLOR: TerminalColor = TerminalColor {
|
||||||
|
blue_begin: "",
|
||||||
|
blue_end: "",
|
||||||
|
bold_begin: "",
|
||||||
|
bold_end: "",
|
||||||
|
};
|
||||||
|
|
||||||
|
/// Terminal escape codes for colors, font weight, etc. Only enabled if stdout is a TTY.
|
||||||
|
pub fn get_colors() -> &'static TerminalColor {
|
||||||
|
if crate::utils::stdout_supports_colors() {
|
||||||
|
&TTY_TERMINAL_COLOR
|
||||||
|
} else {
|
||||||
|
&NON_TTY_TERMINAL_COLOR
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Primitive called in yjit.rb
|
/// Primitive called in yjit.rb
|
||||||
/// Produce a string representing the disassembly for an ISEQ
|
/// Produce a string representing the disassembly for an ISEQ
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
@ -158,6 +189,7 @@ pub fn disasm_addr_range(cb: &CodeBlock, start_addr: usize, end_addr: usize) ->
|
|||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
let start_addr = 0;
|
let start_addr = 0;
|
||||||
let insns = cs.disasm_all(code_slice, start_addr as u64).unwrap();
|
let insns = cs.disasm_all(code_slice, start_addr as u64).unwrap();
|
||||||
|
let colors = get_colors();
|
||||||
|
|
||||||
// For each instruction in this block
|
// For each instruction in this block
|
||||||
for insn in insns.as_ref() {
|
for insn in insns.as_ref() {
|
||||||
@ -165,17 +197,17 @@ pub fn disasm_addr_range(cb: &CodeBlock, start_addr: usize, end_addr: usize) ->
|
|||||||
if let Some(comment_list) = cb.comments_at(insn.address() as usize) {
|
if let Some(comment_list) = cb.comments_at(insn.address() as usize) {
|
||||||
for comment in comment_list {
|
for comment in comment_list {
|
||||||
if cb.outlined {
|
if cb.outlined {
|
||||||
write!(&mut out, "\x1b[34m").unwrap(); // Make outlined code blue
|
write!(&mut out, "{}", colors.blue_begin).unwrap(); // Make outlined code blue
|
||||||
}
|
}
|
||||||
writeln!(&mut out, " \x1b[1m# {comment}\x1b[22m").unwrap(); // Make comments bold
|
writeln!(&mut out, " {}# {comment}{}", colors.bold_begin, colors.bold_end).unwrap(); // Make comments bold
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if cb.outlined {
|
if cb.outlined {
|
||||||
write!(&mut out, "\x1b[34m").unwrap(); // Make outlined code blue
|
write!(&mut out, "{}", colors.blue_begin).unwrap(); // Make outlined code blue
|
||||||
}
|
}
|
||||||
writeln!(&mut out, " {insn}").unwrap();
|
writeln!(&mut out, " {insn}").unwrap();
|
||||||
if cb.outlined {
|
if cb.outlined {
|
||||||
write!(&mut out, "\x1b[0m").unwrap(); // Disable blue
|
write!(&mut out, "{}", colors.blue_end).unwrap(); // Disable blue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -188,6 +220,7 @@ pub fn disasm_addr_range(cb: &CodeBlock, start_addr: usize, end_addr: usize) ->
|
|||||||
let mut out = String::new();
|
let mut out = String::new();
|
||||||
let mut line_byte_idx = 0;
|
let mut line_byte_idx = 0;
|
||||||
const MAX_BYTES_PER_LINE: usize = 16;
|
const MAX_BYTES_PER_LINE: usize = 16;
|
||||||
|
let colors = get_colors();
|
||||||
|
|
||||||
for addr in start_addr..end_addr {
|
for addr in start_addr..end_addr {
|
||||||
if let Some(comment_list) = cb.comments_at(addr) {
|
if let Some(comment_list) = cb.comments_at(addr) {
|
||||||
@ -197,7 +230,7 @@ pub fn disasm_addr_range(cb: &CodeBlock, start_addr: usize, end_addr: usize) ->
|
|||||||
line_byte_idx = 0;
|
line_byte_idx = 0;
|
||||||
}
|
}
|
||||||
for comment in comment_list {
|
for comment in comment_list {
|
||||||
writeln!(&mut out, " \x1b[1m# {comment}\x1b[22m").unwrap(); // Make comments bold
|
writeln!(&mut out, " {}# {comment}{}", colors.bold_begin, colors.bold_end).unwrap(); // Make comments bold
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if line_byte_idx == 0 {
|
if line_byte_idx == 0 {
|
||||||
|
@ -173,7 +173,7 @@ macro_rules! get_option {
|
|||||||
{
|
{
|
||||||
// Make this a statement since attributes on expressions are experimental
|
// Make this a statement since attributes on expressions are experimental
|
||||||
#[allow(unused_unsafe)]
|
#[allow(unused_unsafe)]
|
||||||
let ret = unsafe { OPTIONS.$option_name };
|
let ret = unsafe { crate::options::OPTIONS.$option_name };
|
||||||
ret
|
ret
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
use crate::backend::ir::*;
|
use crate::backend::ir::*;
|
||||||
use crate::cruby::*;
|
use crate::cruby::*;
|
||||||
use std::slice;
|
use std::slice;
|
||||||
|
use std::os::raw::c_int;
|
||||||
|
|
||||||
/// Trait for casting to [usize] that allows you to say `.as_usize()`.
|
/// Trait for casting to [usize] that allows you to say `.as_usize()`.
|
||||||
/// Implementation conditional on the cast preserving the numeric value on
|
/// Implementation conditional on the cast preserving the numeric value on
|
||||||
@ -239,6 +240,14 @@ pub fn print_str(asm: &mut Assembler, str: &str) {
|
|||||||
asm.cpop_all();
|
asm.cpop_all();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn stdout_supports_colors() -> bool {
|
||||||
|
// TODO(max): Use std::io::IsTerminal after upgrading Rust to 1.70
|
||||||
|
extern "C" { fn isatty(fd: c_int) -> c_int; }
|
||||||
|
let stdout = 1;
|
||||||
|
let is_terminal = unsafe { isatty(stdout) } == 1;
|
||||||
|
is_terminal
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use super::*;
|
use super::*;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user