instructions/
instructions.rs

1use rjvm::bytecode::attributes::Attribute;
2use rjvm::bytecode::pool::ConstantPool;
3use rjvm::bytecode::reader::containers::read_classfile;
4use rjvm::bytecode::reader::BufferedReader;
5use rjvm::decoder::instructions::parse_instruction;
6
7fn main() {
8    let input = include_bytes!("./testdata/org/example/Simple.class");
9    let mut buffer = BufferedReader::new(input);
10    let mut constant_pool = ConstantPool::new();
11    let cf = read_classfile(&mut buffer, &mut constant_pool).unwrap();
12
13    println!("Class: {}", constant_pool.text_of(cf.this_class).unwrap());
14    // print all methods and their instructions
15    cf.methods.iter().for_each(|method| {
16        let attr = method
17            .attributes
18            .iter()
19            .find(|attr| matches!(attr, Attribute::Code(_)));
20        println!("Name: {}()", method.name);
21
22        let code = if let Attribute::Code(code) = attr.unwrap() {
23            code
24        } else {
25            panic!("Code attribute not found");
26        };
27
28        // create a new buffer that contains just the code and nothing else...
29        let mut code_reader = BufferedReader::new(&code.code);
30        while !code_reader.has_remaining_data() {
31            let opcode = code_reader.take::<u8>().unwrap();
32            let instr =
33                parse_instruction(opcode, &mut code_reader).expect("instruction should be parsed");
34            println!("  0x{opcode:02x}: {}", instr);
35        }
36        println!();
37    });
38}