diff --git a/derive/src/lib.rs b/derive/src/lib.rs index 5017d10..6e06afa 100644 --- a/derive/src/lib.rs +++ b/derive/src/lib.rs @@ -284,19 +284,67 @@ pub fn host_fn( let (output_is_ptr, converted_output) = match output { syn::ReturnType::Default => (false, quote!(())), - syn::ReturnType::Type(_, _) => (true, quote!(u64)), + syn::ReturnType::Type(_, t) => { + if let syn::Type::Path(t) = &**t { + let is_i32 = t.path.get_ident().is_some_and(|x| x == "i32" || x == "u32"); + let is_i64 = t.path.get_ident().is_some_and(|x| x == "i64" || x == "u64"); + let is_f32 = t.path.get_ident().is_some_and(|x| x == "f32"); + let is_f64 = t.path.get_ident().is_some_and(|x| x == "f64"); + + if is_i32 { + (false, quote!(#t)) + } else if is_i64 { + (false, quote!(#t)) + } else if is_f32 { + (false, quote!(#t)) + } else if is_f64 { + (false, quote!(#t)) + } else { + (true, quote!(u64)) + } + } else { + panic!("Invalid type in host function: {:?}", output) + } + } }; for input in &original_inputs { match input { syn::FnArg::Typed(t) => { let mut input = t.clone(); - input.ty = Box::new(syn::Type::Verbatim(quote!(u64))); + let (is_ptr, ty) = if let syn::Type::Path(t) = &*t.ty { + let is_i32 = + t.path.get_ident().is_some_and(|x| x == "i32" || x == "u32"); + let is_i64 = + t.path.get_ident().is_some_and(|x| x == "i64" || x == "u64"); + let is_f32 = t.path.get_ident().is_some_and(|x| x == "f32"); + let is_f64 = t.path.get_ident().is_some_and(|x| x == "f64"); + + if is_i32 { + (false, quote!(#t)) + } else if is_i64 { + (false, quote!(#t)) + } else if is_f32 { + (false, quote!(#t)) + } else if is_f64 { + (false, quote!(#t)) + } else { + (true, quote!(u64)) + } + } else { + (true, quote!(u64)) + }; + input.ty = Box::new(syn::Type::Verbatim(ty)); converted_inputs.push(syn::FnArg::Typed(input)); match &*t.pat { syn::Pat::Ident(i) => { - into_inputs - .push(quote!(extism_pdk::ToMemory::to_memory(&&#i)?.offset())); + if is_ptr { + into_inputs.push( + quote!(extism_pdk::ToMemory::to_memory(&&#i)?.offset()), + ); + } else { + into_inputs.push(quote!(#i)); + } } _ => panic!("invalid host function argument"), } diff --git a/test/code.wasm b/test/code.wasm index 3e5b54c..4ad207f 100755 Binary files a/test/code.wasm and b/test/code.wasm differ diff --git a/test/host_function.wasm b/test/host_function.wasm index 7a32758..fc27ff4 100755 Binary files a/test/host_function.wasm and b/test/host_function.wasm differ diff --git a/test/http.wasm b/test/http.wasm index 8d780e4..ef5e9f4 100755 Binary files a/test/http.wasm and b/test/http.wasm differ