wasmparser_nostd/readers/component/
canonicals.rs1use crate::limits::MAX_WASM_CANONICAL_OPTIONS;
2use crate::{BinaryReader, FromReader, Result, SectionLimited};
3use ::alloc::boxed::Box;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub enum CanonicalOption {
8 UTF8,
10 UTF16,
12 CompactUTF16,
14 Memory(u32),
18 Realloc(u32),
23 PostReturn(u32),
26}
27
28#[derive(Debug, Clone)]
30pub enum CanonicalFunction {
31 Lift {
33 core_func_index: u32,
35 type_index: u32,
37 options: Box<[CanonicalOption]>,
39 },
40 Lower {
42 func_index: u32,
44 options: Box<[CanonicalOption]>,
46 },
47}
48
49pub type ComponentCanonicalSectionReader<'a> = SectionLimited<'a, CanonicalFunction>;
51
52impl<'a> FromReader<'a> for CanonicalFunction {
53 fn from_reader(reader: &mut BinaryReader<'a>) -> Result<CanonicalFunction> {
54 Ok(match reader.read_u8()? {
55 0x00 => match reader.read_u8()? {
56 0x00 => {
57 let core_func_index = reader.read_var_u32()?;
58 let options = reader
59 .read_iter(MAX_WASM_CANONICAL_OPTIONS, "canonical options")?
60 .collect::<Result<_>>()?;
61 let type_index = reader.read_var_u32()?;
62 CanonicalFunction::Lift {
63 core_func_index,
64 options,
65 type_index,
66 }
67 }
68 x => return reader.invalid_leading_byte(x, "canonical function lift"),
69 },
70 0x01 => match reader.read_u8()? {
71 0x00 => CanonicalFunction::Lower {
72 func_index: reader.read_var_u32()?,
73 options: reader
74 .read_iter(MAX_WASM_CANONICAL_OPTIONS, "canonical options")?
75 .collect::<Result<_>>()?,
76 },
77 x => return reader.invalid_leading_byte(x, "canonical function lower"),
78 },
79 x => return reader.invalid_leading_byte(x, "canonical function"),
80 })
81 }
82}
83
84impl<'a> FromReader<'a> for CanonicalOption {
85 fn from_reader(reader: &mut BinaryReader<'a>) -> Result<Self> {
86 Ok(match reader.read_u8()? {
87 0x00 => CanonicalOption::UTF8,
88 0x01 => CanonicalOption::UTF16,
89 0x02 => CanonicalOption::CompactUTF16,
90 0x03 => CanonicalOption::Memory(reader.read_var_u32()?),
91 0x04 => CanonicalOption::Realloc(reader.read_var_u32()?),
92 0x05 => CanonicalOption::PostReturn(reader.read_var_u32()?),
93 x => return reader.invalid_leading_byte(x, "canonical option"),
94 })
95 }
96}