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, Hash),
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/// A function signature hash based on the signature.
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(derive(Debug), compare(PartialOrd, PartialEq))]
242pub struct SignatureHash(pub u32);
243
244impl SignatureHash {
245    /// Create a new `SignatureHash`.
246    pub fn new(value: u32) -> Self {
247        Self(value)
248    }
249
250    /// Get the inner hash value.
251    pub fn as_u32(self) -> u32 {
252        self.0
253    }
254}
255
256/// Index type of a passive data segment inside the WebAssembly module.
257#[derive(
258    Copy,
259    Clone,
260    PartialEq,
261    Eq,
262    Hash,
263    PartialOrd,
264    Ord,
265    Debug,
266    RkyvSerialize,
267    RkyvDeserialize,
268    Archive,
269)]
270#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
271#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
272#[rkyv(
273    derive(Debug, PartialOrd, Ord, PartialEq, Eq),
274    compare(PartialOrd, PartialEq)
275)]
276pub struct DataIndex(u32);
277entity_impl!(DataIndex);
278
279/// Index type of a passive element segment inside the WebAssembly module.
280#[derive(
281    Copy,
282    Clone,
283    PartialEq,
284    Eq,
285    Hash,
286    PartialOrd,
287    Ord,
288    Debug,
289    RkyvSerialize,
290    RkyvDeserialize,
291    Archive,
292)]
293#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
294#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
295#[rkyv(
296    derive(Debug, PartialOrd, Ord, PartialEq, Eq),
297    compare(PartialOrd, PartialEq)
298)]
299pub struct ElemIndex(u32);
300entity_impl!(ElemIndex);
301
302/// Index type of a custom section inside a WebAssembly module.
303#[derive(
304    Copy,
305    Clone,
306    PartialEq,
307    Eq,
308    Hash,
309    PartialOrd,
310    Ord,
311    Debug,
312    RkyvSerialize,
313    RkyvDeserialize,
314    Archive,
315)]
316#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
317#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
318#[rkyv(derive(Debug), compare(PartialOrd, PartialEq))]
319pub struct CustomSectionIndex(u32);
320entity_impl!(CustomSectionIndex);
321
322/// An entity to export.
323#[derive(
324    Copy,
325    Clone,
326    Debug,
327    Hash,
328    PartialEq,
329    Eq,
330    PartialOrd,
331    Ord,
332    RkyvSerialize,
333    RkyvDeserialize,
334    Archive,
335)]
336#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
337#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
338#[rkyv(derive(Debug), compare(PartialOrd, PartialEq))]
339#[repr(u8)]
340pub enum ExportIndex {
341    /// Function export.
342    Function(FunctionIndex),
343    /// Table export.
344    Table(TableIndex),
345    /// Memory export.
346    Memory(MemoryIndex),
347    /// An event definition.
348    Tag(TagIndex),
349    /// Global export.
350    Global(GlobalIndex),
351}
352
353/// An entity to import.
354#[derive(
355    Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord, RkyvSerialize, RkyvDeserialize, Archive,
356)]
357#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
358#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
359#[rkyv(derive(Debug), compare(PartialOrd, PartialEq))]
360#[repr(u8)]
361pub enum ImportIndex {
362    /// Function import.
363    Function(FunctionIndex),
364    /// Table import.
365    Table(TableIndex),
366    /// Memory import.
367    Memory(MemoryIndex),
368    /// Tag import.
369    Tag(TagIndex),
370    /// Global import.
371    Global(GlobalIndex),
372}
373
374/// WebAssembly event.
375#[derive(
376    Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord, RkyvSerialize, RkyvDeserialize, Archive,
377)]
378#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
379#[cfg_attr(feature = "artifact-size", derive(loupe::MemoryUsage))]
380#[rkyv(derive(Debug), compare(PartialOrd, PartialEq))]
381pub struct Tag {
382    /// The event signature type.
383    pub ty: u32,
384}