wasm_spec_interpreter/
lib.rs

1//! This library provides a way to interpret Wasm functions in the official Wasm
2//! specification interpreter, written in OCaml, from Rust.
3//!
4//! In order to not break Wasmtime's build, this library will always compile. It
5//! does depend on certain tools (see `README.md`) that may or may not be
6//! available in the environment:
7//!  - when the tools are available, we build and link to an OCaml static
8//!    library (see `with_library` module)
9//!  - when the tools are not available, this library will panic at runtime (see
10//!    `without_library` module).
11
12/// Enumerate the kinds of Wasm values the OCaml interpreter can handle.
13#[derive(Clone, Debug, PartialEq)]
14pub enum SpecValue {
15    I32(i32),
16    I64(i64),
17    F32(i32),
18    F64(i64),
19    V128(Vec<u8>),
20}
21
22/// Represents a WebAssembly export from the OCaml interpreter side.
23pub enum SpecExport {
24    Global(SpecValue),
25    Memory(Vec<u8>),
26}
27
28/// Represents a WebAssembly instance from the OCaml interpreter side.
29pub struct SpecInstance {
30    #[cfg(feature = "has-libinterpret")]
31    repr: ocaml_interop::BoxRoot<SpecInstance>,
32}
33
34#[cfg(feature = "has-libinterpret")]
35mod with_library;
36#[cfg(feature = "has-libinterpret")]
37pub use with_library::*;
38
39#[cfg(not(feature = "has-libinterpret"))]
40mod without_library;
41#[cfg(not(feature = "has-libinterpret"))]
42pub use without_library::*;
43
44// If the user is fuzzing`, we expect the OCaml library to have been built.
45#[cfg(all(fuzzing, not(feature = "has-libinterpret")))]
46compile_error!("The OCaml library was not built.");
47
48/// Check if the OCaml spec interpreter bindings will work.
49pub fn support_compiled_in() -> bool {
50    cfg!(feature = "has-libinterpret")
51}