1
Fork 0

Reduced repetition by refactoring new body to constructor function

This commit is contained in:
David Haig 2019-11-26 01:31:27 +00:00
parent eda2d416f6
commit 63b36e7127

View file

@ -196,20 +196,13 @@ fn build_drop_shim<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, ty: Option<Ty<'tcx>>)
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<Ty<'tcx>>)
body
}
fn new_body<'tcx>(basic_blocks: IndexVec<BasicBlock, BasicBlockData<'tcx>>,
source_scopes: IndexVec<SourceScope, SourceScopeData>,
local_decls: IndexVec<Local, LocalDecl<'tcx>>,
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 @@ impl CloneShimBuilder<'tcx> {
}
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(