Also add an API to check if an instance has body

This is much cheaper than building a body just for the purpose of
checking if the body exists.
This commit is contained in:
Celina G. Val 2023-12-06 11:00:30 -08:00
parent 1bcd162465
commit 4a75d1893e
2 changed files with 14 additions and 3 deletions

View File

@ -39,6 +39,14 @@ impl Instance {
with(|context| context.instance_body(self.def)) with(|context| context.instance_body(self.def))
} }
/// Check whether this instance has a body available.
///
/// This call is much cheaper than `instance.body().is_some()`, since it doesn't try to build
/// the StableMIR body.
pub fn has_body(&self) -> bool {
with(|cx| cx.has_body(self.def.def_id()))
}
pub fn is_foreign_item(&self) -> bool { pub fn is_foreign_item(&self) -> bool {
with(|cx| cx.is_foreign_item(self.def.def_id())) with(|cx| cx.is_foreign_item(self.def.def_id()))
} }

View File

@ -64,9 +64,12 @@ fn test_body(body: mir::Body) {
let RigidTy::FnDef(def, args) = ty else { unreachable!() }; let RigidTy::FnDef(def, args) = ty else { unreachable!() };
let instance = Instance::resolve(def, &args).unwrap(); let instance = Instance::resolve(def, &args).unwrap();
let mangled_name = instance.mangled_name(); let mangled_name = instance.mangled_name();
let body = instance.body(); assert!(instance.has_body() || (mangled_name == "setpwent"), "Failed: {func:?}");
assert!(body.is_some() || (mangled_name == "setpwent"), "Failed: {func:?}"); assert!(instance.has_body() ^ instance.is_foreign_item());
assert!(body.is_some() ^ instance.is_foreign_item()); if instance.has_body() {
let body = instance.body().unwrap();
assert!(!body.locals().is_empty(), "Body must at least have a return local");
}
} }
Goto { .. } | Assert { .. } | SwitchInt { .. } | Return | Drop { .. } => { Goto { .. } | Assert { .. } | SwitchInt { .. } | Return | Drop { .. } => {
/* Do nothing */ /* Do nothing */