From 63b36e71270e680dad2431d56b3f498c0dfdeefc Mon Sep 17 00:00:00 2001 From: David Haig Date: Tue, 26 Nov 2019 01:31:27 +0000 Subject: [PATCH] Reduced repetition by refactoring new body to constructor function --- src/librustc_mir/shim.rs | 81 ++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 41 deletions(-) diff --git a/src/librustc_mir/shim.rs b/src/librustc_mir/shim.rs index d623e7870e1..5848df3b665 100644 --- a/src/librustc_mir/shim.rs +++ b/src/librustc_mir/shim.rs @@ -196,20 +196,13 @@ fn build_drop_shim<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, ty: Option>) block(&mut blocks, TerminatorKind::Goto { target: return_block }); block(&mut blocks, TerminatorKind::Return); - let mut body = Body::new( - blocks, - IndexVec::from_elem_n( - SourceScopeData { span: span, parent_scope: None }, 1 - ), - ClearCrossCrate::Clear, - local_decls_for_sig(&sig, span), - IndexVec::new(), - sig.inputs().len(), - vec![], - span, - vec![], - None, - ); + let mut body = new_body(blocks, + IndexVec::from_elem_n( + SourceScopeData { span, parent_scope: None }, 1 + ), + local_decls_for_sig(&sig, span), + sig.inputs().len(), + span); if let Some(..) = ty { // The first argument (index 0), but add 1 for the return value. @@ -248,6 +241,27 @@ fn build_drop_shim<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, ty: Option>) body } +fn new_body<'tcx>(basic_blocks: IndexVec>, + source_scopes: IndexVec, + local_decls: IndexVec>, + arg_count: usize, + span: Span, +) -> Body<'tcx> { + Body::new( + basic_blocks, + source_scopes, + ClearCrossCrate::Clear, + None, + local_decls, + IndexVec::new(), + arg_count, + vec![], + span, + vec![], + None, + ) +} + pub struct DropShimElaborator<'a, 'tcx> { pub body: &'a Body<'tcx>, pub patch: MirPatch<'tcx>, @@ -363,19 +377,13 @@ fn new(tcx: TyCtxt<'tcx>, def_id: DefId, self_ty: Ty<'tcx>) -> Self { } fn into_mir(self) -> Body<'tcx> { - Body::new( - self.blocks, - IndexVec::from_elem_n( - SourceScopeData { span: self.span, parent_scope: None }, 1 - ), - ClearCrossCrate::Clear, - self.local_decls, - IndexVec::new(), - self.sig.inputs().len(), - vec![], - self.span, - vec![], - None, + new_body(self.blocks, + IndexVec::from_elem_n( + SourceScopeData { span: self.span, parent_scope: None }, 1 + ), + self.local_decls, + self.sig.inputs().len(), + self.span, ) } @@ -824,20 +832,16 @@ fn build_call_shim<'tcx>( block(&mut blocks, vec![], TerminatorKind::Resume, true); } - let mut body = Body::new( + let mut body = new_body( blocks, IndexVec::from_elem_n( - SourceScopeData { span: span, parent_scope: None }, 1 + SourceScopeData { span, parent_scope: None }, 1 ), - ClearCrossCrate::Clear, local_decls, - IndexVec::new(), sig.inputs().len(), - vec![], span, - vec![], - None, ); + if let Abi::RustCall = sig.abi { body.spread_arg = Some(Local::new(sig.inputs().len())); } @@ -911,19 +915,14 @@ pub fn build_adt_ctor(tcx: TyCtxt<'_>, ctor_id: DefId) -> &Body<'_> { is_cleanup: false }; - let body = Body::new( + let body = new_body( IndexVec::from_elem_n(start_block, 1), IndexVec::from_elem_n( - SourceScopeData { span: span, parent_scope: None }, 1 + SourceScopeData { span, parent_scope: None }, 1 ), - ClearCrossCrate::Clear, local_decls, - IndexVec::new(), sig.inputs().len(), - vec![], span, - vec![], - None, ); crate::util::dump_mir( -- 2.44.0