@@ -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