/src/wasm-tools/crates/wasmparser/src/readers/alias_section.rs
Line | Count | Source |
1 | | use crate::{ |
2 | | BinaryReader, BinaryReaderError, ExternalKind, Range, Result, SectionIteratorLimited, |
3 | | SectionReader, SectionWithLimitedItems, |
4 | | }; |
5 | | |
6 | 198k | #[derive(Clone)] |
7 | | pub struct AliasSectionReader<'a> { |
8 | | reader: BinaryReader<'a>, |
9 | | count: u32, |
10 | | } |
11 | | |
12 | | #[derive(Debug)] |
13 | | pub enum Alias<'a> { |
14 | | OuterType { |
15 | | relative_depth: u32, |
16 | | index: u32, |
17 | | }, |
18 | | OuterModule { |
19 | | relative_depth: u32, |
20 | | index: u32, |
21 | | }, |
22 | | InstanceExport { |
23 | | instance: u32, |
24 | | kind: ExternalKind, |
25 | | export: &'a str, |
26 | | }, |
27 | | } |
28 | | |
29 | | impl<'a> AliasSectionReader<'a> { |
30 | 200k | pub fn new(data: &'a [u8], offset: usize) -> Result<AliasSectionReader<'a>> { |
31 | 200k | let mut reader = BinaryReader::new_with_offset(data, offset); |
32 | 200k | let count = reader.read_var_u32()?; |
33 | 200k | Ok(AliasSectionReader { reader, count }) |
34 | 200k | } |
35 | | |
36 | 1.10M | pub fn original_position(&self) -> usize { |
37 | 1.10M | self.reader.original_position() |
38 | 1.10M | } |
39 | | |
40 | 199k | pub fn get_count(&self) -> u32 { |
41 | 199k | self.count |
42 | 199k | } |
43 | | |
44 | 1.10M | pub fn read(&mut self) -> Result<Alias<'a>> { |
45 | 1.10M | Ok(match self.reader.read_u8()? { |
46 | | 0x00 => Alias::InstanceExport { |
47 | 170k | instance: self.reader.read_var_u32()?, |
48 | 170k | kind: self.reader.read_external_kind()?, |
49 | 170k | export: self.reader.read_string()?, |
50 | | }, |
51 | | 0x01 => { |
52 | 938k | let relative_depth = self.reader.read_var_u32()?; |
53 | 938k | match self.reader.read_external_kind()? { |
54 | 938k | ExternalKind::Type => Alias::OuterType { |
55 | 604k | relative_depth, |
56 | 604k | index: self.reader.read_var_u32()?, |
57 | | }, |
58 | | ExternalKind::Module => Alias::OuterModule { |
59 | 333k | relative_depth, |
60 | 333k | index: self.reader.read_var_u32()?, |
61 | | }, |
62 | | _ => { |
63 | 2 | return Err(BinaryReaderError::new( |
64 | 2 | "invalid external kind in alias", |
65 | 2 | self.original_position() - 1, |
66 | 2 | )) |
67 | | } |
68 | | } |
69 | | } |
70 | | _ => { |
71 | 48 | return Err(BinaryReaderError::new( |
72 | 48 | "invalid byte in alias", |
73 | 48 | self.original_position() - 1, |
74 | 48 | )) |
75 | | } |
76 | | }) |
77 | 1.10M | } |
78 | | } |
79 | | |
80 | | impl<'a> SectionReader for AliasSectionReader<'a> { |
81 | | type Item = Alias<'a>; |
82 | | |
83 | 1.10M | fn read(&mut self) -> Result<Self::Item> { |
84 | 1.10M | AliasSectionReader::read(self) |
85 | 1.10M | } |
86 | 198k | fn eof(&self) -> bool { |
87 | 198k | self.reader.eof() |
88 | 198k | } |
89 | 1.10M | fn original_position(&self) -> usize { |
90 | 1.10M | AliasSectionReader::original_position(self) |
91 | 1.10M | } |
92 | 397k | fn range(&self) -> Range { |
93 | 397k | self.reader.range() |
94 | 397k | } |
95 | | } |
96 | | |
97 | | impl<'a> SectionWithLimitedItems for AliasSectionReader<'a> { |
98 | 199k | fn get_count(&self) -> u32 { |
99 | 199k | AliasSectionReader::get_count(self) |
100 | 199k | } |
101 | | } |
102 | | |
103 | | impl<'a> IntoIterator for AliasSectionReader<'a> { |
104 | | type Item = Result<Alias<'a>>; |
105 | | type IntoIter = SectionIteratorLimited<AliasSectionReader<'a>>; |
106 | | |
107 | 528 | fn into_iter(self) -> Self::IntoIter { |
108 | 528 | SectionIteratorLimited::new(self) |
109 | 528 | } |
110 | | } |