#[cfg(feature = "component-model")]
use crate::runtime::vm::component::VMComponentContext;
use crate::runtime::vm::vmcontext::{
VMContext, VMFuncRef, VMGlobalDefinition, VMGlobalImport, VMGlobalKind, VMMemoryDefinition,
VMOpaqueContext, VMTableDefinition, VMTagDefinition,
};
use core::ptr::NonNull;
#[cfg(feature = "component-model")]
use wasmtime_environ::component::RuntimeComponentInstanceIndex;
use wasmtime_environ::{
DefinedGlobalIndex, DefinedMemoryIndex, DefinedTableIndex, DefinedTagIndex, Global, Memory,
Table, Tag,
};
pub enum Export {
Function(ExportFunction),
Table(ExportTable),
Memory(ExportMemory),
Global(ExportGlobal),
Tag(ExportTag),
}
#[derive(Debug, Clone, Copy)]
pub struct ExportFunction {
pub func_ref: NonNull<VMFuncRef>,
}
unsafe impl Send for ExportFunction {}
unsafe impl Sync for ExportFunction {}
impl From<ExportFunction> for Export {
fn from(func: ExportFunction) -> Export {
Export::Function(func)
}
}
#[derive(Debug, Clone)]
pub struct ExportTable {
pub definition: NonNull<VMTableDefinition>,
pub vmctx: NonNull<VMContext>,
pub table: Table,
pub index: DefinedTableIndex,
}
unsafe impl Send for ExportTable {}
unsafe impl Sync for ExportTable {}
impl From<ExportTable> for Export {
fn from(func: ExportTable) -> Export {
Export::Table(func)
}
}
#[derive(Debug, Clone)]
pub struct ExportMemory {
pub definition: NonNull<VMMemoryDefinition>,
pub vmctx: NonNull<VMContext>,
pub memory: Memory,
pub index: DefinedMemoryIndex,
}
unsafe impl Send for ExportMemory {}
unsafe impl Sync for ExportMemory {}
impl From<ExportMemory> for Export {
fn from(func: ExportMemory) -> Export {
Export::Memory(func)
}
}
#[derive(Debug, Clone)]
pub struct ExportGlobal {
pub definition: NonNull<VMGlobalDefinition>,
pub kind: ExportGlobalKind,
pub global: Global,
}
#[derive(Debug, Clone)]
pub enum ExportGlobalKind {
Host(DefinedGlobalIndex),
Instance(NonNull<VMContext>, DefinedGlobalIndex),
#[cfg(feature = "component-model")]
ComponentFlags(NonNull<VMComponentContext>, RuntimeComponentInstanceIndex),
}
impl ExportGlobal {
pub fn from_vmimport(import: &VMGlobalImport, ty: Global) -> ExportGlobal {
let kind = match import.kind {
VMGlobalKind::Host(index) => ExportGlobalKind::Host(index),
VMGlobalKind::Instance(index) => ExportGlobalKind::Instance(
unsafe { VMContext::from_opaque(import.vmctx.unwrap().as_non_null()) },
index,
),
#[cfg(feature = "component-model")]
VMGlobalKind::ComponentFlags(index) => ExportGlobalKind::ComponentFlags(
unsafe { VMComponentContext::from_opaque(import.vmctx.unwrap().as_non_null()) },
index,
),
};
ExportGlobal {
definition: import.from.as_non_null(),
kind,
global: ty,
}
}
pub fn vmimport(&self) -> VMGlobalImport {
let (vmctx, kind) = match self.kind {
ExportGlobalKind::Host(index) => (None, VMGlobalKind::Host(index)),
ExportGlobalKind::Instance(vmctx, index) => (
Some(VMOpaqueContext::from_vmcontext(vmctx).into()),
VMGlobalKind::Instance(index),
),
#[cfg(feature = "component-model")]
ExportGlobalKind::ComponentFlags(vmctx, index) => (
Some(VMOpaqueContext::from_vmcomponent(vmctx).into()),
VMGlobalKind::ComponentFlags(index),
),
};
VMGlobalImport {
from: self.definition.into(),
vmctx,
kind,
}
}
}
unsafe impl Send for ExportGlobal {}
unsafe impl Sync for ExportGlobal {}
impl From<ExportGlobal> for Export {
fn from(func: ExportGlobal) -> Export {
Export::Global(func)
}
}
#[derive(Debug, Clone)]
pub struct ExportTag {
pub definition: NonNull<VMTagDefinition>,
pub vmctx: NonNull<VMContext>,
pub tag: Tag,
pub index: DefinedTagIndex,
}
unsafe impl Send for ExportTag {}
unsafe impl Sync for ExportTag {}
impl From<ExportTag> for Export {
fn from(func: ExportTag) -> Export {
Export::Tag(func)
}
}