xref: /wasmtime-44.0.1/crates/c-api/src/types/val.rs (revision 0dbb6f3d)
1 use wasmtime::{HeapType, ValType};
2 
3 #[repr(C)]
4 #[derive(Clone)]
5 pub struct wasm_valtype_t {
6     pub(crate) ty: ValType,
7 }
8 
9 wasmtime_c_api_macros::declare_ty!(wasm_valtype_t);
10 
11 pub type wasm_valkind_t = u8;
12 pub const WASM_I32: wasm_valkind_t = 0;
13 pub const WASM_I64: wasm_valkind_t = 1;
14 pub const WASM_F32: wasm_valkind_t = 2;
15 pub const WASM_F64: wasm_valkind_t = 3;
16 pub const WASM_EXTERNREF: wasm_valkind_t = 128;
17 pub const WASM_FUNCREF: wasm_valkind_t = 129;
18 
19 #[unsafe(no_mangle)]
wasm_valtype_new(kind: wasm_valkind_t) -> Box<wasm_valtype_t>20 pub extern "C" fn wasm_valtype_new(kind: wasm_valkind_t) -> Box<wasm_valtype_t> {
21     Box::new(wasm_valtype_t {
22         ty: into_valtype(kind),
23     })
24 }
25 
26 #[unsafe(no_mangle)]
wasm_valtype_kind(vt: &wasm_valtype_t) -> wasm_valkind_t27 pub extern "C" fn wasm_valtype_kind(vt: &wasm_valtype_t) -> wasm_valkind_t {
28     from_valtype(&vt.ty)
29 }
30 
into_valtype(kind: wasm_valkind_t) -> ValType31 pub(crate) fn into_valtype(kind: wasm_valkind_t) -> ValType {
32     match kind {
33         WASM_I32 => ValType::I32,
34         WASM_I64 => ValType::I64,
35         WASM_F32 => ValType::F32,
36         WASM_F64 => ValType::F64,
37         WASM_EXTERNREF => ValType::EXTERNREF,
38         WASM_FUNCREF => ValType::FUNCREF,
39         WASMTIME_V128 => ValType::V128,
40         _ => panic!("unexpected kind: {kind}"),
41     }
42 }
43 
from_valtype(ty: &ValType) -> wasm_valkind_t44 pub(crate) fn from_valtype(ty: &ValType) -> wasm_valkind_t {
45     match ty {
46         ValType::I32 => WASM_I32,
47         ValType::I64 => WASM_I64,
48         ValType::F32 => WASM_F32,
49         ValType::F64 => WASM_F64,
50         ValType::V128 => WASMTIME_V128,
51         ValType::Ref(r) => match (r.is_nullable(), r.heap_type()) {
52             (true, HeapType::Extern) => WASM_EXTERNREF,
53             (true, HeapType::Func) => WASM_FUNCREF,
54             _ => crate::abort("support for non-externref and non-funcref references"),
55         },
56     }
57 }
58 
59 pub type wasmtime_valkind_t = u8;
60 pub const WASMTIME_I32: wasmtime_valkind_t = 0;
61 pub const WASMTIME_I64: wasmtime_valkind_t = 1;
62 pub const WASMTIME_F32: wasmtime_valkind_t = 2;
63 pub const WASMTIME_F64: wasmtime_valkind_t = 3;
64 pub const WASMTIME_V128: wasmtime_valkind_t = 4;
65 pub const WASMTIME_FUNCREF: wasmtime_valkind_t = 5;
66 pub const WASMTIME_EXTERNREF: wasmtime_valkind_t = 6;
67 pub const WASMTIME_ANYREF: wasmtime_valkind_t = 7;
68 pub const WASMTIME_EXNREF: wasmtime_valkind_t = 8;
69