From ded3132b445475d37f9c43daa0b149c557eedbf5 Mon Sep 17 00:00:00 2001 From: Ivan Enderlin Date: Tue, 6 Oct 2020 11:09:35 +0200 Subject: [PATCH] feat(c-api) Implement `wat2wasm`. --- Makefile | 12 ++++++------ lib/c-api/Cargo.toml | 2 ++ lib/c-api/build.rs | 1 + lib/c-api/src/wasm_c_api/mod.rs | 2 ++ lib/c-api/src/wasm_c_api/wat.rs | 30 ++++++++++++++++++++++++++++++ lib/c-api/wasmer_wasm.h | 8 ++++++++ 6 files changed, 49 insertions(+), 6 deletions(-) create mode 100644 lib/c-api/src/wasm_c_api/wat.rs diff --git a/Makefile b/Makefile index 3cb273b8abb..b4217370ae7 100644 --- a/Makefile +++ b/Makefile @@ -76,15 +76,15 @@ build-capi: build-capi-cranelift build-capi-singlepass: cargo build --manifest-path lib/c-api/Cargo.toml --release \ - --no-default-features --features jit,singlepass,wasi + --no-default-features --features wat,jit,singlepass,wasi build-capi-cranelift: cargo build --manifest-path lib/c-api/Cargo.toml --release \ - --no-default-features --features jit,cranelift,wasi + --no-default-features --features wat,jit,cranelift,wasi build-capi-llvm: cargo build --manifest-path lib/c-api/Cargo.toml --release \ - --no-default-features --features jit,llvm,wasi + --no-default-features --features wat,jit,llvm,wasi ########### @@ -112,15 +112,15 @@ test-packages: test-capi-singlepass: build-capi-singlepass cargo test --manifest-path lib/c-api/Cargo.toml --release \ - --no-default-features --features jit,singlepass,wasi -- --nocapture + --no-default-features --features wat,jit,singlepass,wasi -- --nocapture test-capi-cranelift: build-capi-cranelift cargo test --manifest-path lib/c-api/Cargo.toml --release \ - --no-default-features --features jit,cranelift,wasi -- --nocapture + --no-default-features --features wat,jit,cranelift,wasi -- --nocapture test-capi-llvm: build-capi-llvm cargo test --manifest-path lib/c-api/Cargo.toml --release \ - --no-default-features --features jit,llvm,wasi -- --nocapture + --no-default-features --features wat,jit,llvm,wasi -- --nocapture test-capi: test-capi-singlepass test-capi-cranelift test-capi-llvm diff --git a/lib/c-api/Cargo.toml b/lib/c-api/Cargo.toml index 4bc32e47fdb..d33425c466e 100644 --- a/lib/c-api/Cargo.toml +++ b/lib/c-api/Cargo.toml @@ -40,9 +40,11 @@ paste = "0.1" [features] default = [ + "wat", "cranelift", "wasi", ] +wat = ["wasmer/wat"] wasi = ["wasmer-wasi", "typetag", "serde"] engine = [] jit = [ diff --git a/lib/c-api/build.rs b/lib/c-api/build.rs index 683c62f85c6..3f7c96ef8be 100644 --- a/lib/c-api/build.rs +++ b/lib/c-api/build.rs @@ -374,4 +374,5 @@ fn exclude_items_from_wasm_c_api(builder: Builder) -> Builder { .exclude_item("wasi_get_start_function") .exclude_item("wasi_get_wasi_version") .exclude_item("wasi_version_t") + .exclude_item("wat2wasm") } diff --git a/lib/c-api/src/wasm_c_api/mod.rs b/lib/c-api/src/wasm_c_api/mod.rs index 9d9d26485d5..de528d8bce8 100644 --- a/lib/c-api/src/wasm_c_api/mod.rs +++ b/lib/c-api/src/wasm_c_api/mod.rs @@ -29,3 +29,5 @@ pub mod value; #[cfg(feature = "wasi")] pub mod wasi; + +pub mod wat; diff --git a/lib/c-api/src/wasm_c_api/wat.rs b/lib/c-api/src/wasm_c_api/wat.rs new file mode 100644 index 00000000000..d093cd650ed --- /dev/null +++ b/lib/c-api/src/wasm_c_api/wat.rs @@ -0,0 +1,30 @@ +use super::types::wasm_byte_vec_t; + +/// Parses in-memory bytes as either the WAT format, or a binary Wasm +/// module. This is wasmer-specific. +/// +/// In case of failure, `wat2wasm` returns `NULL`. +#[cfg(feature = "wat")] +#[no_mangle] +pub unsafe extern "C" fn wat2wasm(wat: &wasm_byte_vec_t) -> Option> { + let wat: &[u8] = wat.into_slice()?; + + let result = match wasmer::wat2wasm(wat) { + Ok(result) => result, + Err(error) => { + crate::error::update_last_error(error); + + return None; + } + }; + + let mut result: Vec = result.into_owned(); + result.shrink_to_fit(); + + let wasm = wasm_byte_vec_t { + size: result.len(), + data: result.as_mut_ptr(), + }; + + Some(Box::new(wasm)) +} diff --git a/lib/c-api/wasmer_wasm.h b/lib/c-api/wasmer_wasm.h index 4201bdd54ac..8e44602c9d8 100644 --- a/lib/c-api/wasmer_wasm.h +++ b/lib/c-api/wasmer_wasm.h @@ -177,4 +177,12 @@ int wasmer_last_error_length(void); */ int wasmer_last_error_message(char *buffer, int length); +/** + * Parses in-memory bytes as either the WAT format, or a binary Wasm + * module. This is wasmer-specific. + * + * In case of failure, `wat2wasm` returns `NULL`. + */ +wasm_byte_vec_t *wat2wasm(const wasm_byte_vec_t *wat); + #endif /* WASMER_WASM_H */