wasmtime_c_api/types/
table.rs1use crate::{wasm_externtype_t, wasm_limits_t, wasm_valtype_t, CExternType};
2use std::cell::OnceCell;
3use wasmtime::{TableType, ValType};
4
5#[repr(transparent)]
6#[derive(Clone)]
7pub struct wasm_tabletype_t {
8 ext: wasm_externtype_t,
9}
10
11wasmtime_c_api_macros::declare_ty!(wasm_tabletype_t);
12
13#[derive(Clone)]
14pub(crate) struct CTableType {
15 pub(crate) ty: TableType,
16 element_cache: OnceCell<wasm_valtype_t>,
17 limits_cache: OnceCell<wasm_limits_t>,
18}
19
20impl wasm_tabletype_t {
21 pub(crate) fn new(ty: TableType) -> wasm_tabletype_t {
22 wasm_tabletype_t {
23 ext: wasm_externtype_t::from_extern_type(ty.into()),
24 }
25 }
26
27 pub(crate) fn try_from(e: &wasm_externtype_t) -> Option<&wasm_tabletype_t> {
28 match &e.which {
29 CExternType::Table(_) => Some(unsafe { &*(e as *const _ as *const _) }),
30 _ => None,
31 }
32 }
33
34 pub(crate) fn ty(&self) -> &CTableType {
35 match &self.ext.which {
36 CExternType::Table(f) => &f,
37 _ => unsafe { std::hint::unreachable_unchecked() },
38 }
39 }
40}
41
42impl CTableType {
43 pub(crate) fn new(ty: TableType) -> CTableType {
44 CTableType {
45 ty,
46 element_cache: OnceCell::new(),
47 limits_cache: OnceCell::new(),
48 }
49 }
50}
51
52#[unsafe(no_mangle)]
53pub extern "C" fn wasm_tabletype_new(
54 ty: Box<wasm_valtype_t>,
55 limits: &wasm_limits_t,
56) -> Option<Box<wasm_tabletype_t>> {
57 let ty = ty.ty.as_ref()?.clone();
58 Some(Box::new(wasm_tabletype_t::new(TableType::new(
59 ty,
60 limits.min,
61 limits.max(),
62 ))))
63}
64
65#[unsafe(no_mangle)]
66pub extern "C" fn wasm_tabletype_element(tt: &wasm_tabletype_t) -> &wasm_valtype_t {
67 let tt = tt.ty();
68 tt.element_cache.get_or_init(|| wasm_valtype_t {
69 ty: ValType::Ref(tt.ty.element().clone()),
70 })
71}
72
73#[unsafe(no_mangle)]
74pub extern "C" fn wasm_tabletype_limits(tt: &wasm_tabletype_t) -> &wasm_limits_t {
75 let tt = tt.ty();
76 tt.limits_cache.get_or_init(|| wasm_limits_t {
77 min: u32::try_from(tt.ty.minimum()).unwrap(),
78 max: u32::try_from(tt.ty.maximum().unwrap_or(u64::from(u32::MAX))).unwrap(),
79 })
80}
81
82#[unsafe(no_mangle)]
83pub extern "C" fn wasm_tabletype_as_externtype(ty: &wasm_tabletype_t) -> &wasm_externtype_t {
84 &ty.ext
85}
86
87#[unsafe(no_mangle)]
88pub extern "C" fn wasm_tabletype_as_externtype_const(ty: &wasm_tabletype_t) -> &wasm_externtype_t {
89 &ty.ext
90}