ceres_executor/wasmi/
trap.rs

1//! WASMi traps
2use 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}