summaryrefslogtreecommitdiffstats
path: root/third_party/rust/jsparagus-emitter/src/dis.rs
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
}