ceres_executor/wasmi/
trap.rs1use crate::{
3 trap::{self, TrapCode},
4 Error,
5};
6use ceres_std::{fmt, Box};
7use wasmi::{Trap, TrapKind};
8
9impl From<Trap> for trap::Trap {
10 fn from(trap: Trap) -> trap::Trap {
11 match trap.kind() {
12 TrapKind::Host(e) => {
13 if let Some(e) = e.downcast_ref::<Error>() {
14 return TrapCode::HostError(Box::new(e.clone())).into();
15 }
16 }
17 _ => {
18 log::info!("{:#?}", trap);
19 }
20 };
21
22 trap::Trap {
23 code: match trap.kind() {
24 TrapKind::StackOverflow => TrapCode::StackOverflow,
25 TrapKind::DivisionByZero => TrapCode::IntegerDivisionByZero,
26 TrapKind::ElemUninitialized => TrapCode::BadSignature,
27 TrapKind::InvalidConversionToInt => TrapCode::BadConversionToInteger,
28 TrapKind::MemoryAccessOutOfBounds => TrapCode::MemoryOutOfBounds,
29 TrapKind::TableAccessOutOfBounds => TrapCode::TableOutOfBounds,
30 TrapKind::UnexpectedSignature => TrapCode::BadSignature,
31 TrapKind::Unreachable => TrapCode::UnreachableCodeReached,
32 TrapKind::Host(e) => {
33 if let Some(e) = e.downcast_ref::<Error>() {
34 return TrapCode::HostError(Box::new(e.clone())).into();
35 } else {
36 TrapCode::Unknown
37 }
38 }
39 },
40 trace: trap.wasm_trace().to_vec(),
41 }
42 }
43}
44
45impl fmt::Display for trap::Trap {
46 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> Result<(), fmt::Error> {
47 let trace = &self.trace;
48 if trace.is_empty() {
49 write!(f, "[]")?;
50 } else {
51 for (index, trace) in trace.iter().enumerate() {
52 if index == trace.len() - 1 {
53 write!(f, "\n\t╰─>")?;
54 } else {
55 write!(f, "\n\t| ")?;
56 }
57 write!(f, "{}", trace)?;
58 }
59 }
60
61 Ok(())
62 }
63}