Restrict improper ctype special case to only contexts that require it
diff --git a/macro/src/expand.rs b/macro/src/expand.rs
index c0e71e1..b5d3067 100644
--- a/macro/src/expand.rs
+++ b/macro/src/expand.rs
@@ -208,7 +208,7 @@
});
let args = efn.args.iter().map(|arg| {
let ident = &arg.ident;
- let ty = expand_extern_type(&arg.ty, types);
+ let ty = expand_extern_type(&arg.ty, types, true);
if arg.ty == RustString {
quote!(#ident: *const #ty)
} else if let Type::RustVec(_) = arg.ty {
@@ -225,11 +225,11 @@
let ret = if efn.throws {
quote!(-> ::cxx::private::Result)
} else {
- expand_extern_return_type(&efn.ret, types)
+ expand_extern_return_type(&efn.ret, types, true)
};
let mut outparam = None;
if indirect_return(efn, types) {
- let ret = expand_extern_type(efn.ret.as_ref().unwrap(), types);
+ let ret = expand_extern_type(efn.ret.as_ref().unwrap(), types, true);
outparam = Some(quote!(__return: *mut #ret));
}
let link_name = mangle::extern_fn(efn, types);
@@ -327,7 +327,7 @@
.collect::<TokenStream>();
let local_name = format_ident!("__{}", efn.name.rust);
let call = if indirect_return {
- let ret = expand_extern_type(efn.ret.as_ref().unwrap(), types);
+ let ret = expand_extern_type(efn.ret.as_ref().unwrap(), types, true);
setup.extend(quote! {
let mut __return = ::std::mem::MaybeUninit::<#ret>::uninit();
});
@@ -516,7 +516,7 @@
});
let args = sig.args.iter().map(|arg| {
let ident = &arg.ident;
- let ty = expand_extern_type(&arg.ty, types);
+ let ty = expand_extern_type(&arg.ty, types, false);
if types.needs_indirect_abi(&arg.ty) {
quote!(#ident: *mut #ty)
} else {
@@ -553,10 +553,6 @@
None => quote!(#ident.as_vec()),
Some(_) => quote!(#ident.as_mut_vec()),
},
- inner if types.is_considered_improper_ctype(inner) => {
- let mutability = ty.mutability;
- quote!(&#mutability *#ident.cast())
- }
_ => quote!(#ident),
},
Type::Str(_) => quote!(#ident.as_str()),
@@ -605,10 +601,6 @@
None => Some(quote!(::cxx::private::RustVec::from_ref)),
Some(_) => Some(quote!(::cxx::private::RustVec::from_mut)),
},
- inner if types.is_considered_improper_ctype(inner) => match ty.mutability {
- None => Some(quote!((|v| v as *const #inner as *const ::std::ffi::c_void))),
- Some(_) => Some(quote!((|v| v as *mut #inner as *mut ::std::ffi::c_void))),
- },
_ => None,
},
Type::Str(_) => Some(quote!(::cxx::private::RustStr::from)),
@@ -625,7 +617,7 @@
let mut outparam = None;
let indirect_return = indirect_return(sig, types);
if indirect_return {
- let ret = expand_extern_type(sig.ret.as_ref().unwrap(), types);
+ let ret = expand_extern_type(sig.ret.as_ref().unwrap(), types, false);
outparam = Some(quote!(__return: *mut #ret,));
}
if sig.throws {
@@ -643,7 +635,7 @@
let ret = if sig.throws {
quote!(-> ::cxx::private::Result)
} else {
- expand_extern_return_type(&sig.ret, types)
+ expand_extern_return_type(&sig.ret, types, false)
};
let pointer = match invoke {
@@ -955,15 +947,15 @@
.map_or(false, |ret| sig.throws || types.needs_indirect_abi(ret))
}
-fn expand_extern_type(ty: &Type, types: &Types) -> TokenStream {
+fn expand_extern_type(ty: &Type, types: &Types, proper: bool) -> TokenStream {
match ty {
Type::Ident(ident) if ident.rust == RustString => quote!(::cxx::private::RustString),
Type::RustBox(ty) | Type::UniquePtr(ty) => {
- let inner = expand_extern_type(&ty.inner, types);
+ let inner = expand_extern_type(&ty.inner, types, proper);
quote!(*mut #inner)
}
Type::RustVec(ty) => {
- let elem = expand_extern_type(&ty.inner, types);
+ let elem = expand_extern_type(&ty.inner, types, proper);
quote!(::cxx::private::RustVec<#elem>)
}
Type::Ref(ty) => {
@@ -973,10 +965,10 @@
quote!(&#mutability ::cxx::private::RustString)
}
Type::RustVec(ty) => {
- let inner = expand_extern_type(&ty.inner, types);
+ let inner = expand_extern_type(&ty.inner, types, proper);
quote!(&#mutability ::cxx::private::RustVec<#inner>)
}
- inner if types.is_considered_improper_ctype(inner) => match mutability {
+ inner if proper && types.is_considered_improper_ctype(inner) => match mutability {
None => quote!(*const ::std::ffi::c_void),
Some(_) => quote!(*#mutability ::std::ffi::c_void),
},
@@ -989,11 +981,11 @@
}
}
-fn expand_extern_return_type(ret: &Option<Type>, types: &Types) -> TokenStream {
+fn expand_extern_return_type(ret: &Option<Type>, types: &Types, proper: bool) -> TokenStream {
let ret = match ret {
Some(ret) if !types.needs_indirect_abi(ret) => ret,
_ => return TokenStream::new(),
};
- let ty = expand_extern_type(ret, types);
+ let ty = expand_extern_type(ret, types, proper);
quote!(-> #ty)
}