wasmer_wasix/syscalls/wasix/
closure_free.rs

1use crate::syscalls::*;
2
3/// Free a previously allocated slot for a closure in the `__indirect_function_table`
4///
5/// After calling this it is undefined behavior to call the function at the given index.
6#[instrument(level = "trace", fields(%closure), ret)]
7pub fn closure_free(
8    mut ctx: FunctionEnvMut<'_, WasiEnv>,
9    closure: u32,
10) -> Result<Errno, WasiError> {
11    WasiEnv::do_pending_operations(&mut ctx)?;
12
13    let (env, mut store) = ctx.data_and_store_mut();
14
15    let Some(linker) = env.inner().linker().cloned() else {
16        error!("Closures only work for dynamic modules.");
17        return Ok(Errno::Notsup);
18    };
19
20    let free_result = linker.free_closure_index(&mut ctx, closure);
21    if let Err(e) = free_result {
22        // Should never happen
23        panic!("Failed to free closure index: {e}");
24    }
25
26    return Ok(Errno::Success);
27}