Add an explicit trap code for wasm unreachable.
This commit is contained in:
@@ -42,6 +42,9 @@ pub enum TrapCode {
|
|||||||
/// Failed float-to-int conversion.
|
/// Failed float-to-int conversion.
|
||||||
BadConversionToInteger,
|
BadConversionToInteger,
|
||||||
|
|
||||||
|
/// Code that was supposed to have been unreachable was reached.
|
||||||
|
UnreachableCodeReached,
|
||||||
|
|
||||||
/// Execution has potentially run too long and may be interrupted.
|
/// Execution has potentially run too long and may be interrupted.
|
||||||
/// This trap is resumable.
|
/// This trap is resumable.
|
||||||
Interrupt,
|
Interrupt,
|
||||||
@@ -63,6 +66,7 @@ impl Display for TrapCode {
|
|||||||
IntegerOverflow => "int_ovf",
|
IntegerOverflow => "int_ovf",
|
||||||
IntegerDivisionByZero => "int_divz",
|
IntegerDivisionByZero => "int_divz",
|
||||||
BadConversionToInteger => "bad_toint",
|
BadConversionToInteger => "bad_toint",
|
||||||
|
UnreachableCodeReached => "unreachable",
|
||||||
Interrupt => "interrupt",
|
Interrupt => "interrupt",
|
||||||
User(x) => return write!(f, "user{}", x),
|
User(x) => return write!(f, "user{}", x),
|
||||||
};
|
};
|
||||||
@@ -85,6 +89,7 @@ impl FromStr for TrapCode {
|
|||||||
"int_ovf" => Ok(IntegerOverflow),
|
"int_ovf" => Ok(IntegerOverflow),
|
||||||
"int_divz" => Ok(IntegerDivisionByZero),
|
"int_divz" => Ok(IntegerDivisionByZero),
|
||||||
"bad_toint" => Ok(BadConversionToInteger),
|
"bad_toint" => Ok(BadConversionToInteger),
|
||||||
|
"unreachable" => Ok(UnreachableCodeReached),
|
||||||
"interrupt" => Ok(Interrupt),
|
"interrupt" => Ok(Interrupt),
|
||||||
_ if s.starts_with("user") => s[4..].parse().map(User).map_err(|_| ()),
|
_ if s.starts_with("user") => s[4..].parse().map(User).map_err(|_| ()),
|
||||||
_ => Err(()),
|
_ => Err(()),
|
||||||
@@ -98,7 +103,7 @@ mod tests {
|
|||||||
use std::string::ToString;
|
use std::string::ToString;
|
||||||
|
|
||||||
// Everything but user-defined codes.
|
// Everything but user-defined codes.
|
||||||
const CODES: [TrapCode; 9] = [
|
const CODES: [TrapCode; 11] = [
|
||||||
TrapCode::StackOverflow,
|
TrapCode::StackOverflow,
|
||||||
TrapCode::HeapOutOfBounds,
|
TrapCode::HeapOutOfBounds,
|
||||||
TrapCode::TableOutOfBounds,
|
TrapCode::TableOutOfBounds,
|
||||||
@@ -108,6 +113,8 @@ mod tests {
|
|||||||
TrapCode::IntegerOverflow,
|
TrapCode::IntegerOverflow,
|
||||||
TrapCode::IntegerDivisionByZero,
|
TrapCode::IntegerDivisionByZero,
|
||||||
TrapCode::BadConversionToInteger,
|
TrapCode::BadConversionToInteger,
|
||||||
|
TrapCode::UnreachableCodeReached,
|
||||||
|
TrapCode::Interrupt,
|
||||||
];
|
];
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
|||||||
@@ -108,9 +108,7 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
|
|||||||
// We do nothing
|
// We do nothing
|
||||||
}
|
}
|
||||||
Operator::Unreachable => {
|
Operator::Unreachable => {
|
||||||
// We use `trap user0` to indicate a user-generated trap.
|
builder.ins().trap(ir::TrapCode::UnreachableCodeReached);
|
||||||
// We could make the trap code configurable if need be.
|
|
||||||
builder.ins().trap(ir::TrapCode::User(0));
|
|
||||||
state.reachable = false;
|
state.reachable = false;
|
||||||
}
|
}
|
||||||
/***************************** Control flow blocks **********************************
|
/***************************** Control flow blocks **********************************
|
||||||
|
|||||||
Reference in New Issue
Block a user