wasmparser/readers/component/
names.rs1use crate::{BinaryReader, BinaryReaderError, NameMap, Result, Subsection, Subsections};
2use core::ops::Range;
3
4pub type ComponentNameSectionReader<'a> = Subsections<'a, ComponentName<'a>>;
7
8#[derive(Clone)]
10#[allow(missing_docs)]
11pub enum ComponentName<'a> {
12 Component {
13 name: &'a str,
14 name_range: Range<usize>,
15 },
16 CoreFuncs(NameMap<'a>),
17 CoreGlobals(NameMap<'a>),
18 CoreMemories(NameMap<'a>),
19 CoreTables(NameMap<'a>),
20 CoreModules(NameMap<'a>),
21 CoreInstances(NameMap<'a>),
22 CoreTypes(NameMap<'a>),
23 Types(NameMap<'a>),
24 Instances(NameMap<'a>),
25 Components(NameMap<'a>),
26 Funcs(NameMap<'a>),
27 Values(NameMap<'a>),
28
29 Unknown {
31 ty: u8,
33 data: &'a [u8],
35 range: Range<usize>,
38 },
39}
40
41impl<'a> Subsection<'a> for ComponentName<'a> {
42 fn from_reader(id: u8, mut reader: BinaryReader<'a>) -> Result<Self> {
43 let data = reader.remaining_buffer();
44 let offset = reader.original_position();
45 Ok(match id {
46 0 => {
47 let name = reader.read_string()?;
48 if !reader.eof() {
49 return Err(BinaryReaderError::new(
50 "trailing data at the end of a name",
51 reader.original_position(),
52 ));
53 }
54 ComponentName::Component {
55 name,
56 name_range: offset..reader.original_position(),
57 }
58 }
59 1 => {
60 let ctor: fn(NameMap<'a>) -> ComponentName<'a> = match reader.read_u8()? {
61 0x00 => match reader.read_u8()? {
62 0x00 => ComponentName::CoreFuncs,
63 0x01 => ComponentName::CoreTables,
64 0x02 => ComponentName::CoreMemories,
65 0x03 => ComponentName::CoreGlobals,
66 0x10 => ComponentName::CoreTypes,
67 0x11 => ComponentName::CoreModules,
68 0x12 => ComponentName::CoreInstances,
69 _ => {
70 return Ok(ComponentName::Unknown {
71 ty: 1,
72 data,
73 range: offset..offset + data.len(),
74 });
75 }
76 },
77 0x01 => ComponentName::Funcs,
78 0x02 => ComponentName::Values,
79 0x03 => ComponentName::Types,
80 0x04 => ComponentName::Components,
81 0x05 => ComponentName::Instances,
82 _ => {
83 return Ok(ComponentName::Unknown {
84 ty: 1,
85 data,
86 range: offset..offset + data.len(),
87 });
88 }
89 };
90 ctor(NameMap::new(reader.shrink())?)
91 }
92 ty => ComponentName::Unknown {
93 ty,
94 data,
95 range: offset..offset + data.len(),
96 },
97 })
98 }
99}