1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
use super::ModuleImportType;
use crate::{
engine::DedupFuncType,
errors::{MemoryError, TableError},
Extern,
GlobalType,
Table,
};
use core::{fmt, fmt::Display};
#[derive(Debug)]
pub enum InstantiationError {
ImportsExternalsLenMismatch,
ImportsExternalsMismatch {
expected: ModuleImportType,
actual: Extern,
},
SignatureMismatch {
expected: DedupFuncType,
actual: DedupFuncType,
},
Table(TableError),
Memory(MemoryError),
GlobalTypeMismatch {
expected: GlobalType,
actual: GlobalType,
},
ElementSegmentDoesNotFit {
table: Table,
offset: usize,
amount: usize,
},
FoundStartFn {
index: u32,
},
}
#[cfg(feature = "std")]
impl std::error::Error for InstantiationError {}
impl Display for InstantiationError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Self::ImportsExternalsLenMismatch => write!(
f,
"encountered mismatch between number of given externals and module imports",
),
Self::ImportsExternalsMismatch { expected, actual } => write!(
f,
"expected {:?} external for import but found {:?}",
expected, actual
),
Self::SignatureMismatch { expected, actual } => {
write!(
f,
"expected {:?} function signature but found {:?}",
expected, actual
)
}
Self::GlobalTypeMismatch { expected, actual } => write!(
f,
"expected {:?} global type but found {:?} value type",
expected, actual,
),
Self::ElementSegmentDoesNotFit {
table,
offset,
amount,
} => write!(
f,
"table {:?} does not fit {} elements starting from offset {}",
table, offset, amount,
),
Self::FoundStartFn { index } => {
write!(f, "found an unexpected start function with index {}", index)
}
Self::Table(error) => Display::fmt(error, f),
Self::Memory(error) => Display::fmt(error, f),
}
}
}
impl From<TableError> for InstantiationError {
fn from(error: TableError) -> Self {
Self::Table(error)
}
}
impl From<MemoryError> for InstantiationError {
fn from(error: MemoryError) -> Self {
Self::Memory(error)
}
}