Coverage Report

Created: 2021-03-22 08:29

/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
}