summaryrefslogtreecommitdiff
path: root/rust/src/architecture.rs
diff options
context:
space:
mode:
authorrose <47357290+rose4096@users.noreply.github.com>2022-06-22 13:37:21 -0400
committerrose <47357290+rose4096@users.noreply.github.com>2022-06-23 12:00:25 -0400
commita651dd81ff72d5155b122ce99e9252d6e714cc1e (patch)
treec343b19b77d286ff51356b1d11001a524682ac89 /rust/src/architecture.rs
parent6c6dc60787427789e4bc9e3a20cca304a8210e8d (diff)
Rust API: Change instruction_text to use Vec<>
Diffstat (limited to 'rust/src/architecture.rs')
-rw-r--r--rust/src/architecture.rs20
1 files changed, 14 insertions, 6 deletions
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<CoreArchitecture> {
&self,
data: &[u8],
addr: u64,
- ) -> Option<(usize, Array<InstructionTextToken>)>;
+ ) -> Option<(usize, Vec<InstructionTextToken>)>;
fn instruction_llil(
&self,
data: &[u8],
@@ -752,7 +752,7 @@ impl Architecture for CoreArchitecture {
&self,
data: &[u8],
addr: u64,
- ) -> Option<(usize, Array<InstructionTextToken>)> {
+ ) -> Option<(usize, Vec<InstructionTextToken>)> {
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::<BNInstructionTextToken>::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;
}