From 41dbc1bdd0c2077b120ab68e87c6a88a6d9215f9 Mon Sep 17 00:00:00 2001 From: Janis Date: Tue, 18 Apr 2023 01:06:50 +0200 Subject: [PATCH] safe object array --- src/global_tables/objects.rs | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/global_tables/objects.rs b/src/global_tables/objects.rs index a289315..bc96438 100644 --- a/src/global_tables/objects.rs +++ b/src/global_tables/objects.rs @@ -49,7 +49,7 @@ impl ObjectArrayItem { #[repr(C)] #[derive(Debug)] pub struct ObjectArrayInner { - objects: *const *const ObjectArrayItem, + objects: NonNull>>, pre_allocated_objects: Option>, max_elements: u32, num_elements: u32, @@ -60,13 +60,13 @@ pub struct ObjectArrayInner { impl ObjectArrayInner { const ELEMENTS_PER_CHUNK: usize = 64 * 1024; - fn chunks_as_slice(&self) -> &[*const ObjectArrayItem] { - unsafe { std::slice::from_raw_parts(self.objects, self.num_chunks as usize) } + fn chunks_as_slice(&self) -> &[Option>] { + unsafe { std::slice::from_raw_parts(self.objects.as_ptr(), self.num_chunks as usize) } } pub fn get_chunks(&self) -> Vec<&[ObjectArrayItem]> { (0..self.num_chunks as usize) - .map(|i| self.chunk_as_slice(i)) + .filter_map(|i| self.chunk_as_slice(i)) .collect() } @@ -82,13 +82,12 @@ impl ObjectArrayInner { } } - fn chunk_as_slice(&self, chunk_index: usize) -> &[ObjectArrayItem] { + fn chunk_as_slice(&self, chunk_index: usize) -> Option<&[ObjectArrayItem]> { let chunks = self.chunks_as_slice(); let chunk = unsafe { - std::slice::from_raw_parts( - chunks[chunk_index], - self.get_chunk_size(chunk_index).unwrap(), - ) + chunks[chunk_index].map(|ptr| { + std::slice::from_raw_parts(ptr.as_ptr(), self.get_chunk_size(chunk_index).unwrap()) + }) }; chunk @@ -107,10 +106,11 @@ impl ObjectArrayInner { } pub fn get_index(&self, i: usize) -> Option<&ObjectArrayItem> { - self.get_chunked_index(i) - .map(|(chunk_index, within_chunk_index)| { - &self.chunk_as_slice(chunk_index)[within_chunk_index] - }) + if let Some((chunk, within_chunk)) = self.get_chunked_index(i) { + self.chunk_as_slice(chunk)?.get(within_chunk) + } else { + None + } } }