about summary refs log tree commit diff
diff options
context:
space:
mode:
authorVincent Ambo <mail@tazj.in>2022-09-04T15·53+0300
committertazjin <tazjin@tvl.su>2022-09-09T21·10+0000
commitcbf2d2d29293af56d60fa7e04ee1969c18b9845f (patch)
tree2958af3ff31f27791632956641c5f6bcec6d72a1
parent3cf5c402091d1e10c26fddf6764f572495f38899 (diff)
refactor(tvix/eval): move `disassemble_op` to the Chunk structure r/4777
Change-Id: Ic6710c609ed647bfa47d673aaf22c4da96c0f319
Reviewed-on: https://cl.tvl.fyi/c/depot/+/6451
Reviewed-by: sterni <sternenseemann@systemli.org>
Tested-by: BuildkiteCI
-rw-r--r--tvix/eval/src/chunk.rs31
-rw-r--r--tvix/eval/src/disassembler.rs28
-rw-r--r--tvix/eval/src/observer.rs3
3 files changed, 33 insertions, 29 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(())
+    }
 }
diff --git a/tvix/eval/src/disassembler.rs b/tvix/eval/src/disassembler.rs
index d7c9c8895c2e..51d39c3910a1 100644
--- a/tvix/eval/src/disassembler.rs
+++ b/tvix/eval/src/disassembler.rs
@@ -1,12 +1,10 @@
 //! Implements methods for disassembling and printing a representation
 //! of compiled code, as well as tracing the runtime stack during
 //! execution.
-use codemap::CodeMap;
 use std::io::{Stderr, Write};
 use tabwriter::TabWriter;
 
-use crate::chunk::Chunk;
-use crate::opcode::{CodeIdx, OpCode};
+use crate::opcode::OpCode;
 use crate::value::Value;
 
 /// Helper struct to trace runtime values and automatically flush the
@@ -41,27 +39,3 @@ impl Drop for Tracer {
         let _ = self.0.flush();
     }
 }
-
-pub fn disassemble_op<W: Write>(
-    tw: &mut W,
-    codemap: &CodeMap,
-    chunk: &Chunk,
-    width: usize,
-    idx: CodeIdx,
-) {
-    let _ = write!(tw, "{:#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 = chunk.get_line(codemap, idx);
-    if idx.0 > 0 && chunk.get_line(codemap, CodeIdx(idx.0 - 1)) == line {
-        write!(tw, "   |\t").unwrap();
-    } else {
-        write!(tw, "{:4}\t", line).unwrap();
-    }
-
-    let _ = match chunk[idx] {
-        OpCode::OpConstant(idx) => writeln!(tw, "OpConstant({}@{})", chunk[idx], idx.0),
-        op => writeln!(tw, "{:?}", op),
-    };
-}
diff --git a/tvix/eval/src/observer.rs b/tvix/eval/src/observer.rs
index 5aeb344ee954..62312a74ad36 100644
--- a/tvix/eval/src/observer.rs
+++ b/tvix/eval/src/observer.rs
@@ -10,7 +10,6 @@ use std::rc::Rc;
 use tabwriter::TabWriter;
 
 use crate::chunk::Chunk;
-use crate::disassembler::disassemble_op;
 use crate::opcode::CodeIdx;
 use crate::value::Lambda;
 
@@ -72,7 +71,7 @@ impl<W: Write> DisassemblingObserver<W> {
         let width = format!("{:#x}", chunk.code.len() - 1).len();
 
         for (idx, _) in chunk.code.iter().enumerate() {
-            disassemble_op(&mut self.writer, &self.codemap, chunk, width, CodeIdx(idx));
+            let _ = chunk.disassemble_op(&mut self.writer, &self.codemap, width, CodeIdx(idx));
         }
     }
 }