rabbitizer/
opereand_type.rs1use crate::{instruction, operand_type_enum, utils};
5
6extern "C" {
7 fn RabbitizerOperandType_getBufferSize(
8 operand: operand_type_enum::OperandType,
9 instr: *const instruction::Instruction,
10 immOverrideLength: utils::SizeT,
11 ) -> utils::SizeT;
12
13 fn RabbitizerOperandType_disassemble(
14 operand: operand_type_enum::OperandType,
15 instr: *const instruction::Instruction,
16 dst: *mut core::ffi::c_char,
17 immOverride: *const core::ffi::c_char,
18 immOverrideLength: utils::SizeT,
19 ) -> utils::SizeT;
20}
21
22impl operand_type_enum::OperandType {
23 pub fn disassemble(
24 &self,
25 instr: &instruction::Instruction,
26 imm_override: Option<&str>,
27 ) -> String {
28 let (imm_override_ptr, imm_override_len) = utils::c_string_from_str(imm_override);
29
30 unsafe {
31 let buffer_size = RabbitizerOperandType_getBufferSize(*self, instr, imm_override_len);
32
33 let mut buffer: Vec<u8> = vec![0; buffer_size + 1];
34 let disassembled_size = RabbitizerOperandType_disassemble(
35 *self,
36 instr,
37 buffer.as_mut_ptr() as *mut core::ffi::c_char,
38 imm_override_ptr,
39 imm_override_len,
40 );
41 buffer.truncate(disassembled_size);
42
43 String::from_utf8(buffer).unwrap()
44 }
45 }
46}