use crate::TrapCode;
use wasmparser::ValType;
use wasmtime::Trap;
pub(super) fn map_anyhow_error(err: anyhow::Error) -> TrapCode {
if let Some(trap) = err.downcast_ref::<Trap>() {
eprintln!("wasmtime trap: {:?}", trap);
use wasmtime::Trap;
match trap {
Trap::StackOverflow => TrapCode::StackOverflow,
Trap::MemoryOutOfBounds => TrapCode::MemoryOutOfBounds,
Trap::HeapMisaligned => TrapCode::MemoryOutOfBounds,
Trap::TableOutOfBounds => TrapCode::TableOutOfBounds,
Trap::IndirectCallToNull => TrapCode::IndirectCallToNull,
Trap::BadSignature => TrapCode::BadSignature,
Trap::IntegerOverflow => TrapCode::IntegerOverflow,
Trap::IntegerDivisionByZero => TrapCode::IntegerDivisionByZero,
Trap::BadConversionToInteger => TrapCode::BadConversionToInteger,
Trap::UnreachableCodeReached => TrapCode::UnreachableCodeReached,
Trap::Interrupt => TrapCode::InterruptionCalled,
Trap::AlwaysTrapAdapter => unreachable!("component model is not supported"),
Trap::OutOfFuel => TrapCode::OutOfFuel,
Trap::AtomicWaitNonSharedMemory => unreachable!("atomics are not supported"),
Trap::NullReference => TrapCode::IndirectCallToNull,
Trap::ArrayOutOfBounds | Trap::AllocationTooLarge => {
unreachable!("GC is not supported")
}
Trap::CastFailure => TrapCode::BadConversionToInteger,
Trap::CannotEnterComponent => unreachable!("component model is not supported"),
Trap::NoAsyncResult => unreachable!("async mode must be disabled"),
_ => unreachable!("unknown Wasmtime trap"),
}
} else if let Some(trap) = err.downcast_ref::<TrapCode>() {
*trap
} else {
eprintln!("wasmtime: unknown error: {:?}", err);
TrapCode::IllegalOpcode
}
}
pub(super) fn map_val_type(val_type: ValType) -> wasmtime::ValType {
match val_type {
ValType::I32 => wasmtime::ValType::I32,
ValType::I64 => wasmtime::ValType::I64,
ValType::F32 => wasmtime::ValType::F32,
ValType::F64 => wasmtime::ValType::F64,
_ => unreachable!("wasmtime: unsupported type: {:?}", val_type),
}
}