Skip to content

Commit 42ae2fe

Browse files
committed
address review: simplify function type erasure logic
1 parent 87601a3 commit 42ae2fe

File tree

1 file changed

+14
-20
lines changed

1 file changed

+14
-20
lines changed

src/bindgen/ir/ty.rs

+14-20
Original file line numberDiff line numberDiff line change
@@ -600,30 +600,24 @@ impl Type {
600600
is_nullable,
601601
never_return,
602602
} => {
603-
// Predict that ret+args will all be erased, but decrement the count whenever we're
604-
// wrong. If the count drops to 0, then type erasure was a no-op after all.
605-
let mut num_erased = 1 + args.len();
606-
let erased_ret = eraser
607-
.erase_transparent_types(library, ret, mappings)
608-
.unwrap_or_else(|| {
609-
num_erased -= 1;
610-
ret.as_ref().clone()
611-
});
612-
603+
// Attempt to erase ret and all args; if any of them were actually erased, then
604+
// assemble and return the simplified function signature that results.
605+
let mut erased_any = false;
606+
let mut try_erase = |ty| {
607+
if let Some(erased) = eraser.erase_transparent_types(library, ty, mappings) {
608+
erased_any = true;
609+
erased
610+
} else {
611+
ty.clone()
612+
}
613+
};
614+
let erased_ret = try_erase(ret);
613615
let erased_args = args
614616
.iter()
615-
.map(|(name, ty)| {
616-
let erased_ty = eraser
617-
.erase_transparent_types(library, ty, mappings)
618-
.unwrap_or_else(|| {
619-
num_erased -= 1;
620-
ty.clone()
621-
});
622-
(name.clone(), erased_ty)
623-
})
617+
.map(|(name, ty)| (name.clone(), try_erase(ty)))
624618
.collect();
625619

626-
if num_erased > 0 {
620+
if erased_any {
627621
return Some(Type::FuncPtr {
628622
ret: Box::new(erased_ret),
629623
args: erased_args,

0 commit comments

Comments
 (0)