Factor out C++ indirect return predicate
diff --git a/gen/write.rs b/gen/write.rs
index 3cd3683..d57e21e 100644
--- a/gen/write.rs
+++ b/gen/write.rs
@@ -187,10 +187,6 @@
}
fn write_cxx_function_shim(out: &mut OutFile, efn: &ExternFn, types: &Types) {
- let indirect_return = efn
- .ret
- .as_ref()
- .map_or(false, |ret| types.needs_indirect_abi(ret));
write_extern_return_type(out, &efn.ret, types);
for name in out.namespace.clone() {
write!(out, "{}$", name);
@@ -205,6 +201,7 @@
}
write_extern_arg(out, arg, types);
}
+ let indirect_return = indirect_return(efn, types);
if indirect_return {
if !efn.args.is_empty() {
write!(out, ", ");
@@ -285,11 +282,7 @@
}
write_extern_arg(out, arg, types);
}
- if efn
- .ret
- .as_ref()
- .map_or(false, |ret| types.needs_indirect_abi(ret))
- {
+ if indirect_return(efn, types) {
if !efn.args.is_empty() {
write!(out, ", ");
}
@@ -300,10 +293,6 @@
}
fn write_rust_function_shim(out: &mut OutFile, efn: &ExternFn, types: &Types) {
- let indirect_return = efn
- .ret
- .as_ref()
- .map_or(false, |ret| types.needs_indirect_abi(ret));
for line in efn.doc.to_string().lines() {
writeln!(out, "//{}", line);
}
@@ -329,6 +318,7 @@
}
}
write!(out, " ");
+ let indirect_return = indirect_return(efn, types);
if indirect_return {
write!(out, "::rust::MaybeUninit<");
write_type(out, efn.ret.as_ref().unwrap());
@@ -398,6 +388,12 @@
}
}
+fn indirect_return(efn: &ExternFn, types: &Types) -> bool {
+ efn.ret
+ .as_ref()
+ .map_or(false, |ret| types.needs_indirect_abi(ret))
+}
+
fn write_extern_return_type(out: &mut OutFile, ty: &Option<Type>, types: &Types) {
match ty {
Some(Type::RustBox(ty)) | Some(Type::UniquePtr(ty)) => {