wasmtime/runtime/vm/
export.rs1#[cfg(feature = "component-model")]
2use crate::runtime::vm::component::VMComponentContext;
3use crate::runtime::vm::vmcontext::{
4 VMContext, VMFuncRef, VMGlobalDefinition, VMGlobalImport, VMGlobalKind, VMMemoryDefinition,
5 VMOpaqueContext, VMTableDefinition, VMTagDefinition,
6};
7use core::ptr::NonNull;
8#[cfg(feature = "component-model")]
9use wasmtime_environ::component::RuntimeComponentInstanceIndex;
10use wasmtime_environ::{
11 DefinedGlobalIndex, DefinedMemoryIndex, DefinedTableIndex, DefinedTagIndex, Global, Memory,
12 Table, Tag,
13};
14
15pub enum Export {
17 Function(ExportFunction),
19
20 Table(ExportTable),
22
23 Memory(ExportMemory),
25
26 Global(ExportGlobal),
28
29 Tag(ExportTag),
31}
32
33#[derive(Debug, Clone, Copy)]
35pub struct ExportFunction {
36 pub func_ref: NonNull<VMFuncRef>,
41}
42
43unsafe impl Send for ExportFunction {}
47unsafe impl Sync for ExportFunction {}
48
49impl From<ExportFunction> for Export {
50 fn from(func: ExportFunction) -> Export {
51 Export::Function(func)
52 }
53}
54
55#[derive(Debug, Clone)]
57pub struct ExportTable {
58 pub definition: NonNull<VMTableDefinition>,
60 pub vmctx: NonNull<VMContext>,
62 pub table: Table,
64 pub index: DefinedTableIndex,
66}
67
68unsafe impl Send for ExportTable {}
70unsafe impl Sync for ExportTable {}
71
72impl From<ExportTable> for Export {
73 fn from(func: ExportTable) -> Export {
74 Export::Table(func)
75 }
76}
77
78#[derive(Debug, Clone)]
80pub struct ExportMemory {
81 pub definition: NonNull<VMMemoryDefinition>,
83 pub vmctx: NonNull<VMContext>,
85 pub memory: Memory,
87 pub index: DefinedMemoryIndex,
89}
90
91unsafe impl Send for ExportMemory {}
93unsafe impl Sync for ExportMemory {}
94
95impl From<ExportMemory> for Export {
96 fn from(func: ExportMemory) -> Export {
97 Export::Memory(func)
98 }
99}
100
101#[derive(Debug, Clone)]
103pub struct ExportGlobal {
104 pub definition: NonNull<VMGlobalDefinition>,
106
107 pub kind: ExportGlobalKind,
110
111 pub global: Global,
113}
114
115#[derive(Debug, Clone)]
117pub enum ExportGlobalKind {
118 Host(DefinedGlobalIndex),
121
122 Instance(NonNull<VMContext>, DefinedGlobalIndex),
124
125 #[cfg(feature = "component-model")]
127 ComponentFlags(NonNull<VMComponentContext>, RuntimeComponentInstanceIndex),
128}
129
130impl ExportGlobal {
131 pub fn from_vmimport(import: &VMGlobalImport, ty: Global) -> ExportGlobal {
132 let kind = match import.kind {
133 VMGlobalKind::Host(index) => ExportGlobalKind::Host(index),
134 VMGlobalKind::Instance(index) => ExportGlobalKind::Instance(
135 unsafe { VMContext::from_opaque(import.vmctx.unwrap().as_non_null()) },
136 index,
137 ),
138 #[cfg(feature = "component-model")]
139 VMGlobalKind::ComponentFlags(index) => ExportGlobalKind::ComponentFlags(
140 unsafe { VMComponentContext::from_opaque(import.vmctx.unwrap().as_non_null()) },
141 index,
142 ),
143 };
144 ExportGlobal {
145 definition: import.from.as_non_null(),
146 kind,
147 global: ty,
148 }
149 }
150
151 pub fn vmimport(&self) -> VMGlobalImport {
152 let (vmctx, kind) = match self.kind {
153 ExportGlobalKind::Host(index) => (None, VMGlobalKind::Host(index)),
154 ExportGlobalKind::Instance(vmctx, index) => (
155 Some(VMOpaqueContext::from_vmcontext(vmctx).into()),
156 VMGlobalKind::Instance(index),
157 ),
158 #[cfg(feature = "component-model")]
159 ExportGlobalKind::ComponentFlags(vmctx, index) => (
160 Some(VMOpaqueContext::from_vmcomponent(vmctx).into()),
161 VMGlobalKind::ComponentFlags(index),
162 ),
163 };
164 VMGlobalImport {
165 from: self.definition.into(),
166 vmctx,
167 kind,
168 }
169 }
170}
171
172unsafe impl Send for ExportGlobal {}
174unsafe impl Sync for ExportGlobal {}
175
176impl From<ExportGlobal> for Export {
177 fn from(func: ExportGlobal) -> Export {
178 Export::Global(func)
179 }
180}
181
182#[derive(Debug, Clone)]
184pub struct ExportTag {
185 pub definition: NonNull<VMTagDefinition>,
187 pub vmctx: NonNull<VMContext>,
189 pub tag: Tag,
191 pub index: DefinedTagIndex,
193}
194
195unsafe impl Send for ExportTag {}
197unsafe impl Sync for ExportTag {}
198
199impl From<ExportTag> for Export {
200 fn from(func: ExportTag) -> Export {
201 Export::Tag(func)
202 }
203}