Skip to content

Commit 411e487

Browse files
committed
add remaining return_call* execution handlers
1 parent 5d4fea7 commit 411e487

File tree

3 files changed

+91
-0
lines changed

3 files changed

+91
-0
lines changed

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,8 @@ pub fn op_code_to_handler(code: OpCode) -> Handler {
343343
OpCode::CallImported => exec::call_imported,
344344
OpCode::CallIndirect => exec::call_indirect,
345345
OpCode::ReturnCallInternal => exec::return_call_internal,
346+
OpCode::ReturnCallImported => exec::return_call_imported,
347+
OpCode::ReturnCallIndirect => exec::return_call_indirect,
346348
// memory
347349
OpCode::MemorySize => exec::memory_size,
348350
OpCode::MemoryGrow => exec::memory_grow,

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

Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,92 @@ pub fn return_call_internal(
319319
dispatch!(state, callee_ip, callee_sp, mem0, mem0_len, instance)
320320
}
321321

322+
pub fn return_call_imported(
323+
state: &mut VmState,
324+
ip: Ip,
325+
_sp: Sp,
326+
mem0: Mem0Ptr,
327+
mem0_len: Mem0Len,
328+
instance: NonNull<InstanceEntity>,
329+
) -> Done {
330+
let (_, crate::ir::decode::ReturnCallImported { params, func }) = unsafe { decode_op(ip) };
331+
let func = fetch_func(instance, func);
332+
let func = resolve_func(state.store, &func);
333+
let (callee_ip, sp, mem0, mem0_len, instance) = match func {
334+
FuncEntity::Wasm(func) => {
335+
let engine_func = func.func_body();
336+
let callee_instance = *func.instance();
337+
let (callee_ip, size) = compile_or_get_func!(state, engine_func);
338+
let callee_instance = resolve_instance(state.store, &callee_instance).into();
339+
let callee_sp = match state.stack.replace_frame(
340+
callee_ip,
341+
params,
342+
size,
343+
(instance != callee_instance).then_some(callee_instance),
344+
) {
345+
Ok(sp) => sp,
346+
Err(trap) => done!(state, trap),
347+
};
348+
let (instance, mem0, mem0_len) =
349+
update_instance(state.store, instance, callee_instance, mem0, mem0_len);
350+
(callee_ip, callee_sp, mem0, mem0_len, instance)
351+
}
352+
FuncEntity::Host(_func) => {
353+
todo!()
354+
}
355+
};
356+
dispatch!(state, callee_ip, sp, mem0, mem0_len, instance)
357+
}
358+
359+
pub fn return_call_indirect(
360+
state: &mut VmState,
361+
ip: Ip,
362+
sp: Sp,
363+
mem0: Mem0Ptr,
364+
mem0_len: Mem0Len,
365+
instance: NonNull<InstanceEntity>,
366+
) -> Done {
367+
let (
368+
_,
369+
crate::ir::decode::ReturnCallIndirect {
370+
params,
371+
index,
372+
func_type,
373+
table,
374+
},
375+
) = unsafe { decode_op(ip) };
376+
let func = match resolve_indirect_func(index, table, func_type, state, sp, instance) {
377+
Ok(func) => func,
378+
Err(trap) => done!(state, trap),
379+
};
380+
let func = resolve_func(state.store, &func);
381+
let (callee_ip, sp, mem0, mem0_len, instance) = match func {
382+
FuncEntity::Wasm(func) => {
383+
let engine_func = func.func_body();
384+
let callee_instance = *func.instance();
385+
let (callee_ip, size) = compile_or_get_func!(state, engine_func);
386+
let callee_instance: NonNull<InstanceEntity> =
387+
resolve_instance(state.store, &callee_instance).into();
388+
let callee_sp = match state.stack.replace_frame(
389+
callee_ip,
390+
params,
391+
size,
392+
(instance != callee_instance).then_some(callee_instance),
393+
) {
394+
Ok(sp) => sp,
395+
Err(trap) => done!(state, trap),
396+
};
397+
let (instance, mem0, mem0_len) =
398+
update_instance(state.store, instance, callee_instance, mem0, mem0_len);
399+
(callee_ip, callee_sp, mem0, mem0_len, instance)
400+
}
401+
FuncEntity::Host(_func) => {
402+
todo!()
403+
}
404+
};
405+
dispatch!(state, callee_ip, sp, mem0, mem0_len, instance)
406+
}
407+
322408
pub fn r#return(
323409
state: &mut VmState,
324410
_ip: Ip,

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,7 @@ impl Stack {
253253
Some((ip, sp, mem0, mem0_len, instance))
254254
}
255255

256+
#[inline(always)]
256257
pub fn replace_frame(
257258
&mut self,
258259
callee_ip: Ip,
@@ -320,6 +321,7 @@ impl ValueStack {
320321
Ok(sp)
321322
}
322323

324+
#[inline(always)]
323325
fn replace(
324326
&mut self,
325327
start: usize,
@@ -432,6 +434,7 @@ impl CallStack {
432434
Some((ip, start, popped.instance))
433435
}
434436

437+
#[inline(always)]
435438
fn replace(
436439
&mut self,
437440
callee_ip: Ip,

0 commit comments

Comments
 (0)