wasmtime_c_api/
externref.rs1use crate::WasmtimeStoreContextMut;
2use std::ffi::c_void;
3use std::mem::MaybeUninit;
4use wasmtime::{ExternRef, RootScope};
5
6crate::anyref::ref_wrapper!({
7 wasmtime: ExternRef,
8 capi: wasmtime_externref_t,
9 clone: wasmtime_externref_clone,
10 unroot: wasmtime_externref_unroot,
11 to_raw: wasmtime_externref_to_raw,
12 from_raw: wasmtime_externref_from_raw,
13});
14
15#[unsafe(no_mangle)]
16pub extern "C" fn wasmtime_externref_new(
17 cx: WasmtimeStoreContextMut<'_>,
18 data: *mut c_void,
19 finalizer: Option<extern "C" fn(*mut c_void)>,
20 out: &mut MaybeUninit<wasmtime_externref_t>,
21) -> bool {
22 let mut scope = RootScope::new(cx);
23 let e = match ExternRef::new(&mut scope, crate::ForeignData { data, finalizer }) {
24 Ok(e) => e,
25 Err(_) => return false,
26 };
27 let e = e.to_owned_rooted(&mut scope).expect("in scope");
28 crate::initialize(out, Some(e).into());
29 true
30}
31
32#[unsafe(no_mangle)]
33pub unsafe extern "C" fn wasmtime_externref_data(
34 cx: WasmtimeStoreContextMut<'_>,
35 externref: Option<&wasmtime_externref_t>,
36) -> *mut c_void {
37 externref
38 .and_then(|e| e.as_wasmtime())
39 .and_then(|e| {
40 let data = e.data(cx).ok()??;
41 Some(data.downcast_ref::<crate::ForeignData>().unwrap().data)
42 })
43 .unwrap_or(core::ptr::null_mut())
44}