wasmtime/runtime/
externals.rs1use crate::store::StoreOpaque;
2use crate::{AsContext, Engine, ExternType, Func, Memory, SharedMemory};
3
4mod global;
5mod table;
6mod tag;
7
8pub use global::Global;
9pub use table::Table;
10pub use tag::Tag;
11
12#[derive(Clone, Debug)]
22pub enum Extern {
23 Func(Func),
25 Global(Global),
28 Table(Table),
30 Memory(Memory),
32 SharedMemory(SharedMemory),
35 Tag(Tag),
38}
39
40impl Extern {
41 #[inline]
45 pub fn into_func(self) -> Option<Func> {
46 match self {
47 Extern::Func(func) => Some(func),
48 _ => None,
49 }
50 }
51
52 #[inline]
56 pub fn into_global(self) -> Option<Global> {
57 match self {
58 Extern::Global(global) => Some(global),
59 _ => None,
60 }
61 }
62
63 #[inline]
67 pub fn into_table(self) -> Option<Table> {
68 match self {
69 Extern::Table(table) => Some(table),
70 _ => None,
71 }
72 }
73
74 #[inline]
78 pub fn into_memory(self) -> Option<Memory> {
79 match self {
80 Extern::Memory(memory) => Some(memory),
81 _ => None,
82 }
83 }
84
85 #[inline]
90 pub fn into_shared_memory(self) -> Option<SharedMemory> {
91 match self {
92 Extern::SharedMemory(memory) => Some(memory),
93 _ => None,
94 }
95 }
96
97 #[inline]
101 pub fn into_tag(self) -> Option<Tag> {
102 match self {
103 Extern::Tag(tag) => Some(tag),
104 _ => None,
105 }
106 }
107
108 pub fn ty(&self, store: impl AsContext) -> ExternType {
117 let store = store.as_context();
118 match self {
119 Extern::Func(ft) => ExternType::Func(ft.ty(store)),
120 Extern::Memory(ft) => ExternType::Memory(ft.ty(store)),
121 Extern::SharedMemory(ft) => ExternType::Memory(ft.ty()),
122 Extern::Table(tt) => ExternType::Table(tt.ty(store)),
123 Extern::Global(gt) => ExternType::Global(gt.ty(store)),
124 Extern::Tag(tt) => ExternType::Tag(tt.ty(store)),
125 }
126 }
127
128 pub(crate) fn from_wasmtime_export(
129 wasmtime_export: crate::runtime::vm::Export,
130 store: &StoreOpaque,
131 ) -> Extern {
132 match wasmtime_export {
133 crate::runtime::vm::Export::Function(f) => Extern::Func(f),
134 crate::runtime::vm::Export::Memory(m) => Extern::Memory(m),
135 crate::runtime::vm::Export::SharedMemory(m, _) => {
136 Extern::SharedMemory(crate::SharedMemory::from_raw(m, store.engine().clone()))
137 }
138 crate::runtime::vm::Export::Global(g) => Extern::Global(g),
139 crate::runtime::vm::Export::Table(t) => Extern::Table(t),
140 crate::runtime::vm::Export::Tag(t) => Extern::Tag(t),
141 }
142 }
143
144 pub(crate) fn comes_from_same_store(&self, store: &StoreOpaque) -> bool {
145 match self {
146 Extern::Func(f) => f.comes_from_same_store(store),
147 Extern::Global(g) => g.comes_from_same_store(store),
148 Extern::Memory(m) => m.comes_from_same_store(store),
149 Extern::SharedMemory(m) => Engine::same(m.engine(), store.engine()),
150 Extern::Table(t) => t.comes_from_same_store(store),
151 Extern::Tag(t) => t.comes_from_same_store(store),
152 }
153 }
154}
155
156impl From<Func> for Extern {
157 fn from(r: Func) -> Self {
158 Extern::Func(r)
159 }
160}
161
162impl From<Global> for Extern {
163 fn from(r: Global) -> Self {
164 Extern::Global(r)
165 }
166}
167
168impl From<Memory> for Extern {
169 fn from(r: Memory) -> Self {
170 Extern::Memory(r)
171 }
172}
173
174impl From<SharedMemory> for Extern {
175 fn from(r: SharedMemory) -> Self {
176 Extern::SharedMemory(r)
177 }
178}
179
180impl From<Table> for Extern {
181 fn from(r: Table) -> Self {
182 Extern::Table(r)
183 }
184}
185
186impl From<Tag> for Extern {
187 fn from(t: Tag) -> Self {
188 Extern::Tag(t)
189 }
190}
191
192#[derive(Clone)]
200pub struct Export<'instance> {
201 name: &'instance str,
203
204 definition: Extern,
206}
207
208impl<'instance> Export<'instance> {
209 pub(crate) fn new(name: &'instance str, definition: Extern) -> Export<'instance> {
212 Export { name, definition }
213 }
214
215 pub fn name(&self) -> &'instance str {
217 self.name
218 }
219
220 pub fn ty(&self, store: impl AsContext) -> ExternType {
226 self.definition.ty(store)
227 }
228
229 pub fn into_extern(self) -> Extern {
231 self.definition
232 }
233
234 pub fn into_func(self) -> Option<Func> {
237 self.definition.into_func()
238 }
239
240 pub fn into_table(self) -> Option<Table> {
243 self.definition.into_table()
244 }
245
246 pub fn into_memory(self) -> Option<Memory> {
249 self.definition.into_memory()
250 }
251
252 pub fn into_global(self) -> Option<Global> {
255 self.definition.into_global()
256 }
257
258 pub fn into_tag(self) -> Option<Tag> {
261 self.definition.into_tag()
262 }
263}