catch panic in libcalls for memory and table grow
use crate::externref::VMExternRef;
use crate::instance::Instance;
use crate::table::{Table, TableElementType};
-use crate::traphandlers::{raise_lib_trap, Trap};
+use crate::traphandlers::{raise_lib_trap, resume_panic, Trap};
use crate::vmcontext::{VMCallerCheckedAnyfunc, VMContext};
use backtrace::Backtrace;
use std::mem;
@@ -190,6 +190,7 @@ pub unsafe extern "C" fn wasmtime_memory32_grow(
delta: u64,
memory_index: u32,
) -> usize {
+ std::panic::catch_unwind(|| {
let instance = (*vmctx).instance_mut();
let memory_index = MemoryIndex::from_u32(memory_index);
match instance.memory_grow(memory_index, delta) {
@@ -197,6 +198,9 @@ pub unsafe extern "C" fn wasmtime_memory32_grow(
Ok(None) => usize::max_value(),
Err(err) => crate::traphandlers::raise_user_trap(err),
}
+ })
+ .map_err(|panic| resume_panic(panic))
+ .unwrap()
}
/// Implementation of `table.grow`.
@@ -208,6 +212,7 @@ pub unsafe extern "C" fn wasmtime_table_grow(
// or is a `VMExternRef` until we look at the table type.
init_value: *mut u8,
) -> u32 {
+ std::panic::catch_unwind(|| {
let instance = (*vmctx).instance_mut();
let table_index = TableIndex::from_u32(table_index);
let element = match instance.table_element_type(table_index) {
@@ -226,6 +231,9 @@ pub unsafe extern "C" fn wasmtime_table_grow(
Ok(None) => -1_i32 as u32,
Err(err) => crate::traphandlers::raise_user_trap(err),
}
+ })
+ .map_err(|panic| resume_panic(panic))
+ .unwrap()
}
/// Implementation of `table.fill`.
