diff options
Diffstat (limited to 'tvix/eval/src/chunk.rs')
-rw-r--r-- | tvix/eval/src/chunk.rs | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/tvix/eval/src/chunk.rs b/tvix/eval/src/chunk.rs index 4d653c2b22fa..a085da571660 100644 --- a/tvix/eval/src/chunk.rs +++ b/tvix/eval/src/chunk.rs @@ -1,5 +1,8 @@ +use std::io::Write; use std::ops::Index; +use codemap::CodeMap; + use crate::opcode::{CodeIdx, ConstantIdx, OpCode}; use crate::value::Value; @@ -97,4 +100,32 @@ impl Chunk { // real line numbers codemap.look_up_span(span).begin.line + 1 } + + /// Write the disassembler representation of the operation at + /// `idx` to the specified writer. + pub fn disassemble_op<W: Write>( + &self, + writer: &mut W, + codemap: &CodeMap, + width: usize, + idx: CodeIdx, + ) -> Result<(), std::io::Error> { + write!(writer, "{:#width$x}\t ", idx.0, width = width)?; + + // Print continuation character if the previous operation was at + // the same line, otherwise print the line. + let line = self.get_line(codemap, idx); + if idx.0 > 0 && self.get_line(codemap, CodeIdx(idx.0 - 1)) == line { + write!(writer, " |\t")?; + } else { + write!(writer, "{:4}\t", line)?; + } + + match self[idx] { + OpCode::OpConstant(idx) => writeln!(writer, "OpConstant({}@{})", self[idx], idx.0), + op => writeln!(writer, "{:?}", op), + }?; + + Ok(()) + } } |