Skip to content

Commit 24df372

Browse files
committed
refactor Stack internals
1 parent 5ec1272 commit 24df372

File tree

1 file changed

+19
-23
lines changed
  • crates/wasmi/src/engine/executor/handler

1 file changed

+19
-23
lines changed

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

Lines changed: 19 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -224,14 +224,10 @@ impl Stack {
224224
callee_size: usize,
225225
callee_instance: Option<NonNull<InstanceEntity>>,
226226
) -> Result<Sp, TrapCode> {
227-
let delta = usize::from(u16::from(callee_params.span().head()));
228-
let len_params = callee_params.len();
229-
let Some(start) = self.frames.top_start().checked_add(delta) else {
230-
return Err(TrapCode::StackOverflow);
231-
};
232-
let sp = self.values.push(start, callee_size, len_params)?;
233-
self.frames.push(caller_ip, callee_ip, start, callee_instance)?;
234-
Ok(sp)
227+
let start = self
228+
.frames
229+
.push(caller_ip, callee_ip, callee_params, callee_instance)?;
230+
self.values.push(start, callee_size, callee_params.len())
235231
}
236232

237233
pub fn pop_frame(
@@ -261,13 +257,8 @@ impl Stack {
261257
callee_size: usize,
262258
callee_instance: Option<NonNull<InstanceEntity>>,
263259
) -> Result<Sp, TrapCode> {
264-
let params_start = usize::from(u16::from(callee_params.span().head()));
265-
let params_len = callee_params.len();
266260
let start = self.frames.replace(callee_ip, callee_instance)?;
267-
let sp = self
268-
.values
269-
.replace(start, callee_size, params_start, params_len)?;
270-
Ok(sp)
261+
self.values.replace(start, callee_size, callee_params)
271262
}
272263
}
273264

@@ -326,11 +317,12 @@ impl ValueStack {
326317
&mut self,
327318
start: usize,
328319
len_slots: usize,
329-
params_start: usize,
330-
params_len: u16,
320+
callee_params: BoundedSlotSpan,
331321
) -> Result<Sp, TrapCode> {
332-
debug_assert!(params_start <= len_slots);
333-
debug_assert!(params_start + usize::from(params_len) <= len_slots);
322+
let params_len = callee_params.len();
323+
let params_offset = usize::from(u16::from(callee_params.span().head()));
324+
debug_assert!(params_offset <= len_slots);
325+
debug_assert!(params_offset + usize::from(params_len) <= len_slots);
334326
if len_slots == 0 {
335327
return Ok(Sp::null());
336328
}
@@ -344,8 +336,8 @@ impl ValueStack {
344336
let Some(cells) = self.cells.get_mut(start..end) else {
345337
unsafe { unreachable_unchecked!() }
346338
};
347-
let params_end = params_start.wrapping_add(usize::from(params_len));
348-
cells.copy_within(params_start..params_end, 0);
339+
let params_end = params_offset.wrapping_add(usize::from(params_len));
340+
cells.copy_within(params_offset..params_end, 0);
349341
let locals_start = start.wrapping_add(usize::from(params_len));
350342
cells[locals_start..].fill_with(UntypedVal::default);
351343
let sp = self.sp(start);
@@ -399,9 +391,9 @@ impl CallStack {
399391
&mut self,
400392
caller_ip: Option<Ip>,
401393
callee_ip: Ip,
402-
start: usize,
394+
callee_params: BoundedSlotSpan,
403395
instance: Option<NonNull<InstanceEntity>>,
404-
) -> Result<(), TrapCode> {
396+
) -> Result<usize, TrapCode> {
405397
if self.frames.len() == self.max_height {
406398
return Err(TrapCode::StackOverflow);
407399
}
@@ -413,12 +405,16 @@ impl CallStack {
413405
Some(instance) => self.instance.replace(instance),
414406
None => self.instance,
415407
};
408+
let params_offset = usize::from(u16::from(callee_params.span().head()));
409+
let Some(start) = self.top_start().checked_add(params_offset) else {
410+
return Err(TrapCode::StackOverflow);
411+
};
416412
self.frames.push(Frame {
417413
ip: callee_ip,
418414
start,
419415
instance: prev_instance,
420416
});
421-
Ok(())
417+
Ok(start)
422418
}
423419

424420
fn pop(&mut self) -> Option<(Ip, usize, Option<NonNull<InstanceEntity>>)> {

0 commit comments

Comments
 (0)