Skip to content

Commit 6617bb1

Browse files
authored
Simplify fetching memory bytes in the executor (#2010)
simplify fetching memory bytes in the executor
1 parent e4155a9 commit 6617bb1

5 files changed

Lines changed: 11 additions & 30 deletions

File tree

crates/wasmi/src/engine/executor/handler/args.rs

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -145,19 +145,6 @@ impl Args {
145145
self.ip = unsafe { self.ip.offset(i32::from(offset) as isize) };
146146
}
147147

148-
/// Returns the bytes of the `memory`.
149-
#[inline]
150-
pub fn fetch_memory_bytes<'a>(
151-
&mut self,
152-
state: &'a mut VmState,
153-
addr: ir::MemoryAddr,
154-
) -> &'a mut [u8] {
155-
if utils::is_default_memory(self.instance, addr) {
156-
return self.fetch_default_memory_bytes();
157-
}
158-
self.fetch_memory(state, addr).data_mut()
159-
}
160-
161148
/// Returns the bytes of the default memory at index 0.
162149
#[inline]
163150
pub fn fetch_default_memory_bytes<'a>(&mut self) -> &'a mut [u8] {

crates/wasmi/src/engine/executor/handler/exec.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2194,7 +2194,7 @@ macro_rules! handler_load_ri {
21942194
memory,
21952195
} = unsafe { args.decode_op() };
21962196
let address = args.get(address);
2197-
let bytes = args.fetch_memory_bytes(state, memory);
2197+
let bytes = args.fetch_memory(state, memory).data();
21982198
let loaded = $load(bytes, usize::from(address)).into_control()?;
21992199
args.set(result, loaded);
22002200
dispatch!(state, args)
@@ -2353,7 +2353,7 @@ macro_rules! handler_store_ix {
23532353
} = unsafe { args.decode_op() };
23542354
let address = args.get(address);
23552355
let value: $hint = args.get(value);
2356-
let bytes = args.fetch_memory_bytes(state, memory);
2356+
let bytes = args.fetch_memory(state, memory).data_mut();
23572357
$store(bytes, usize::from(address), value.into()).into_control()?;
23582358
dispatch!(state, args)
23592359
}

crates/wasmi/src/engine/executor/handler/exec/macros.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ macro_rules! handler_load {
167167
} = unsafe { args.decode_op() };
168168
let ptr: u64 = args.get(ptr);
169169
let offset: u64 = args.get(offset);
170-
let bytes = args.fetch_memory_bytes(state, memory);
170+
let bytes = args.fetch_memory(state, memory).data();
171171
let loaded = $load(bytes, ptr, offset).into_control()?;
172172
args.set(result, loaded);
173173
dispatch!(state, args)
@@ -235,7 +235,7 @@ macro_rules! handler_store {
235235
let ptr = args.get(ptr);
236236
let offset = args.get(offset);
237237
let value: $hint = args.get(value);
238-
let bytes = args.fetch_memory_bytes(state, memory);
238+
let bytes = args.fetch_memory(state, memory).data_mut();
239239
$store(bytes, ptr, offset, value.into()).into_control()?;
240240
dispatch!(state, args)
241241
}

crates/wasmi/src/engine/executor/handler/exec/simd.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -505,7 +505,7 @@ macro_rules! handler_store_lane_ss {
505505
let ptr = args.get(ptr);
506506
let offset = args.get(offset);
507507
let value = args.get(value);
508-
let bytes = args.fetch_memory_bytes(state, memory);
508+
let bytes = args.fetch_memory(state, memory).data_mut();
509509
$eval(bytes, ptr, offset, value, lane).into_control()?;
510510
dispatch!(state, args)
511511
}

crates/wasmi/src/engine/executor/handler/utils.rs

Lines changed: 6 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -531,19 +531,13 @@ pub fn exec_copy_span_des(sp: Sp, dst: SlotSpan, src: SlotSpan, len: u16) {
531531
}
532532

533533
/// Returns `true` if `memory` addresses the default linear memory (Wasm index 0).
534-
///
535-
/// # Note
536-
///
537-
/// `memory` is an instance address, not the raw Wasm memory index,
538-
/// so the default memory's address is not guaranteed to be zero.
539534
#[inline]
540-
pub fn is_default_memory(instance: Inst, memory: ir::MemoryAddr) -> bool {
541-
// SAFETY: `instance` refers to a live instance for the duration of the call.
542-
let layout = unsafe { instance.as_ptr().layout() };
543-
matches!(
544-
layout.memory_addr(0),
545-
Some(addr) if u32::from(addr) == u32::from(memory)
546-
)
535+
pub fn is_default_memory(_instance: Inst, memory: ir::MemoryAddr) -> bool {
536+
// Note: this returns `true` even if the instance does not contain a memory.
537+
// It is guaranteed that linear memories are placed first in an instance's
538+
// handle buffer, therefore `MemoryAddr(0)` always refers to the default
539+
// memory if one exists.
540+
u32::from(memory) == 0
547541
}
548542

549543
pub fn extract_mem0(_store: &mut PrunedStore, inst: Inst) -> (Mem0Ptr, Mem0Len) {

0 commit comments

Comments
 (0)