pub use super::unstable::engine::wasm_config_set_features;
use super::unstable::features::wasmer_features_t;
use wasmer_api::{BackendKind, Engine};
mod config;
#[allow(unused_imports)]
pub use config::*;
#[derive(Debug, Copy, Clone)]
#[repr(C)]
#[allow(non_camel_case_types)]
pub enum wasmer_backend_t {
CRANELIFT = 0,
LLVM,
SINGLEPASS,
HEADLESS,
V8,
WASMI,
WAMR,
JSC,
}
impl From<BackendKind> for wasmer_backend_t {
fn from(value: BackendKind) -> Self {
match value {
#[cfg(feature = "cranelift")]
BackendKind::Cranelift => Self::CRANELIFT,
#[cfg(feature = "llvm")]
BackendKind::LLVM => Self::LLVM,
#[cfg(feature = "singlepass")]
BackendKind::Singlepass => Self::SINGLEPASS,
#[cfg(feature = "sys")]
BackendKind::Headless => Self::HEADLESS,
#[cfg(feature = "wamr")]
BackendKind::Wamr => Self::WAMR,
#[cfg(feature = "wasmi")]
BackendKind::Wasmi => Self::WASMI,
#[cfg(feature = "v8")]
BackendKind::V8 => Self::V8,
#[cfg(feature = "jsc")]
BackendKind::Jsc => Self::JSC,
v => panic!("Unsupported backend kind {v:?}"),
}
}
}
impl Default for wasmer_backend_t {
fn default() -> Self {
wasmer_api::BackendKind::default().into()
}
}
#[repr(C)]
#[derive(Default)]
pub struct wasm_engine_t {
pub(crate) inner: Engine,
}
#[unsafe(no_mangle)]
#[allow(unreachable_code)]
pub extern "C" fn wasm_engine_new() -> Box<wasm_engine_t> {
Box::new(wasm_engine_t::default())
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn wasm_engine_delete(_engine: Option<Box<wasm_engine_t>>) {}
#[unsafe(no_mangle)]
pub extern "C" fn wasm_engine_new_with_config(
config: Option<Box<wasm_config_t>>,
) -> Option<Box<wasm_engine_t>> {
#[allow(unused)]
let config = *(config?);
match config.backend {
#[cfg(feature = "llvm")]
wasmer_backend_t::LLVM => config::sys::wasm_sys_engine_new_with_config(config),
#[cfg(feature = "cranelift")]
wasmer_backend_t::CRANELIFT => config::sys::wasm_sys_engine_new_with_config(config),
#[cfg(feature = "singlepass")]
wasmer_backend_t::SINGLEPASS => config::sys::wasm_sys_engine_new_with_config(config),
#[cfg(feature = "sys")]
wasmer_backend_t::HEADLESS => config::sys::wasm_sys_engine_new_with_config(config),
#[cfg(feature = "v8")]
wasmer_backend_t::V8 => config::v8::wasm_v8_engine_new_with_config(config),
#[cfg(feature = "wasmi")]
wasmer_backend_t::WASMI => config::wasmi::wasm_wasmi_engine_new_with_config(config),
#[cfg(feature = "wamr")]
wasmer_backend_t::WAMR => config::wamr::wasm_wamr_engine_new_with_config(config),
#[cfg(feature = "jsc")]
wasmer_backend_t::JSC => config::jsc::wasm_jsc_engine_new_with_config(config),
#[allow(unreachable_patterns)]
_ => unreachable!(),
}
}
#[derive(Debug, Default)]
#[repr(C)]
pub struct wasm_config_t {
pub(super) backend: wasmer_backend_t,
pub(super) backend_config: wasmer_backend_config_t,
pub(super) features: Option<Box<wasmer_features_t>>,
}
#[unsafe(no_mangle)]
pub extern "C" fn wasm_config_new() -> Box<wasm_config_t> {
Box::<wasm_config_t>::default()
}
#[unsafe(no_mangle)]
pub extern "C" fn wasm_config_delete(_config: Option<Box<wasm_config_t>>) {}
#[unsafe(no_mangle)]
pub extern "C" fn wasm_config_set_backend(config: &mut wasm_config_t, engine: wasmer_backend_t) {
config.backend = engine;
}
#[cfg(test)]
mod tests {
#[cfg(not(target_os = "windows"))]
use inline_c::assert_c;
#[cfg(target_os = "windows")]
use wasmer_inline_c::assert_c;
#[allow(
unexpected_cfgs,
reason = "tools like cargo-llvm-coverage pass --cfg coverage"
)]
#[cfg_attr(coverage_nightly, coverage(off))]
#[test]
fn test_engine_new() {
(assert_c! {
#include "tests/wasmer.h"
int main() {
wasm_engine_t* engine = wasm_engine_new();
assert(engine);
wasm_engine_delete(engine);
return 0;
}
})
.success();
}
}