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    use inline_c::assert_c;
30
31    #[test]
32    fn test_wat2wasm() {
33        (assert_c! {
34            #include "tests/wasmer.h"
35
36            int main() {
37                wasm_byte_vec_t wat;
38                wasmer_byte_vec_new_from_string(&wat, "(module)");
39                wasm_byte_vec_t wasm;
40                wat2wasm(&wat, &wasm);
41
42                assert(wasm.data);
43                assert(wasm.size == 8);
44                assert(
45                    wasm.data[0] == 0 &&
46                        wasm.data[1] == 'a' &&
47                        wasm.data[2] == 's' &&
48                        wasm.data[3] == 'm' &&
49                        wasm.data[4] == 1 &&
50                        wasm.data[5] == 0 &&
51                        wasm.data[6] == 0 &&
52                        wasm.data[7] == 0
53                );
54
55                wasm_byte_vec_delete(&wasm);
56                wasm_byte_vec_delete(&wat);
57
58                return 0;
59            }
60        })
61        .success();
62    }
63
64    #[test]
65    fn test_wat2wasm_failed() {
66        (assert_c! {
67            #include "tests/wasmer.h"
68
69            int main() {
70                wasm_byte_vec_t wat;
71                wasmer_byte_vec_new_from_string(&wat, "(module");
72                wasm_byte_vec_t wasm;
73                wat2wasm(&wat, &wasm);
74
75                assert(!wasm.data);
76                assert(wasmer_last_error_length() > 0);
77
78                wasm_byte_vec_delete(&wat);
79
80                return 0;
81            }
82        })
83        .success();
84    }
85}