Tweak the chunk disassembly
This commit is contained in:
parent
2ad3440097
commit
8534f18c9a
@ -287,7 +287,7 @@ impl<'a> ChunkDisassembler<'a> {
|
|||||||
|
|
||||||
/// The default width of the disassembly output. To correctly align the output, this should be
|
/// The default width of the disassembly output. To correctly align the output, this should be
|
||||||
/// set to the width of the longest line that the disassembler is guaranteed to produce.
|
/// set to the width of the longest line that the disassembler is guaranteed to produce.
|
||||||
const DEFAULT_WIDTH: usize = Self::INSTRUCTION_HEADER[3].len() + 1;
|
const DEFAULT_WIDTH: usize = Self::INSTRUCTION_HEADER[4].len() + 1;
|
||||||
|
|
||||||
pub fn new(name: &'a str, chunk: &'a Chunk) -> Self {
|
pub fn new(name: &'a str, chunk: &'a Chunk) -> Self {
|
||||||
Self {
|
Self {
|
||||||
@ -308,11 +308,12 @@ impl<'a> ChunkDisassembler<'a> {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let name_line = style(center(&format!("{}", self.name)));
|
let mut disassembled = String::with_capacity(self.predict_length());
|
||||||
let mut disassembled = String::with_capacity(self.predict_capacity());
|
|
||||||
|
|
||||||
println!("capactity: {}", disassembled.capacity());
|
println!("capactity: {}", disassembled.capacity());
|
||||||
|
|
||||||
|
let name_line = style(center(self.name));
|
||||||
|
|
||||||
disassembled.push_str(&name_line);
|
disassembled.push_str(&name_line);
|
||||||
|
|
||||||
for line in Self::INSTRUCTION_HEADER {
|
for line in Self::INSTRUCTION_HEADER {
|
||||||
@ -345,7 +346,7 @@ impl<'a> ChunkDisassembler<'a> {
|
|||||||
let value_display = value_option
|
let value_display = value_option
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|value| value.to_string())
|
.map(|value| value.to_string())
|
||||||
.unwrap_or_else(|| "EMPTY".to_string());
|
.unwrap_or_else(|| "empty".to_string());
|
||||||
let constant_display = format!("{index:<5} {value_kind_display:<5} {value_display:<5}");
|
let constant_display = format!("{index:<5} {value_kind_display:<5} {value_display:<5}");
|
||||||
|
|
||||||
disassembled.push_str(¢er(&constant_display));
|
disassembled.push_str(¢er(&constant_display));
|
||||||
@ -367,7 +368,7 @@ impl<'a> ChunkDisassembler<'a> {
|
|||||||
let register_display = register_index
|
let register_display = register_index
|
||||||
.as_ref()
|
.as_ref()
|
||||||
.map(|value| value.to_string())
|
.map(|value| value.to_string())
|
||||||
.unwrap_or_else(|| "EMPTY".to_string());
|
.unwrap_or_else(|| "empty".to_string());
|
||||||
let identifier_display = identifier.as_str();
|
let identifier_display = identifier.as_str();
|
||||||
let local_display =
|
let local_display =
|
||||||
format!("{index:<5} {identifier_display:<10} {depth:<5} {register_display:<8}");
|
format!("{index:<5} {identifier_display:<10} {depth:<5} {register_display:<8}");
|
||||||
@ -400,19 +401,20 @@ impl<'a> ChunkDisassembler<'a> {
|
|||||||
/// - Get the number of dynamic lines, i.e. lines that are generated from the chunk
|
/// - Get the number of dynamic lines, i.e. lines that are generated from the chunk
|
||||||
/// - Add 1 to the width to account for the newline character
|
/// - Add 1 to the width to account for the newline character
|
||||||
/// - Multiply the total number of lines by the width of the disassembly output
|
/// - Multiply the total number of lines by the width of the disassembly output
|
||||||
fn predict_capacity(&self) -> usize {
|
///
|
||||||
const EXTRA_LINES: usize = 1;
|
/// The result is accurate only if the output is not styled. Otherwise the extra bytes added by
|
||||||
|
/// the ANSI escape codes will make the result too low. It still works as a lower bound in that
|
||||||
|
/// case.
|
||||||
|
fn predict_length(&self) -> usize {
|
||||||
|
const EXTRA_LINES: usize = 1; // There is one empty line after the name of the chunk
|
||||||
|
|
||||||
let chunk_header_line_count = 3; // self.chunk_header().len() is hard-coded to 3
|
let static_line_count =
|
||||||
let static_line_count = chunk_header_line_count
|
Self::INSTRUCTION_HEADER.len() + Self::CONSTANT_HEADER.len() + Self::LOCAL_HEADER.len();
|
||||||
+ Self::INSTRUCTION_HEADER.len()
|
|
||||||
+ Self::CONSTANT_HEADER.len()
|
|
||||||
+ Self::LOCAL_HEADER.len();
|
|
||||||
let dynamic_line_count =
|
let dynamic_line_count =
|
||||||
self.chunk.instructions.len() + self.chunk.constants.len() + self.chunk.locals.len();
|
self.chunk.instructions.len() + self.chunk.constants.len() + self.chunk.locals.len();
|
||||||
let total_line_count = static_line_count + dynamic_line_count + EXTRA_LINES;
|
let total_line_count = static_line_count + dynamic_line_count + EXTRA_LINES;
|
||||||
|
|
||||||
total_line_count * (self.width)
|
total_line_count * (self.width + 1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user