radix_wasmi/module/
export.rs1use super::GlobalIdx;
2use crate::{errors::ModuleError, ExternType, Module};
3use alloc::{boxed::Box, collections::btree_map::Iter as BTreeIter};
4
5#[derive(Debug, Copy, Clone)]
9pub struct FuncIdx(pub(crate) u32);
10
11impl FuncIdx {
12 pub fn into_u32(self) -> u32 {
14 self.0
15 }
16
17 pub fn into_usize(self) -> usize {
19 self.0 as usize
20 }
21}
22
23#[derive(Debug, Copy, Clone)]
27pub struct TableIdx(pub(crate) u32);
28
29impl TableIdx {
30 pub fn into_u32(self) -> u32 {
32 self.0
33 }
34}
35
36#[derive(Debug, Copy, Clone)]
40pub struct MemoryIdx(pub(crate) u32);
41
42impl MemoryIdx {
43 pub fn into_u32(self) -> u32 {
45 self.0
46 }
47}
48
49#[derive(Debug, Copy, Clone)]
53pub enum ExternIdx {
54 Func(FuncIdx),
58 Table(TableIdx),
62 Memory(MemoryIdx),
66 Global(GlobalIdx),
70}
71
72impl ExternIdx {
73 pub fn new(kind: wasmparser::ExternalKind, index: u32) -> Result<Self, ModuleError> {
79 match kind {
80 wasmparser::ExternalKind::Func => Ok(ExternIdx::Func(FuncIdx(index))),
81 wasmparser::ExternalKind::Table => Ok(ExternIdx::Table(TableIdx(index))),
82 wasmparser::ExternalKind::Memory => Ok(ExternIdx::Memory(MemoryIdx(index))),
83 wasmparser::ExternalKind::Global => Ok(ExternIdx::Global(GlobalIdx(index))),
84 wasmparser::ExternalKind::Tag => Err(ModuleError::unsupported(kind)),
85 }
86 }
87}
88
89#[derive(Debug)]
93pub struct ModuleExportsIter<'module> {
94 exports: BTreeIter<'module, Box<str>, ExternIdx>,
95 module: &'module Module,
96}
97
98#[derive(Debug)]
103pub struct ExportType<'module> {
104 name: &'module str,
105 ty: ExternType,
106}
107
108impl<'module> ExportType<'module> {
109 pub fn name(&self) -> &'module str {
111 self.name
112 }
113
114 pub fn ty(&self) -> &ExternType {
116 &self.ty
117 }
118}
119
120impl<'module> ModuleExportsIter<'module> {
121 pub(super) fn new(module: &'module Module) -> Self {
123 Self {
124 exports: module.exports.iter(),
125 module,
126 }
127 }
128}
129
130impl<'module> Iterator for ModuleExportsIter<'module> {
131 type Item = ExportType<'module>;
132
133 fn next(&mut self) -> Option<Self::Item> {
134 self.exports.next().map(|(name, idx)| {
135 let ty = self.module.get_extern_type(*idx);
136 ExportType { name, ty }
137 })
138 }
139}