wasmer_wasix/
macros.rs

1//! Macros to simplify some common WASI-specific tasks.
2
3/// Like the `try!` macro or `?` syntax: returns the value if the computation
4/// succeeded or returns the error value.
5macro_rules! wasi_try {
6    ($expr:expr) => {{
7        let res: Result<_, crate::syscalls::types::wasi::Errno> = $expr;
8        match res {
9            Ok(val) => {
10                //tracing::trace!("wasi::wasi_try::val: {:?}", val);
11                val
12            }
13            Err(err) => {
14                //tracing::debug!("wasi::wasi_try::err: {:?}", err);
15                return err;
16            }
17        }
18    }};
19}
20
21/// Like the `try!` macro or `?` syntax: returns the value if the computation
22/// succeeded or returns the error value. Results are wrapped in an Ok
23macro_rules! wasi_try_ok {
24    ($expr:expr) => {{
25        let res: Result<_, crate::syscalls::types::wasi::Errno> = $expr;
26        match res {
27            Ok(val) => {
28                //tracing::trace!("wasi::wasi_try_ok::val: {:?}", val);
29                val
30            }
31            Err(err) => {
32                //tracing::debug!("wasi::wasi_try_ok::err: {:?}", err);
33                return Ok(err);
34            }
35        }
36    }};
37}
38
39macro_rules! wasi_try_ok_ok {
40    ($expr:expr) => {{
41        let res: Result<_, crate::syscalls::types::wasi::Errno> = $expr;
42        match res {
43            Ok(val) => val,
44            Err(err) => {
45                return Ok(Err(err));
46            }
47        }
48    }};
49}
50
51/// Like `wasi_try` but converts a `MemoryAccessError` to a `wasi::Errno`.
52macro_rules! wasi_try_mem {
53    ($expr:expr) => {{ wasi_try!($expr.map_err($crate::mem_error_to_wasi)) }};
54}
55
56/// Like `wasi_try` but converts a `MemoryAccessError` to a `wasi::Errno`.
57macro_rules! wasi_try_mem_ok {
58    ($expr:expr) => {{ wasi_try_ok!($expr.map_err($crate::mem_error_to_wasi)) }};
59
60    ($expr:expr, $thread:expr) => {{ wasi_try_ok!($expr.map_err($crate::mem_error_to_wasi), $thread) }};
61}
62
63/// Like `wasi_try` but converts a `MemoryAccessError` to a `wasi::Errno`.
64macro_rules! wasi_try_mem_ok_ok {
65    ($expr:expr) => {{ wasi_try_ok_ok!($expr.map_err($crate::mem_error_to_wasi)) }};
66
67    ($expr:expr, $thread:expr) => {{ wasi_try_ok_ok!($expr.map_err($crate::mem_error_to_wasi), $thread) }};
68}
69
70/// Reads a string from Wasm memory.
71macro_rules! get_input_str {
72    ($memory:expr, $data:expr, $len:expr) => {{ wasi_try_mem!($data.read_utf8_string($memory, $len)) }};
73}
74
75macro_rules! get_input_str_ok {
76    ($memory:expr, $data:expr, $len:expr) => {{ wasi_try_mem_ok!($data.read_utf8_string($memory, $len)) }};
77}
78
79#[allow(unused_macros)]
80macro_rules! get_input_str_bus {
81    ($memory:expr, $data:expr, $len:expr) => {{ wasi_try_mem_bus!($data.read_utf8_string($memory, $len)) }};
82}
83
84#[allow(unused_macros)]
85macro_rules! get_input_str_bus_ok {
86    ($memory:expr, $data:expr, $len:expr) => {{ wasi_try_mem_bus_ok!($data.read_utf8_string($memory, $len)) }};
87}
88
89macro_rules! wasi_dl_err {
90    ($err:expr, $memory:ident, $err_buf:ident, $err_buf_len:ident) => {
91        wasi_try_mem_ok!(write_dl_error(
92            $err,
93            &$memory,
94            $err_buf,
95            $err_buf_len.into()
96        ));
97
98        // Doesn't matter which errno we return, since the actual code is ignored.
99        return Ok(Errno::Unknown);
100    };
101}
102
103macro_rules! wasi_try_dl {
104    ($expr:expr, $fmt:tt, $memory:ident, $err_buf:ident, $err_buf_len:ident) => {
105        match $expr {
106            Ok(o) => o,
107            Err(err) => {
108                let err = format!($fmt, err);
109                wasi_dl_err!(&err, $memory, $err_buf, $err_buf_len);
110            }
111        }
112    };
113}