pub trait Cleanup<'tcx> {
fn must_unwind(&self) -> bool;
- fn clean_on_unwind(&self) -> bool;
fn is_lifetime_end(&self) -> bool;
fn trans<'blk>(&self,
bcx: Block<'blk, 'tcx>,
//
// At this point, `popped_scopes` is empty, and so the final block
// that we return to the user is `Cleanup(AST 24)`.
- while !popped_scopes.is_empty() {
- let mut scope = popped_scopes.pop().unwrap();
-
- if scope.cleanups.iter().any(|c| cleanup_is_suitable_for(&**c, label))
- {
- let name = scope.block_name("clean");
- debug!("generating cleanups for {}", name);
- let bcx_in = self.new_block(label.is_unwind(),
- &name[..],
- None);
- let mut bcx_out = bcx_in;
- for cleanup in scope.cleanups.iter().rev() {
- if cleanup_is_suitable_for(&**cleanup, label) {
- bcx_out = cleanup.trans(bcx_out,
- scope.debug_loc);
- }
- }
- build::Br(bcx_out, prev_llbb, DebugLoc::None);
- prev_llbb = bcx_in.llbb;
- } else {
- debug!("no suitable cleanups in {}",
- scope.block_name("clean"));
+ while let Some(mut scope) = popped_scopes.pop() {
+ let name = scope.block_name("clean");
+ debug!("generating cleanups for {}", name);
+ let bcx_in = self.new_block(label.is_unwind(),
+ &name[..],
+ None);
+ let mut bcx_out = bcx_in;
+ for cleanup in scope.cleanups.iter().rev() {
+ bcx_out = cleanup.trans(bcx_out,
+ scope.debug_loc);
}
+ build::Br(bcx_out, prev_llbb, DebugLoc::None);
+ prev_llbb = bcx_in.llbb;
scope.add_cached_early_exit(label, prev_llbb);
self.push_scope(scope);
true
}
- fn clean_on_unwind(&self) -> bool {
- true
- }
-
fn is_lifetime_end(&self) -> bool {
false
}
true
}
- fn clean_on_unwind(&self) -> bool {
- true
- }
-
fn is_lifetime_end(&self) -> bool {
false
}
false
}
- fn clean_on_unwind(&self) -> bool {
- true
- }
-
fn is_lifetime_end(&self) -> bool {
true
}
r
}
-fn cleanup_is_suitable_for(c: &Cleanup,
- label: EarlyExitLabel) -> bool {
- !label.is_unwind() || c.clean_on_unwind()
-}
-
///////////////////////////////////////////////////////////////////////////
// These traits just exist to put the methods into this file.