blob: f9978b8d9c58471d894895a64eedffe25a3ff0ad (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
use std::convert::TryFrom;
use std::fmt::Write;
use stencil::opcode::Opcode;
/// Return a string form of the given bytecode.
pub fn dis(bc: &[u8]) -> String {
let mut result = String::new();
let mut iter = bc.iter();
let mut offset = 0;
loop {
let len = match iter.next() {
Some(byte) => match Opcode::try_from(*byte) {
Ok(op) => {
write!(&mut result, "{}", format!("{:05}: {:?}", offset, op)).unwrap();
offset = offset + op.instruction_length();
op.instruction_length()
}
Err(()) => {
write!(&mut result, "{}", byte).unwrap();
1
}
},
None => break,
};
for _ in 1..len {
write!(&mut result, " {}", iter.next().unwrap()).unwrap();
}
writeln!(&mut result).unwrap();
}
result
}
|