diff --git a/crates/api/src/func.rs b/crates/api/src/func.rs index 24ff6f9c43..d70195946e 100644 --- a/crates/api/src/func.rs +++ b/crates/api/src/func.rs @@ -1030,8 +1030,12 @@ macro_rules! impl_into_func { R: WasmRet, { let ret = { - let instance = InstanceHandle::from_vmctx(vmctx); - let (func, store) = instance.host_state().downcast_ref::<(F, Store)>().expect("state"); + let state = (*vmctx).host_state(); + // Double-check ourselves in debug mode, but we control + // the `Any` here so an unsafe downcast should also + // work. + debug_assert!(state.is::<(F, Store)>()); + let (func, store) = &*(state as *const _ as *const (F, Store)); panic::catch_unwind(AssertUnwindSafe(|| { func( Caller { store, caller_vmctx }, diff --git a/crates/runtime/src/instance.rs b/crates/runtime/src/instance.rs index 1c5e6540f4..caa56b4eff 100644 --- a/crates/runtime/src/instance.rs +++ b/crates/runtime/src/instance.rs @@ -376,6 +376,7 @@ impl Instance { } /// Return a reference to the custom state attached to this instance. + #[inline] pub fn host_state(&self) -> &dyn Any { &*self.host_state } @@ -416,6 +417,7 @@ impl Instance { } /// Return the offset from the vmctx pointer to its containing Instance. + #[inline] pub(crate) fn vmctx_offset() -> isize { offset_of!(Self, vmctx) as isize } diff --git a/crates/runtime/src/vmcontext.rs b/crates/runtime/src/vmcontext.rs index 23e6384bfc..c986c21718 100644 --- a/crates/runtime/src/vmcontext.rs +++ b/crates/runtime/src/vmcontext.rs @@ -632,6 +632,7 @@ impl VMContext { /// This is unsafe because it doesn't work on just any `VMContext`, it must /// be a `VMContext` allocated as part of an `Instance`. #[allow(clippy::cast_ptr_alignment)] + #[inline] pub(crate) unsafe fn instance(&self) -> &Instance { &*((self as *const Self as *mut u8).offset(-Instance::vmctx_offset()) as *const Instance) } @@ -641,6 +642,7 @@ impl VMContext { /// # Safety /// This is unsafe because it doesn't work on just any `VMContext`, it must /// be a `VMContext` allocated as part of an `Instance`. + #[inline] pub unsafe fn host_state(&self) -> &dyn Any { self.instance().host_state() }