Skip to main content

wasmtime_c_api/
externref.rs

1use 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}