instructions/
instructions.rs1use 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 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 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}