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#[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 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}