wasm/core/decoding/
error.rs1use core::{error, fmt, str};
2
3use crate::core::decoding::modules::sections::SectionTy;
4
5#[derive(Debug, PartialEq, Eq, Clone)]
6pub enum DecodingError {
7 InvalidMagic,
9 InvalidBinaryFormatVersion,
11 Eof,
13
14 MalformedUtf8(str::Utf8Error),
16 MalformedSectionTypeDiscriminator(u8),
18 MalformedNumTypeDiscriminator(u8),
20 MalformedVecTypeDiscriminator(u8),
22 MalformedFuncTypeDiscriminator(u8),
24 MalformedRefTypeDiscriminator(u8),
26 MalformedValType,
28 MalformedExportDescDiscriminator(u8),
30 MalformedImportDescDiscriminator(u8),
32 MalformedLimitsDiscriminator(u8),
34 MalformedMutDiscriminator(u8),
36 MalformedBlockTypeTypeIdx(i64),
38 MalformedVariableLengthInteger,
40 MalformedElemKindDiscriminator(u8),
42 I33IsNegative,
46 TooManyLocals(u64),
48 SectionSizeMismatch,
51 SectionOutOfOrder(SectionTy),
53}
54
55impl error::Error for DecodingError {}
56
57impl fmt::Display for DecodingError {
58 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
59 match self {
60 DecodingError::InvalidMagic => write!(f, "The magic number is invalid"),
61 DecodingError::InvalidBinaryFormatVersion => write!(f, "The Wasm binary format version is invalid"),
62 DecodingError::Eof => write!(f, "The end of the Wasm bytecode was reached unexpectedly"),
63 DecodingError::MalformedUtf8(utf8_error) => write!(f, "Failed to parse a UTF-8 string: {utf8_error}"),
64 DecodingError::MalformedSectionTypeDiscriminator(byte) => write!(f, "Failed to parse {byte:#x} as a section type discriminator"),
65 DecodingError::MalformedNumTypeDiscriminator(byte) => write!(f, "Failed to parse {byte:#x} as a number type discriminator"),
66 DecodingError::MalformedVecTypeDiscriminator(byte) => write!(f, "Failed to parse {byte:#x} as a vector type discriminator"),
67 DecodingError::MalformedFuncTypeDiscriminator(byte) => write!(f, "Failed to parse {byte:#x} as a function type discriminator"),
68 DecodingError::MalformedRefTypeDiscriminator(byte) => write!(f, "Failed to parse {byte:#x} as a reference type discriminator"),
69 DecodingError::MalformedValType => write!(f, "Failed to read a value type because it is neither a number, reference or vector type"),
70 DecodingError::MalformedExportDescDiscriminator(byte) => write!(f, "Failed to parse {byte:#x} as an export description discriminator"),
71 DecodingError::MalformedImportDescDiscriminator(byte) => write!(f, "Failed to parse {byte:#x} as an import description discriminator"),
72 DecodingError::MalformedLimitsDiscriminator(byte) => write!(f, "Failed to parse {byte:#x} as a limits type discriminator"),
73 DecodingError::MalformedMutDiscriminator(byte) => write!(f, "Failed to parse {byte:#x} as a mute type discriminator"),
74 DecodingError::MalformedBlockTypeTypeIdx(idx) => write!(f, "The type index {idx} which is encoded as a singed 33-bit integer inside a block type is malformed"),
75 DecodingError::MalformedVariableLengthInteger => write!(f, "Reading a variable-length integer overflowed"),
76 DecodingError::MalformedElemKindDiscriminator(byte) => write!(f, "Failed to parse {byte:#x} as an element kind discriminator"),
77 DecodingError::I33IsNegative => f.write_str("An i33 type is negative which is not allowed"),
78 DecodingError::TooManyLocals(n) => write!(f,"There are {n} locals and this exceeds the maximum allowed number of 2^32-1"),
79 DecodingError::SectionSizeMismatch => f.write_str("A section's contents were successfully decoded, but either too many or not enough bytes of the section's bytecode were consumed."),
80 DecodingError::SectionOutOfOrder(ty) => write!(f, "A section of type `{ty:?}` is defined out of order"),
81 }
82 }
83}