wasmer_types/
indexes.rs

1//! Helper functions and structures for the translation.
2use crate::entity::entity_impl;
3use rkyv::{Archive, Deserialize as RkyvDeserialize, Serialize as RkyvSerialize};
4#[cfg(feature = "enable-serde")]
5use serde::{Deserialize, Serialize};
6
7/*
8 * [todo] xdoardo (on 2024/10/09)
9 *
10 * While updating rkyv from 0.7.x to 0.8.x it became unfeasible to represent archived
11 * version of some types as themselves (i.e. `rkyv(as = Self)`). This means that in cases
12 * like this one we can't simply return a reference to the underlying value.
13 *
14 * Hopefully as 0.8.x matures a bit more we can return to `rkyv(as = Self)`, making all
15 * of this faster and leaner. The missing bits for it are:
16 *
17 * 1. rkyv::rend::{u32_le, i32_le, u64_le, ..} should implement `serde::Serialize` and
18 *    `serde::Deserialize`.
19 *
20 */
21
22/// Index type of a function defined locally inside the WebAssembly module.
23#[derive(
24    Copy,
25    Clone,
26    PartialEq,
27    Eq,
28    Hash,
29    PartialOrd,
30    Ord,
31    Debug,
32    RkyvSerialize,
33    RkyvDeserialize,
34    Archive,
35)]
36#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
37#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
38#[rkyv(derive(Debug, Hash, PartialEq, Eq), compare(PartialOrd, PartialEq))]
39pub struct LocalFunctionIndex(u32);
40entity_impl!(LocalFunctionIndex);
41
42/// Index type of a table defined locally inside the WebAssembly module.
43#[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Debug)]
44#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
45#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
46pub struct LocalTableIndex(u32);
47entity_impl!(LocalTableIndex);
48
49/// Index type of a memory defined locally inside the WebAssembly module.
50#[derive(Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Debug)]
51#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
52#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
53pub struct LocalMemoryIndex(u32);
54entity_impl!(LocalMemoryIndex);
55
56/// Index type of a tag defined locally inside the WebAssembly module.
57#[derive(
58    Copy,
59    Clone,
60    PartialEq,
61    Eq,
62    Hash,
63    PartialOrd,
64    Ord,
65    Debug,
66    RkyvSerialize,
67    RkyvDeserialize,
68    Archive,
69)]
70#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
71#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
72#[rkyv(derive(Debug), compare(PartialOrd, PartialEq))]
73pub struct LocalTagIndex(u32);
74entity_impl!(LocalTagIndex);
75
76/// Index type of a global defined locally inside the WebAssembly module.
77#[derive(
78    Copy,
79    Clone,
80    PartialEq,
81    Eq,
82    Hash,
83    PartialOrd,
84    Ord,
85    Debug,
86    RkyvSerialize,
87    RkyvDeserialize,
88    Archive,
89)]
90#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
91#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
92#[rkyv(derive(Debug), compare(PartialOrd, PartialEq))]
93pub struct LocalGlobalIndex(u32);
94entity_impl!(LocalGlobalIndex);
95
96/// Index type of a function (imported or local) inside the WebAssembly module.
97#[derive(
98    Copy,
99    Clone,
100    PartialEq,
101    Eq,
102    Hash,
103    PartialOrd,
104    Ord,
105    Debug,
106    RkyvSerialize,
107    RkyvDeserialize,
108    Archive,
109)]
110#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
111#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
112#[rkyv(
113    derive(Debug, PartialOrd, Ord, PartialEq, Eq),
114    compare(PartialOrd, PartialEq)
115)]
116pub struct FunctionIndex(u32);
117entity_impl!(FunctionIndex);
118
119/// Index type of a table (imported or local) inside the WebAssembly module.
120#[derive(
121    Copy,
122    Clone,
123    PartialEq,
124    Eq,
125    Hash,
126    PartialOrd,
127    Ord,
128    Debug,
129    RkyvSerialize,
130    RkyvDeserialize,
131    Archive,
132)]
133#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
134#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
135#[rkyv(
136    derive(Debug, PartialOrd, Ord, PartialEq, Eq),
137    compare(PartialOrd, PartialEq)
138)]
139pub struct TableIndex(u32);
140entity_impl!(TableIndex);
141
142/// Index type of an event inside the WebAssembly module.
143#[derive(
144    Copy,
145    Clone,
146    PartialEq,
147    Eq,
148    Hash,
149    PartialOrd,
150    Ord,
151    Debug,
152    RkyvSerialize,
153    RkyvDeserialize,
154    Archive,
155)]
156#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
157#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
158#[rkyv(
159    derive(Debug, PartialOrd, Ord, PartialEq, Eq),
160    compare(PartialOrd, PartialEq)
161)]
162pub struct TagIndex(u32);
163entity_impl!(TagIndex);
164
165/// Index type of a global variable (imported or local) inside the WebAssembly module.
166#[derive(
167    Copy,
168    Clone,
169    PartialEq,
170    Eq,
171    Hash,
172    PartialOrd,
173    Ord,
174    Debug,
175    RkyvSerialize,
176    RkyvDeserialize,
177    Archive,
178)]
179#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
180#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
181#[rkyv(derive(Debug), compare(PartialOrd, PartialEq))]
182pub struct GlobalIndex(u32);
183entity_impl!(GlobalIndex);
184
185/// Index type of a linear memory (imported or local) inside the WebAssembly module.
186#[derive(
187    Copy,
188    Clone,
189    PartialEq,
190    Eq,
191    Hash,
192    PartialOrd,
193    Ord,
194    Debug,
195    RkyvSerialize,
196    RkyvDeserialize,
197    Archive,
198)]
199#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
200#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
201#[rkyv(derive(Debug), compare(PartialOrd, PartialEq))]
202pub struct MemoryIndex(pub(crate) u32);
203entity_impl!(MemoryIndex);
204
205/// Index type of a signature (imported or local) inside the WebAssembly module.
206#[derive(
207    Copy,
208    Clone,
209    PartialEq,
210    Eq,
211    Hash,
212    PartialOrd,
213    Ord,
214    Debug,
215    RkyvSerialize,
216    RkyvDeserialize,
217    Archive,
218)]
219#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
220#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
221#[rkyv(derive(Debug), compare(PartialOrd, PartialEq))]
222pub struct SignatureIndex(u32);
223entity_impl!(SignatureIndex);
224
225/// Index type of a passive data segment inside the WebAssembly module.
226#[derive(
227    Copy,
228    Clone,
229    PartialEq,
230    Eq,
231    Hash,
232    PartialOrd,
233    Ord,
234    Debug,
235    RkyvSerialize,
236    RkyvDeserialize,
237    Archive,
238)]
239#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
240#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
241#[rkyv(
242    derive(Debug, PartialOrd, Ord, PartialEq, Eq),
243    compare(PartialOrd, PartialEq)
244)]
245pub struct DataIndex(u32);
246entity_impl!(DataIndex);
247
248/// Index type of a passive element segment inside the WebAssembly module.
249#[derive(
250    Copy,
251    Clone,
252    PartialEq,
253    Eq,
254    Hash,
255    PartialOrd,
256    Ord,
257    Debug,
258    RkyvSerialize,
259    RkyvDeserialize,
260    Archive,
261)]
262#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
263#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
264#[rkyv(
265    derive(Debug, PartialOrd, Ord, PartialEq, Eq),
266    compare(PartialOrd, PartialEq)
267)]
268pub struct ElemIndex(u32);
269entity_impl!(ElemIndex);
270
271/// Index type of a custom section inside a WebAssembly module.
272#[derive(
273    Copy,
274    Clone,
275    PartialEq,
276    Eq,
277    Hash,
278    PartialOrd,
279    Ord,
280    Debug,
281    RkyvSerialize,
282    RkyvDeserialize,
283    Archive,
284)]
285#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
286#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
287#[rkyv(derive(Debug), compare(PartialOrd, PartialEq))]
288pub struct CustomSectionIndex(u32);
289entity_impl!(CustomSectionIndex);
290
291/// An entity to export.
292#[derive(
293    Copy,
294    Clone,
295    Debug,
296    Hash,
297    PartialEq,
298    Eq,
299    PartialOrd,
300    Ord,
301    RkyvSerialize,
302    RkyvDeserialize,
303    Archive,
304)]
305#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
306#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
307#[rkyv(derive(Debug), compare(PartialOrd, PartialEq))]
308#[repr(u8)]
309pub enum ExportIndex {
310    /// Function export.
311    Function(FunctionIndex),
312    /// Table export.
313    Table(TableIndex),
314    /// Memory export.
315    Memory(MemoryIndex),
316    /// An event definition.
317    Tag(TagIndex),
318    /// Global export.
319    Global(GlobalIndex),
320}
321
322/// An entity to import.
323#[derive(
324    Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord, RkyvSerialize, RkyvDeserialize, Archive,
325)]
326#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
327#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
328#[rkyv(derive(Debug), compare(PartialOrd, PartialEq))]
329#[repr(u8)]
330pub enum ImportIndex {
331    /// Function import.
332    Function(FunctionIndex),
333    /// Table import.
334    Table(TableIndex),
335    /// Memory import.
336    Memory(MemoryIndex),
337    /// Tag import.
338    Tag(TagIndex),
339    /// Global import.
340    Global(GlobalIndex),
341}
342
343/// WebAssembly event.
344#[derive(
345    Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord, RkyvSerialize, RkyvDeserialize, Archive,
346)]
347#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
348#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
349#[rkyv(derive(Debug), compare(PartialOrd, PartialEq))]
350pub struct Tag {
351    /// The event signature type.
352    pub ty: u32,
353}