From 373560b88a1336aa8e24d9ed36f2186f20d4faf2 Mon Sep 17 00:00:00 2001 From: Pat Hickey Date: Mon, 27 Jan 2020 20:28:27 -0800 Subject: [PATCH] and now funcs work again --- crates/generate/src/funcs.rs | 18 ++++++++++-------- crates/generate/src/lib.rs | 2 +- crates/memory/src/guest_type.rs | 1 + 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/crates/generate/src/funcs.rs b/crates/generate/src/funcs.rs index 6f4eebe592..9a3c1d4719 100644 --- a/crates/generate/src/funcs.rs +++ b/crates/generate/src/funcs.rs @@ -74,8 +74,7 @@ pub fn define_func(names: &Names, func: &witx::InterfaceFunc) -> TokenStream { let marshal_args = func .params .iter() - //.map(|p| marshal_arg(names, p, error_handling.clone())); - .map(|_p| quote!(unimplemented!(); )); // FIXME + .map(|p| marshal_arg(names, p, error_handling.clone())); let trait_args = func .params .iter() @@ -99,8 +98,7 @@ pub fn define_func(names: &Names, func: &witx::InterfaceFunc) -> TokenStream { .results .iter() .skip(1) - //.map(|result| marshal_result(names, result, error_handling.clone())); - .map(|_result| (quote!(unimplemented!();), quote!(unimplemented!();))); // FIXME + .map(|result| marshal_result(names, result, error_handling.clone())); let marshal_rets_pre = marshal_rets.clone().map(|(pre, _post)| pre); let marshal_rets_post = marshal_rets.map(|(_pre, post)| post); @@ -218,8 +216,13 @@ fn marshal_result( // core type is given func_ptr_binding name. let ptr_name = names.func_ptr_binding(&result.name); let pre = quote! { - let #ptr_name = match memory.ptr_mut::<#pointee_type>(#ptr_name as u32) { - Ok(p) => p, + let mut #ptr_name = match memory.ptr_mut::<#pointee_type>(#ptr_name as u32) { + Ok(p) => match p.as_ref_mut() { + Ok(r) => r, + Err(e) => { + #error_handling + } + }, Err(e) => { #error_handling } @@ -228,8 +231,7 @@ fn marshal_result( // trait binding returns func_param name. let val_name = names.func_param(&result.name); let post = quote! { - use ::memory::GuestTypeCopy; - #pointee_type::write_val(#val_name, &#ptr_name); + *#ptr_name = #val_name; }; (pre, post) }; diff --git a/crates/generate/src/lib.rs b/crates/generate/src/lib.rs index 15d07cba0c..49d9289d58 100644 --- a/crates/generate/src/lib.rs +++ b/crates/generate/src/lib.rs @@ -34,7 +34,7 @@ pub fn from_witx(args: TokenStream) -> TokenStream { mod #modname { use super::WasiCtx; use super::types::*; - // #(#fs)* + #(#fs)* #modtrait } diff --git a/crates/memory/src/guest_type.rs b/crates/memory/src/guest_type.rs index 1d71e72477..6c2f98795e 100644 --- a/crates/memory/src/guest_type.rs +++ b/crates/memory/src/guest_type.rs @@ -37,6 +37,7 @@ macro_rules! builtin_type { Ok(()) } } + impl GuestTypeCopy for $t {} )* }; }