wasmer_c_api/wasm_c_api/
wat.rs

1use super::types::wasm_byte_vec_t;
2
3/// Parses in-memory bytes as either the WAT format, or a binary Wasm
4/// module. This is wasmer-specific.
5///
6/// In case of failure, `wat2wasm` sets the `out->data = NULL` and `out->size = 0`.
7///
8/// # Example
9///
10/// See the module's documentation.
11///
12/// # Safety
13/// This function is unsafe in order to be callable from C.
14#[cfg(feature = "wat")]
15#[unsafe(no_mangle)]
16pub unsafe extern "C" fn wat2wasm(wat: &wasm_byte_vec_t, out: &mut wasm_byte_vec_t) {
17    match wasmer_api::wat2wasm(wat.as_slice()) {
18        Ok(val) => out.set_buffer(val.into_owned()),
19        Err(err) => {
20            crate::error::update_last_error(err);
21            out.data = std::ptr::null_mut();
22            out.size = 0;
23        }
24    };
25}
26
27#[cfg(test)]
28mod tests {
29    #[cfg(not(target_os = "windows"))]
30    use inline_c::assert_c;
31    #[cfg(target_os = "windows")]
32    use wasmer_inline_c::assert_c;
33
34    #[test]
35    fn test_wat2wasm() {
36        (assert_c! {
37            #include "tests/wasmer.h"
38
39            int main() {
40                wasm_byte_vec_t wat;
41                wasmer_byte_vec_new_from_string(&wat, "(module)");
42                wasm_byte_vec_t wasm;
43                wat2wasm(&wat, &wasm);
44
45                assert(wasm.data);
46                assert(wasm.size == 8);
47                assert(
48                    wasm.data[0] == 0 &&
49                        wasm.data[1] == 'a' &&
50                        wasm.data[2] == 's' &&
51                        wasm.data[3] == 'm' &&
52                        wasm.data[4] == 1 &&
53                        wasm.data[5] == 0 &&
54                        wasm.data[6] == 0 &&
55                        wasm.data[7] == 0
56                );
57
58                wasm_byte_vec_delete(&wasm);
59                wasm_byte_vec_delete(&wat);
60
61                return 0;
62            }
63        })
64        .success();
65    }
66
67    #[test]
68    fn test_wat2wasm_failed() {
69        (assert_c! {
70            #include "tests/wasmer.h"
71
72            int main() {
73                wasm_byte_vec_t wat;
74                wasmer_byte_vec_new_from_string(&wat, "(module");
75                wasm_byte_vec_t wasm;
76                wat2wasm(&wat, &wasm);
77
78                assert(!wasm.data);
79                assert(wasmer_last_error_length() > 0);
80
81                wasm_byte_vec_delete(&wat);
82
83                return 0;
84            }
85        })
86        .success();
87    }
88}