1 use std::ffi::{c_char, CStr}; 2 3 use anyhow::Context; 4 use wasmtime::component::Component; 5 6 use crate::{wasm_byte_vec_t, wasm_config_t, wasm_engine_t, wasmtime_error_t}; 7 8 #[unsafe(no_mangle)] 9 pub unsafe extern "C" fn wasmtime_config_component_model_set(c: &mut wasm_config_t, enable: bool) { 10 c.config.wasm_component_model(enable); 11 } 12 13 #[derive(Clone)] 14 #[repr(transparent)] 15 pub struct wasmtime_component_t { 16 pub(crate) component: Component, 17 } 18 19 #[unsafe(no_mangle)] 20 #[cfg(any(feature = "cranelift", feature = "winch"))] 21 pub unsafe extern "C" fn wasmtime_component_new( 22 engine: &wasm_engine_t, 23 buf: *const u8, 24 len: usize, 25 component_out: &mut *mut wasmtime_component_t, 26 ) -> Option<Box<wasmtime_error_t>> { 27 let binary = unsafe { crate::slice_from_raw_parts(buf, len) }; 28 crate::handle_result( 29 Component::from_binary(&engine.engine, binary), 30 |component| { 31 *component_out = Box::into_raw(Box::new(wasmtime_component_t { component })); 32 }, 33 ) 34 } 35 36 #[unsafe(no_mangle)] 37 #[cfg(any(feature = "cranelift", feature = "winch"))] 38 pub unsafe extern "C" fn wasmtime_component_serialize( 39 component: &wasmtime_component_t, 40 ret: &mut wasm_byte_vec_t, 41 ) -> Option<Box<wasmtime_error_t>> { 42 crate::handle_result(component.component.serialize(), |buffer| { 43 ret.set_buffer(buffer); 44 }) 45 } 46 47 #[unsafe(no_mangle)] 48 pub unsafe extern "C" fn wasmtime_component_deserialize( 49 engine: &wasm_engine_t, 50 buf: *const u8, 51 len: usize, 52 component_out: &mut *mut wasmtime_component_t, 53 ) -> Option<Box<wasmtime_error_t>> { 54 let binary = unsafe { crate::slice_from_raw_parts(buf, len) }; 55 crate::handle_result( 56 unsafe { Component::deserialize(&engine.engine, binary) }, 57 |component| { 58 *component_out = Box::into_raw(Box::new(wasmtime_component_t { component })); 59 }, 60 ) 61 } 62 63 #[unsafe(no_mangle)] 64 pub unsafe extern "C" fn wasmtime_component_deserialize_file( 65 engine: &wasm_engine_t, 66 path: *const c_char, 67 component_out: &mut *mut wasmtime_component_t, 68 ) -> Option<Box<wasmtime_error_t>> { 69 let path = unsafe { CStr::from_ptr(path) }; 70 let result = path 71 .to_str() 72 .context("input path is not valid utf-8") 73 .and_then(|path| unsafe { Component::deserialize_file(&engine.engine, path) }); 74 crate::handle_result(result, |component| { 75 *component_out = Box::into_raw(Box::new(wasmtime_component_t { component })); 76 }) 77 } 78 79 #[unsafe(no_mangle)] 80 pub unsafe extern "C" fn wasmtime_component_clone( 81 component: &wasmtime_component_t, 82 ) -> Box<wasmtime_component_t> { 83 Box::new(component.clone()) 84 } 85 86 #[unsafe(no_mangle)] 87 pub unsafe extern "C" fn wasmtime_component_delete(_component: Box<wasmtime_component_t>) {} 88