Skip to content

Commit d00fa8a

Browse files
committed
only query memory_data/size once per slice
1 parent 9bc2129 commit d00fa8a

1 file changed

Lines changed: 11 additions & 14 deletions

File tree

bindings/rust/src/lib.rs

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -292,20 +292,19 @@ impl Instance {
292292
/// Ensure the range is valid according to the currently available memory size.
293293
fn checked_memory_range(
294294
&self,
295+
memory_data: *mut u8,
296+
memory_size: usize,
295297
offset: u32,
296298
size: usize,
297299
) -> Result<core::ops::Range<usize>, ()> {
298300
// This is safe given usize::BITS >= u32::BITS, see https://doc.rust-lang.org/std/primitive.usize.html.
299301
let offset = offset as usize;
300302
let has_memory = unsafe { sys::fizzy_module_has_memory(self.get_module()) };
301-
let memory_size = self.memory_size();
302303
if !has_memory || offset.checked_add(size).is_none() || (offset + size) > memory_size {
303304
return Err(());
304305
}
305306
// Slices allow empty length, but data must be a valid pointer.
306-
debug_assert!(
307-
unsafe { sys::fizzy_get_instance_memory_data(self.0.as_ptr()) } != std::ptr::null_mut()
308-
);
307+
debug_assert!(memory_data != std::ptr::null_mut());
309308
Ok(offset..offset + size)
310309
}
311310

@@ -314,11 +313,10 @@ impl Instance {
314313
/// # Safety
315314
/// These slices turn invalid if the memory is resized (i.e. via the WebAssembly `memory.grow` instruction)
316315
pub unsafe fn checked_memory_slice(&self, offset: u32, size: usize) -> Result<&[u8], ()> {
317-
let range = self.checked_memory_range(offset, size)?;
318-
let memory = std::slice::from_raw_parts(
319-
sys::fizzy_get_instance_memory_data(self.0.as_ptr()),
320-
sys::fizzy_get_instance_memory_size(self.0.as_ptr()),
321-
);
316+
let memory_data = sys::fizzy_get_instance_memory_data(self.0.as_ptr());
317+
let memory_size = sys::fizzy_get_instance_memory_size(self.0.as_ptr());
318+
let range = self.checked_memory_range(memory_data, memory_size, offset, size)?;
319+
let memory = std::slice::from_raw_parts(memory_data, memory_size);
322320
Ok(&memory[range])
323321
}
324322

@@ -331,11 +329,10 @@ impl Instance {
331329
offset: u32,
332330
size: usize,
333331
) -> Result<&mut [u8], ()> {
334-
let range = self.checked_memory_range(offset, size)?;
335-
let memory = std::slice::from_raw_parts_mut(
336-
sys::fizzy_get_instance_memory_data(self.0.as_ptr()),
337-
sys::fizzy_get_instance_memory_size(self.0.as_ptr()),
338-
);
332+
let memory_data = sys::fizzy_get_instance_memory_data(self.0.as_ptr());
333+
let memory_size = sys::fizzy_get_instance_memory_size(self.0.as_ptr());
334+
let range = self.checked_memory_range(memory_data, memory_size, offset, size)?;
335+
let memory = std::slice::from_raw_parts_mut(memory_data, memory_size);
339336
Ok(&mut memory[range])
340337
}
341338

0 commit comments

Comments
 (0)