DivisionByZero and InvalidConversionToInt

This commit is contained in:
Sergey Pepyakin 2018-01-29 17:46:14 +03:00
parent 4765aecf78
commit 9bce81b7a1
2 changed files with 5 additions and 3 deletions

View File

@ -113,6 +113,8 @@ pub enum Trap {
TableAccessOutOfBounds,
ElemUninitialized,
ElemSignatureMismatch,
DivisionByZero,
InvalidConversionToInt,
}
/// Internal interpreter error.

View File

@ -791,7 +791,7 @@ impl<'a, E: Externals> Interpreter<'a, E> {
.value_stack_mut()
.pop_pair_as::<T>()
.map(|(left, right)| (left.transmute_into(), right.transmute_into()))
.map(|(left, right)| left.div(right))?
.map(|(left, right)| left.div(right).map_err(|_| Error::Trap(Trap::DivisionByZero)))?
.map(|v| v.transmute_into())
.map(|v| context.value_stack_mut().push(v.into()))
.map(|_| InstructionOutcome::RunNextInstruction)
@ -803,7 +803,7 @@ impl<'a, E: Externals> Interpreter<'a, E> {
.value_stack_mut()
.pop_pair_as::<T>()
.map(|(left, right)| (left.transmute_into(), right.transmute_into()))
.map(|(left, right)| left.rem(right))?
.map(|(left, right)| left.rem(right).map_err(|_| Error::Trap(Trap::DivisionByZero)))?
.map(|v| v.transmute_into())
.map(|v| context.value_stack_mut().push(v.into()))
.map(|_| InstructionOutcome::RunNextInstruction)
@ -996,7 +996,7 @@ impl<'a, E: Externals> Interpreter<'a, E> {
context
.value_stack_mut()
.pop_as::<T>()
.and_then(|v| v.try_truncate_into())
.and_then(|v| v.try_truncate_into().map_err(|_| Error::Trap(Trap::InvalidConversionToInt)))
.map(|v| v.transmute_into())
.map(|v| context.value_stack_mut().push(v.into()))
.map(|_| InstructionOutcome::RunNextInstruction)