1use super::api;
2use super::sys;
3pub use cxx::{CxxString, CxxVector};
4
5pub struct RustAssemblyEmit<'a>(pub &'a mut dyn api::AssemblyEmit);
6
7impl<'a> RustAssemblyEmit<'a> {
8 pub fn dump(&mut self, address: &sys::Address, mnemonic: &CxxString, body: &CxxString) {
9 self.0.dump(address, mnemonic, body);
10 }
11}
12
13pub struct RustLoadImage<'a>(pub &'a dyn api::LoadImage);
14
15impl<'a> RustLoadImage<'a> {
16 pub unsafe fn load_fill(
22 &self,
23 ptr: *mut u8,
24 len: i32,
25 addr: &sys::Address,
26 ) -> Result<(), String> {
27 let buffer = unsafe { std::slice::from_raw_parts_mut(ptr, len as usize) };
28 self.0.load_fill(buffer, addr)
29 }
30}
31
32pub struct RustPcodeEmit<'a>(pub &'a mut dyn api::PcodeEmit);
33
34impl<'a> RustPcodeEmit<'a> {
35 pub unsafe fn dump(
38 &mut self,
39 addr: &sys::Address,
40 op_code: sys::OpCode,
41 output: *mut sys::VarnodeData, inputs: &CxxVector<sys::VarnodeData>,
43 ) {
44 let output = if !output.is_null() {
45 unsafe { Some(&*output) }
46 } else {
47 None
48 };
49
50 self.0.dump(addr, op_code, output, inputs);
51 }
52}