From a651dd81ff72d5155b122ce99e9252d6e714cc1e Mon Sep 17 00:00:00 2001 From: rose <47357290+rose4096@users.noreply.github.com> Date: Wed, 22 Jun 2022 13:37:21 -0400 Subject: Rust API: Change instruction_text to use Vec<> --- rust/src/architecture.rs | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) (limited to 'rust/src/architecture.rs') diff --git a/rust/src/architecture.rs b/rust/src/architecture.rs index b8e40c5b..0f364b86 100644 --- a/rust/src/architecture.rs +++ b/rust/src/architecture.rs @@ -288,7 +288,7 @@ pub trait Architecture: 'static + Sized + AsRef { &self, data: &[u8], addr: u64, - ) -> Option<(usize, Array)>; + ) -> Option<(usize, Vec)>; fn instruction_llil( &self, data: &[u8], @@ -752,7 +752,7 @@ impl Architecture for CoreArchitecture { &self, data: &[u8], addr: u64, - ) -> Option<(usize, Array)> { + ) -> Option<(usize, Vec)> { let mut consumed = data.len(); let mut count: usize = 0; let mut result: *mut BNInstructionTextToken = ptr::null_mut(); @@ -766,7 +766,11 @@ impl Architecture for CoreArchitecture { &mut result as *mut _, &mut count as *mut _, ) { - Some((consumed, Array::new(result, count, ()))) + let vec = Vec::::from_raw_parts(result, count, count) + .iter() + .map(|x| InstructionTextToken::from_raw(x)) + .collect(); + Some((consumed, vec)) } else { None } @@ -1233,10 +1237,14 @@ where let result = unsafe { &mut *result }; match custom_arch.instruction_text(data, addr) { - Some((res_size, res_tokens)) => { + Some((res_size, mut res_tokens)) => { unsafe { - let (r_ptr, r_count) = res_tokens.into_raw_parts(); - *result = r_ptr; + // TODO: Can't use into_raw_parts as it's unstable so we do this instead... + let r_ptr = res_tokens.as_mut_ptr(); + let r_count = res_tokens.len(); + mem::forget(res_tokens); + + *result = &mut (*r_ptr).0; *count = r_count; *len = res_size; } -- cgit v1.3.1