use crate::dispatch::VmLoaderData;
use crate::guest::GuestContractInstance;
use crate::types::{AbiError, CallArena};
#[repr(C)]
#[derive(Debug, Clone, Copy)]
pub struct VmDispatch {
pub call: unsafe extern "C" fn(
loader_data: VmLoaderData,
instance: GuestContractInstance,
fn_id: u32,
args: *const (),
out: *mut (),
arena: *mut CallArena,
out_err: *mut AbiError,
),
pub loader_data: VmLoaderData,
}
unsafe impl Send for VmDispatch {}
unsafe impl Sync for VmDispatch {}
#[cfg(test)]
mod tests {
use core::mem::{align_of, offset_of, size_of};
use crate::dispatch::VmLoaderData;
use crate::dispatch::vm_dispatch::VmDispatch;
#[test]
fn layout_vm_dispatch() {
assert_eq!(size_of::<VmDispatch>(), 16);
assert_eq!(align_of::<VmDispatch>(), 8);
assert_eq!(offset_of!(VmDispatch, call), 0);
assert_eq!(offset_of!(VmDispatch, loader_data), 8);
}
#[test]
fn vm_dispatch_uses_vm_loader_data() {
assert_eq!(size_of::<VmLoaderData>(), 8);
}
#[test]
fn vm_dispatch_instance_is_guest_contract_instance() {
use crate::guest::GuestContractInstance;
assert_eq!(size_of::<GuestContractInstance>(), 16);
}
}