use std::boxed::Box;
use wasmer_types::entity::PrimaryMap;
use wasmer_types::{SignatureIndex, WasmResult};
pub(crate) type WasmTypes =
PrimaryMap<SignatureIndex, (Box<[wasmparser::ValType]>, Box<[wasmparser::ValType]>)>;
#[derive(Debug)]
pub struct ModuleTranslationState {
pub(crate) wasm_types: WasmTypes,
}
impl ModuleTranslationState {
pub fn new() -> Self {
Self {
wasm_types: PrimaryMap::new(),
}
}
pub fn blocktype_params_results(
&self,
ty_or_ft: wasmparser::BlockType,
) -> WasmResult<(&[wasmparser::ValType], &[wasmparser::ValType])> {
Ok(match ty_or_ft {
wasmparser::BlockType::Type(ty) => match ty {
wasmparser::ValType::I32 => (&[], &[wasmparser::ValType::I32]),
wasmparser::ValType::I64 => (&[], &[wasmparser::ValType::I64]),
wasmparser::ValType::F32 => (&[], &[wasmparser::ValType::F32]),
wasmparser::ValType::F64 => (&[], &[wasmparser::ValType::F64]),
wasmparser::ValType::V128 => (&[], &[wasmparser::ValType::V128]),
wasmparser::ValType::ExternRef => (&[], &[wasmparser::ValType::ExternRef]),
wasmparser::ValType::FuncRef => (&[], &[wasmparser::ValType::FuncRef]),
},
wasmparser::BlockType::FuncType(ty_index) => {
let sig_idx = SignatureIndex::from_u32(ty_index);
let (ref params, ref results) = self.wasm_types[sig_idx];
(params, results)
}
wasmparser::BlockType::Empty => (&[], &[]),
})
}
}