Skip to main content

wamex_cli/read/
names.rs

1use anyhow::{Result, bail};
2use vec_map::VecMap;
3
4use super::CustomSectionReader;
5use crate::index::{
6    DataSegmentId, ElementId, FuncTypeId, IdMap, InputFuncId, InputGlobalId, MemoryId, TableId,
7    TagId,
8};
9
10// Custom sections
11#[derive(Default, Clone, Debug)]
12pub struct Names<'a> {
13    pub module: Option<&'a str>,
14    pub functions: IdMap<InputFuncId, &'a str>,
15    pub locals: VecMap<wasmparser::NameMap<'a>>,
16    pub labels: VecMap<wasmparser::NameMap<'a>>,
17    pub types: IdMap<FuncTypeId, &'a str>,
18    pub tables: IdMap<TableId, &'a str>,
19    pub memories: IdMap<MemoryId, &'a str>,
20    pub globals: IdMap<InputGlobalId, &'a str>,
21    pub elements: IdMap<ElementId, &'a str>,
22    pub data_segments: IdMap<DataSegmentId, &'a str>,
23    pub tags: IdMap<TagId, &'a str>,
24}
25
26impl<'a> CustomSectionReader<'a> for Names<'a> {
27    type Reader = wasmparser::NameSectionReader<'a>;
28    // fn new(data: &'a [u8], original_offset: usize) -> Result<Self> {
29    //     let mut names: Self = Default::default();
30    fn read(reader: Self::Reader) -> Result<Self> {
31        let mut names: Self = Default::default();
32        for part in reader {
33            use wasmparser::Name;
34            match part? {
35                Name::Module { name, .. } => {
36                    names.module = Some(name);
37                }
38                Name::Function(name_map) => {
39                    names.functions = convert_name_map(name_map)?;
40                }
41                Name::Local(indirect_name_map) => {
42                    names.locals = convert_indirect_name_map(indirect_name_map)?;
43                }
44                Name::Label(indirect_name_map) => {
45                    names.labels = convert_indirect_name_map(indirect_name_map)?;
46                }
47                Name::Type(name_map) => {
48                    names.types = convert_name_map(name_map)?;
49                }
50                Name::Table(name_map) => {
51                    names.tables = convert_name_map(name_map)?;
52                }
53                Name::Memory(name_map) => {
54                    names.memories = convert_name_map(name_map)?;
55                }
56                Name::Global(name_map) => {
57                    names.globals = convert_name_map(name_map)?;
58                }
59                Name::Data(name_map) => {
60                    names.data_segments = convert_name_map(name_map)?;
61                }
62                Name::Element(name_map) => {
63                    names.elements = convert_name_map(name_map)?;
64                }
65                Name::Tag(name_map) => {
66                    names.tags = convert_name_map(name_map)?;
67                }
68                Name::Field(_name_map) => {
69                    bail!("Field names not supported");
70                }
71                Name::Unknown { ty, .. } => {
72                    bail!("Unknown name subsection: {:?}", ty);
73                }
74            }
75        }
76        Ok(names)
77    }
78}
79
80fn convert_name_map<'a, T>(
81    name_map: wasmparser::NameMap<'a>,
82) -> Result<IdMap<crate::index::Id<T>, &'a str>>
83where
84    crate::index::Id<T>: 'static,
85{
86    name_map
87        .into_iter()
88        .map(|r| r.map(|naming| (crate::index::Id::from_index(naming.index), naming.name)))
89        .collect::<Result<IdMap<crate::index::Id<T>, &'a str>, _>>()
90        .map_err(|e| e.into())
91}
92
93fn convert_indirect_name_map<'a>(
94    indirect_name_map: wasmparser::IndirectNameMap<'a>,
95) -> Result<VecMap<wasmparser::NameMap<'a>>> {
96    indirect_name_map
97        .into_iter()
98        .map(|r| -> Result<(usize, wasmparser::NameMap<'a>)> {
99            let indirect_naming = r?;
100            Ok((indirect_naming.index as usize, indirect_naming.names))
101        })
102        .collect::<Result<VecMap<_>, _>>()
103}