1use crate::declare_entity;
4
5#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
14pub enum Type {
15 I32,
18 I64,
21 F32,
25 F64,
29 V128,
33 FuncRef,
35 TypedFuncRef(bool, u32),
39}
40impl From<wasmparser::ValType> for Type {
41 fn from(ty: wasmparser::ValType) -> Self {
42 match ty {
43 wasmparser::ValType::I32 => Type::I32,
44 wasmparser::ValType::I64 => Type::I64,
45 wasmparser::ValType::F32 => Type::F32,
46 wasmparser::ValType::F64 => Type::F64,
47 wasmparser::ValType::V128 => Type::V128,
48 wasmparser::ValType::Ref(r) => r.into(),
49 }
50 }
51}
52impl From<wasmparser::RefType> for Type {
53 fn from(ty: wasmparser::RefType) -> Self {
54 match ty.type_index() {
55 Some(idx) => {
56 let nullable = ty.is_nullable();
57 Type::TypedFuncRef(nullable, idx.as_module_index().unwrap())
58 }
59 None => Type::FuncRef,
60 }
61 }
62}
63
64impl std::fmt::Display for Type {
65 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
66 match self {
67 Type::I32 => write!(f, "i32"),
68 Type::I64 => write!(f, "i64"),
69 Type::F32 => write!(f, "f32"),
70 Type::F64 => write!(f, "f64"),
71 Type::V128 => write!(f, "v128"),
72 Type::FuncRef => write!(f, "funcref"),
73 Type::TypedFuncRef(nullable, idx) => write!(
74 f,
75 "funcref({}, {})",
76 if *nullable { "null" } else { "not_null" },
77 idx
78 ),
79 }
80 }
81}
82
83impl From<Type> for wasm_encoder::ValType {
84 fn from(ty: Type) -> wasm_encoder::ValType {
85 match ty {
86 Type::I32 => wasm_encoder::ValType::I32,
87 Type::I64 => wasm_encoder::ValType::I64,
88 Type::F32 => wasm_encoder::ValType::F32,
89 Type::F64 => wasm_encoder::ValType::F64,
90 Type::V128 => wasm_encoder::ValType::V128,
91 Type::FuncRef | Type::TypedFuncRef(..) => wasm_encoder::ValType::Ref(ty.into()),
92 }
93 }
94}
95
96impl From<Type> for wasm_encoder::RefType {
97 fn from(ty: Type) -> wasm_encoder::RefType {
98 match ty {
99 Type::FuncRef => wasm_encoder::RefType::FUNCREF,
100 Type::TypedFuncRef(nullable, idx) => wasm_encoder::RefType {
101 nullable,
102 heap_type: wasm_encoder::HeapType::Concrete(idx),
103 },
104 _ => panic!("Cannot convert {:?} into reftype", ty),
105 }
106 }
107}
108
109declare_entity!(Signature, "sig");
114declare_entity!(Func, "func");
116declare_entity!(Global, "global");
118declare_entity!(Table, "table");
120declare_entity!(Memory, "memory");
122
123declare_entity!(Block, "block");
127declare_entity!(Local, "local");
129declare_entity!(Value, "v");
131
132mod module;
133pub use module::*;
134mod func;
135pub use func::*;
136mod value;
137pub use value::*;
138mod display;
139pub use display::*;
140mod debug;
141pub use debug::*;