Add an example #[wasmtime] Rust macro (#283)

This commit adds a `wasmtime-rust` crate to the `misc` folder next to
the previously added Python extension. The intention is that this
showcases loading a WebAssembly file natively in Rust and how with an
attribute macro it can feel lightweight in terms of boilerplate.

The macro itself is pretty non-featureful today beyond the bare bones to
get anything working, but there's all sorts of possibilities like
JIT-compiled entry stubs we could eventually do with all the type
information!
This commit is contained in:
Alex Crichton
2019-08-19 12:45:42 -05:00
committed by Till Schneidereit
parent 54dd085e27
commit d1b1500d19
9 changed files with 309 additions and 1 deletions

View File

@@ -0,0 +1,47 @@
pub use wasmtime_rust_macro::wasmtime;
// modules used by the macro
#[doc(hidden)]
pub mod __rt {
pub use cranelift_codegen;
pub use cranelift_native;
pub use failure;
pub use wasmtime_interface_types;
pub use wasmtime_jit;
use std::convert::{TryFrom, TryInto};
use wasmtime_interface_types::Value;
pub trait FromVecValue: Sized {
fn from(list: Vec<Value>) -> Result<Self, failure::Error>;
}
macro_rules! tuple {
($(($($a:ident),*),)*) => ($(
impl<$($a: TryFrom<Value>),*> FromVecValue for ($($a,)*)
where $(failure::Error: From<$a::Error>,)*
{
#[allow(non_snake_case)]
fn from(list: Vec<Value>) -> Result<Self, failure::Error> {
let mut iter = list.into_iter();
$(
let $a = iter.next()
.ok_or_else(|| failure::format_err!("not enough values"))?
.try_into()?;
)*
if iter.next().is_some() {
failure::format_err!("too many return values");
}
Ok(($($a,)*))
}
}
)*)
}
tuple! {
(),
(A),
(A, B),
(A, B, C),
}
}