wasmtime/runtime/vm/export.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
use crate::runtime::vm::vmcontext::{
VMContext, VMFuncRef, VMGlobalDefinition, VMMemoryDefinition, VMTableDefinition,
VMTagDefinition,
};
use core::ptr::NonNull;
use wasmtime_environ::{DefinedMemoryIndex, Global, Memory, Table, Tag};
/// The value of an export passed from one instance to another.
pub enum Export {
/// A function export value.
Function(ExportFunction),
/// A table export value.
Table(ExportTable),
/// A memory export value.
Memory(ExportMemory),
/// A global export value.
Global(ExportGlobal),
/// A tag export value.
Tag(ExportTag),
}
/// A function export value.
#[derive(Debug, Clone, Copy)]
pub struct ExportFunction {
/// The `VMFuncRef` for this exported function.
///
/// Note that exported functions cannot be a null funcref, so this is a
/// non-null pointer.
pub func_ref: NonNull<VMFuncRef>,
}
// As part of the contract for using `ExportFunction`, synchronization
// properties must be upheld. Therefore, despite containing raw pointers,
// it is declared as Send/Sync.
unsafe impl Send for ExportFunction {}
unsafe impl Sync for ExportFunction {}
impl From<ExportFunction> for Export {
fn from(func: ExportFunction) -> Export {
Export::Function(func)
}
}
/// A table export value.
#[derive(Debug, Clone)]
pub struct ExportTable {
/// The address of the table descriptor.
pub definition: NonNull<VMTableDefinition>,
/// Pointer to the containing `VMContext`.
pub vmctx: NonNull<VMContext>,
/// The table declaration, used for compatibility checking.
pub table: Table,
}
// See docs on send/sync for `ExportFunction` above.
unsafe impl Send for ExportTable {}
unsafe impl Sync for ExportTable {}
impl From<ExportTable> for Export {
fn from(func: ExportTable) -> Export {
Export::Table(func)
}
}
/// A memory export value.
#[derive(Debug, Clone)]
pub struct ExportMemory {
/// The address of the memory descriptor.
pub definition: NonNull<VMMemoryDefinition>,
/// Pointer to the containing `VMContext`.
pub vmctx: NonNull<VMContext>,
/// The memory declaration, used for compatibility checking.
pub memory: Memory,
/// The index at which the memory is defined within the `vmctx`.
pub index: DefinedMemoryIndex,
}
// See docs on send/sync for `ExportFunction` above.
unsafe impl Send for ExportMemory {}
unsafe impl Sync for ExportMemory {}
impl From<ExportMemory> for Export {
fn from(func: ExportMemory) -> Export {
Export::Memory(func)
}
}
/// A global export value.
#[derive(Debug, Clone)]
pub struct ExportGlobal {
/// The address of the global storage.
pub definition: NonNull<VMGlobalDefinition>,
/// Pointer to the containing `VMContext`. May be null for host-created
/// globals.
pub vmctx: Option<NonNull<VMContext>>,
/// The global declaration, used for compatibility checking.
pub global: Global,
}
// See docs on send/sync for `ExportFunction` above.
unsafe impl Send for ExportGlobal {}
unsafe impl Sync for ExportGlobal {}
impl From<ExportGlobal> for Export {
fn from(func: ExportGlobal) -> Export {
Export::Global(func)
}
}
/// A tag export value.
#[derive(Debug, Clone)]
pub struct ExportTag {
/// The address of the global storage.
pub definition: NonNull<VMTagDefinition>,
/// The global declaration, used for compatibility checking.
pub tag: Tag,
}
// See docs on send/sync for `ExportFunction` above.
unsafe impl Send for ExportTag {}
unsafe impl Sync for ExportTag {}
impl From<ExportTag> for Export {
fn from(func: ExportTag) -> Export {
Export::Tag(func)
}
}