Dereference pointers and call the hostcall fn
This commit is contained in:
@@ -10,4 +10,3 @@ proc-macro = true
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
syn = { version = "0.15.34", features = ["full"] }
|
syn = { version = "0.15.34", features = ["full"] }
|
||||||
quote = "0.6.12"
|
quote = "0.6.12"
|
||||||
proc-macro2 = "0.4.30"
|
|
||||||
|
|||||||
@@ -2,8 +2,7 @@ extern crate proc_macro;
|
|||||||
|
|
||||||
use proc_macro::TokenStream;
|
use proc_macro::TokenStream;
|
||||||
use quote::quote;
|
use quote::quote;
|
||||||
use std::collections::HashMap;
|
use syn::{ArgCaptured, FnArg, Pat, PatIdent, Type, TypeReference};
|
||||||
use syn::{ArgCaptured, FnArg, Pat, PatIdent, Token, Type, TypeReference};
|
|
||||||
|
|
||||||
#[proc_macro_attribute]
|
#[proc_macro_attribute]
|
||||||
pub fn wasi_common_cbindgen(attr: TokenStream, function: TokenStream) -> TokenStream {
|
pub fn wasi_common_cbindgen(attr: TokenStream, function: TokenStream) -> TokenStream {
|
||||||
@@ -12,13 +11,14 @@ pub fn wasi_common_cbindgen(attr: TokenStream, function: TokenStream) -> TokenSt
|
|||||||
let function = syn::parse_macro_input!(function as syn::ItemFn);
|
let function = syn::parse_macro_input!(function as syn::ItemFn);
|
||||||
|
|
||||||
// generate C fn name prefixed with __wasi_
|
// generate C fn name prefixed with __wasi_
|
||||||
let ident = &function.ident;
|
let fn_ident = &function.ident;
|
||||||
let concatenated = format!("__wasi_{}", ident);
|
let concatenated = format!("__wasi_{}", fn_ident);
|
||||||
let c_fn_ident = syn::Ident::new(&concatenated, ident.span());
|
let c_fn_ident = syn::Ident::new(&concatenated, fn_ident.span());
|
||||||
|
|
||||||
// capture input args
|
// capture input args
|
||||||
let mut arg_ident = Vec::new();
|
let mut arg_ident = Vec::new();
|
||||||
let mut arg_type = Vec::new();
|
let mut arg_type = Vec::new();
|
||||||
|
let mut call_arg_ident = Vec::new();
|
||||||
for input in &function.decl.inputs {
|
for input in &function.decl.inputs {
|
||||||
match input {
|
match input {
|
||||||
FnArg::Captured(ArgCaptured {
|
FnArg::Captured(ArgCaptured {
|
||||||
@@ -35,8 +35,13 @@ pub fn wasi_common_cbindgen(attr: TokenStream, function: TokenStream) -> TokenSt
|
|||||||
// so substitute it for *mut since we're exporting to C
|
// so substitute it for *mut since we're exporting to C
|
||||||
let elem = &ty.elem;
|
let elem = &ty.elem;
|
||||||
arg_type.push(quote!(*mut #elem));
|
arg_type.push(quote!(*mut #elem));
|
||||||
|
// we need to properly dereference the substituted raw
|
||||||
|
// pointer if we are to properly call the hostcall fn
|
||||||
|
call_arg_ident.push(quote!(&mut *#ident));
|
||||||
} else {
|
} else {
|
||||||
arg_type.push(quote!(#ty));
|
arg_type.push(quote!(#ty));
|
||||||
|
// non-&-ref type, so preserve whatever the arg was
|
||||||
|
call_arg_ident.push(quote!(#ident));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
@@ -54,8 +59,9 @@ pub fn wasi_common_cbindgen(attr: TokenStream, function: TokenStream) -> TokenSt
|
|||||||
#arg_ident: #arg_type,
|
#arg_ident: #arg_type,
|
||||||
)*
|
)*
|
||||||
) #output {
|
) #output {
|
||||||
|
#fn_ident(#(
|
||||||
|
#call_arg_ident,
|
||||||
|
)*)
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user