diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2017-08-25 07:19:40 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2017-08-25 07:19:40 -0700 |
| commit | 74b93f35dade697b679064f59720d689c1501045 (patch) | |
| tree | c3f61ef48a343995510d1e39b5e4171fa78bc77f | |
| parent | 8c97ffa1d4a1d9f8039a580297988af1880f5665 (diff) | |
| download | rust-74b93f35dade697b679064f59720d689c1501045.tar.gz rust-74b93f35dade697b679064f59720d689c1501045.zip | |
Add a `self_arg` convenience
| -rw-r--r-- | src/librustc_mir/transform/generator.rs | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/src/librustc_mir/transform/generator.rs b/src/librustc_mir/transform/generator.rs index 748db9ac803..d47e722de84 100644 --- a/src/librustc_mir/transform/generator.rs +++ b/src/librustc_mir/transform/generator.rs @@ -52,7 +52,7 @@ impl<'tcx> MutVisitor<'tcx> for DerefArgVisitor { lvalue: &mut Lvalue<'tcx>, context: LvalueContext<'tcx>, location: Location) { - if *lvalue == Lvalue::Local(Local::new(1)) { + if *lvalue == Lvalue::Local(self_arg()) { *lvalue = Lvalue::Projection(Box::new(Projection { base: lvalue.clone(), elem: ProjectionElem::Deref, @@ -63,6 +63,10 @@ impl<'tcx> MutVisitor<'tcx> for DerefArgVisitor { } } +fn self_arg() -> Local { + Local::new(1) +} + struct TransformVisitor<'a, 'tcx: 'a> { tcx: TyCtxt<'a, 'tcx, 'tcx>, state_adt_ref: &'tcx AdtDef, @@ -97,7 +101,7 @@ impl<'a, 'tcx> TransformVisitor<'a, 'tcx> { // Create a Lvalue referencing a generator struct field fn make_field(&self, idx: usize, ty: Ty<'tcx>) -> Lvalue<'tcx> { - let base = Lvalue::Local(Local::new(1)); + let base = Lvalue::Local(self_arg()); let field = Projection { base: base, elem: ProjectionElem::Field(Field::new(idx), ty), @@ -256,7 +260,7 @@ fn locals_live_across_suspend_points<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, } // The generator argument is ignored - set.remove(&Local::new(1)); + set.remove(&self_arg()); set } @@ -334,7 +338,7 @@ fn elaborate_generator_drops<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, use shim::DropShimElaborator; let param_env = tcx.param_env(def_id); - let gen = Local::new(1); + let gen = self_arg(); for block in mir.basic_blocks().indices() { let (target, unwind, source_info) = match mir.basic_blocks()[block].terminator() { @@ -452,7 +456,7 @@ fn create_generator_drop_shim<'a, 'tcx>( make_generator_state_argument_indirect(tcx, def_id, &mut mir); // Change the generator argument from &mut to *mut - mir.local_decls[Local::new(1)] = LocalDecl { + mir.local_decls[self_arg()] = LocalDecl { mutability: Mutability::Mut, ty: tcx.mk_ptr(ty::TypeAndMut { ty: gen_ty, @@ -604,7 +608,7 @@ fn insert_clean_drop<'a, 'tcx>(mir: &mut Mir<'tcx>) -> BasicBlock { // Create a block to destroy an unresumed generators. This can only destroy upvars. let drop_clean = BasicBlock::new(mir.basic_blocks().len()); let term = TerminatorKind::Drop { - location: Lvalue::Local(Local::new(1)), + location: Lvalue::Local(self_arg()), target: return_block, unwind: None, }; |
