From 9b0175bb0c116e22f00d6a3137c52b136be04bf7 Mon Sep 17 00:00:00 2001 From: Rubens Brandao Date: Thu, 11 Apr 2024 06:29:03 -0300 Subject: [PATCH 1/3] replace Vec with Box<[T]> where capacity eq to len --- rust/src/disassembly.rs | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/rust/src/disassembly.rs b/rust/src/disassembly.rs index f213fa0eb..65606ef63 100644 --- a/rust/src/disassembly.rs +++ b/rust/src/disassembly.rs @@ -307,10 +307,9 @@ impl std::fmt::Display for DisassemblyTextLine { } impl From> for DisassemblyTextLine { - fn from(mut tokens: Vec) -> Self { - tokens.shrink_to_fit(); + fn from(tokens: Vec) -> Self { + let mut tokens: Box<[_]> = tokens.into(); - assert!(tokens.len() == tokens.capacity()); // TODO: let (tokens_pointer, tokens_len, _) = unsafe { tokens.into_raw_parts() }; // Can't use for now...still a rust nightly feature let tokens_pointer = tokens.as_mut_ptr(); let tokens_len = tokens.len(); @@ -345,14 +344,11 @@ impl From> for DisassemblyTextLine { impl From<&Vec<&str>> for DisassemblyTextLine { fn from(string_tokens: &Vec<&str>) -> Self { - let mut tokens: Vec = Vec::with_capacity(string_tokens.len()); - tokens.extend( - string_tokens.iter().map(|&token| { - InstructionTextToken::new(token, InstructionTextTokenContents::Text).0 - }), - ); - - assert!(tokens.len() == tokens.capacity()); + let mut tokens: Box<[BNInstructionTextToken]> = string_tokens + .iter() + .map(|&token| InstructionTextToken::new(token, InstructionTextTokenContents::Text).0) + .collect(); + // let (tokens_pointer, tokens_len, _) = unsafe { tokens.into_raw_parts() }; // Can't use for now...still a rust nighly feature let tokens_pointer = tokens.as_mut_ptr(); let tokens_len = tokens.len(); From 38c68b59ea6c22d7d71cd79df3f3bb123f75bbce Mon Sep 17 00:00:00 2001 From: Rubens Brandao Date: Thu, 11 Apr 2024 08:07:55 -0300 Subject: [PATCH 2/3] update DisassemblyTextLine Drop impl to use Box --- rust/src/disassembly.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/rust/src/disassembly.rs b/rust/src/disassembly.rs index 65606ef63..b9cb05ccb 100644 --- a/rust/src/disassembly.rs +++ b/rust/src/disassembly.rs @@ -412,9 +412,8 @@ impl Default for DisassemblyTextLine { impl Drop for DisassemblyTextLine { fn drop(&mut self) { - unsafe { - Vec::from_raw_parts(self.0.tokens, self.0.count, self.0.count); - } + let ptr = core::ptr::slice_from_raw_parts_mut(self.0.tokens, self.0.count); + let _ = unsafe { Box::from_raw(ptr) }; } } From c54ccd257a0c517b7ba429aa155f600878a6067a Mon Sep 17 00:00:00 2001 From: Rubens Brandao Date: Thu, 11 Apr 2024 08:12:05 -0300 Subject: [PATCH 3/3] guard DisassemblyTextLine Drop against null ptr --- rust/src/disassembly.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/rust/src/disassembly.rs b/rust/src/disassembly.rs index b9cb05ccb..8b3a4cb5a 100644 --- a/rust/src/disassembly.rs +++ b/rust/src/disassembly.rs @@ -412,8 +412,10 @@ impl Default for DisassemblyTextLine { impl Drop for DisassemblyTextLine { fn drop(&mut self) { - let ptr = core::ptr::slice_from_raw_parts_mut(self.0.tokens, self.0.count); - let _ = unsafe { Box::from_raw(ptr) }; + if !self.0.tokens.is_null() { + let ptr = core::ptr::slice_from_raw_parts_mut(self.0.tokens, self.0.count); + let _ = unsafe { Box::from_raw(ptr) }; + } } }