wasmparser/readers/component/
canonicals.rs1use crate::limits::MAX_WASM_CANONICAL_OPTIONS;
2use crate::{BinaryReader, FromReader, Result, SectionLimited};
3
4#[derive(Debug, Clone, Copy, PartialEq, Eq)]
6pub enum CanonicalOption {
7 UTF8,
9 UTF16,
11 CompactUTF16,
13 Memory(u32),
17 Realloc(u32),
22 PostReturn(u32),
25}
26
27#[derive(Debug, Clone)]
29pub enum CanonicalFunction {
30 Lift {
32 core_func_index: u32,
34 type_index: u32,
36 options: Box<[CanonicalOption]>,
38 },
39 Lower {
41 func_index: u32,
43 options: Box<[CanonicalOption]>,
45 },
46}
47
48pub type ComponentCanonicalSectionReader<'a> = SectionLimited<'a, CanonicalFunction>;
50
51impl<'a> FromReader<'a> for CanonicalFunction {
52 fn from_reader(reader: &mut BinaryReader<'a>) -> Result<CanonicalFunction> {
53 Ok(match reader.read_u8()? {
54 0x00 => match reader.read_u8()? {
55 0x00 => {
56 let core_func_index = reader.read_var_u32()?;
57 let options = reader
58 .read_iter(MAX_WASM_CANONICAL_OPTIONS, "canonical options")?
59 .collect::<Result<_>>()?;
60 let type_index = reader.read_var_u32()?;
61 CanonicalFunction::Lift {
62 core_func_index,
63 options,
64 type_index,
65 }
66 }
67 x => return reader.invalid_leading_byte(x, "canonical function lift"),
68 },
69 0x01 => match reader.read_u8()? {
70 0x00 => CanonicalFunction::Lower {
71 func_index: reader.read_var_u32()?,
72 options: reader
73 .read_iter(MAX_WASM_CANONICAL_OPTIONS, "canonical options")?
74 .collect::<Result<_>>()?,
75 },
76 x => return reader.invalid_leading_byte(x, "canonical function lower"),
77 },
78 x => return reader.invalid_leading_byte(x, "canonical function"),
79 })
80 }
81}
82
83impl<'a> FromReader<'a> for CanonicalOption {
84 fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
85 Ok(match reader.read_u8()? {
86 0x00 => CanonicalOption::UTF8,
87 0x01 => CanonicalOption::UTF16,
88 0x02 => CanonicalOption::CompactUTF16,
89 0x03 => CanonicalOption::Memory(reader.read_var_u32()?),
90 0x04 => CanonicalOption::Realloc(reader.read_var_u32()?),
91 0x05 => CanonicalOption::PostReturn(reader.read_var_u32()?),
92 x => return reader.invalid_leading_byte(x, "canonical option"),
93 })
94 }
95}