mirror of
https://github.com/mii443/wasmer.git
synced 2025-08-31 12:49:28 +00:00
166 lines
4.1 KiB
Rust
166 lines
4.1 KiB
Rust
//! Unstable non-standard Wasmer-specific types for the
|
|
//! `wasm_engine_t` and siblings.
|
|
|
|
use super::{
|
|
super::engine::{wasm_config_t, wasmer_engine_t},
|
|
features::wasmer_features_t,
|
|
};
|
|
|
|
/// Unstable non-standard Wasmer-specific API to update the
|
|
/// configuration to specify particular features for the engine.
|
|
///
|
|
/// # Example
|
|
///
|
|
/// ```rust
|
|
/// # use wasmer_inline_c::assert_c;
|
|
/// # fn main() {
|
|
/// # (assert_c! {
|
|
/// # #include "tests/wasmer.h"
|
|
/// #
|
|
/// int main() {
|
|
/// // Create the configuration.
|
|
/// wasm_config_t* config = wasm_config_new();
|
|
///
|
|
/// // Set the target.
|
|
/// {
|
|
/// wasmer_features_t* features = wasmer_features_new();
|
|
/// wasmer_features_simd(features, true);
|
|
///
|
|
/// wasm_config_set_features(config, features);
|
|
/// }
|
|
///
|
|
/// // Create the engine.
|
|
/// wasm_engine_t* engine = wasm_engine_new_with_config(config);
|
|
///
|
|
/// // Check we have an engine!
|
|
/// assert(engine);
|
|
///
|
|
/// // Free everything.
|
|
/// wasm_engine_delete(engine);
|
|
///
|
|
/// return 0;
|
|
/// }
|
|
/// # })
|
|
/// # .success();
|
|
/// # }
|
|
/// ```
|
|
#[no_mangle]
|
|
pub extern "C" fn wasm_config_set_features(
|
|
config: &mut wasm_config_t,
|
|
features: Box<wasmer_features_t>,
|
|
) {
|
|
config.features = Some(features);
|
|
}
|
|
|
|
/// Check whether there is no compiler available in this compiled
|
|
/// library.
|
|
#[no_mangle]
|
|
pub extern "C" fn wasmer_is_headless() -> bool {
|
|
!cfg!(feature = "compiler")
|
|
}
|
|
|
|
/// Check whether the given engine is available, i.e. part of this
|
|
/// compiled library.
|
|
#[no_mangle]
|
|
pub extern "C" fn wasmer_is_engine_available(engine: wasmer_engine_t) -> bool {
|
|
match engine {
|
|
wasmer_engine_t::UNIVERSAL => cfg!(feature = "sys"),
|
|
wasmer_engine_t::V8 => cfg!(feature = "v8"),
|
|
wasmer_engine_t::WASMI => cfg!(feature = "wasmi"),
|
|
wasmer_engine_t::WAMR => cfg!(feature = "wamr"),
|
|
wasmer_engine_t::JSC => cfg!(feature = "wasmi"),
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
mod tests {
|
|
#[cfg(not(target_os = "windows"))]
|
|
use inline_c::assert_c;
|
|
use std::env::{remove_var, set_var};
|
|
#[cfg(target_os = "windows")]
|
|
use wasmer_inline_c::assert_c;
|
|
|
|
#[test]
|
|
fn test_wasmer_is_headless() {
|
|
set_var(
|
|
"COMPILER",
|
|
if cfg!(feature = "compiler") { "0" } else { "1" },
|
|
);
|
|
|
|
(assert_c! {
|
|
#include "tests/wasmer.h"
|
|
#include <stdlib.h>
|
|
|
|
int main() {
|
|
assert(wasmer_is_headless() == (getenv("COMPILER")[0] == '1'));
|
|
|
|
return 0;
|
|
}
|
|
})
|
|
.success();
|
|
|
|
remove_var("COMPILER");
|
|
}
|
|
|
|
#[test]
|
|
fn test_wasmer_is_compiler_available() {
|
|
set_var(
|
|
"CRANELIFT",
|
|
if cfg!(feature = "cranelift") {
|
|
"1"
|
|
} else {
|
|
"0"
|
|
},
|
|
);
|
|
set_var("LLVM", if cfg!(feature = "llvm") { "1" } else { "0" });
|
|
set_var(
|
|
"SINGLEPASS",
|
|
if cfg!(feature = "singlepass") {
|
|
"1"
|
|
} else {
|
|
"0"
|
|
},
|
|
);
|
|
|
|
(assert_c! {
|
|
#include "tests/wasmer.h"
|
|
#include <stdlib.h>
|
|
|
|
int main() {
|
|
assert(wasmer_is_compiler_available(CRANELIFT) == (getenv("CRANELIFT")[0] == '1'));
|
|
assert(wasmer_is_compiler_available(LLVM) == (getenv("LLVM")[0] == '1'));
|
|
assert(wasmer_is_compiler_available(SINGLEPASS) == (getenv("SINGLEPASS")[0] == '1'));
|
|
|
|
return 0;
|
|
}
|
|
})
|
|
.success();
|
|
|
|
remove_var("CRANELIFT");
|
|
remove_var("LLVM");
|
|
remove_var("SINGLEPASS");
|
|
}
|
|
|
|
#[test]
|
|
fn test_wasmer_is_engine_available() {
|
|
set_var(
|
|
"UNIVERSAL",
|
|
if cfg!(feature = "compiler") { "1" } else { "0" },
|
|
);
|
|
|
|
(assert_c! {
|
|
#include "tests/wasmer.h"
|
|
#include <stdlib.h>
|
|
|
|
int main() {
|
|
assert(wasmer_is_engine_available(UNIVERSAL) == (getenv("UNIVERSAL")[0] == '1'));
|
|
|
|
return 0;
|
|
}
|
|
})
|
|
.success();
|
|
|
|
remove_var("UNIVERSAL");
|
|
}
|
|
}
|