Skip to content

Commit 146f97b

Browse files
committed
Factor out some repetitive code.
1 parent 815953e commit 146f97b

File tree

1 file changed

+38
-81
lines changed

1 file changed

+38
-81
lines changed

compiler/rustc_mir_transform/src/coroutine.rs

+38-81
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,9 @@ use rustc_index::bit_set::{BitMatrix, BitSet, GrowableBitSet};
6363
use rustc_index::{Idx, IndexVec};
6464
use rustc_middle::mir::visit::{MutVisitor, PlaceContext, Visitor};
6565
use rustc_middle::mir::*;
66-
use rustc_middle::ty::{self, CoroutineArgs, CoroutineArgsExt, InstanceKind, Ty, TyCtxt};
66+
use rustc_middle::ty::{
67+
self, CoroutineArgs, CoroutineArgsExt, GenericArgsRef, InstanceKind, Ty, TyCtxt,
68+
};
6769
use rustc_middle::{bug, span_bug};
6870
use rustc_mir_dataflow::impls::{
6971
MaybeBorrowedLocals, MaybeLiveLocals, MaybeRequiresStorage, MaybeStorageLive,
@@ -210,14 +212,10 @@ impl<'tcx> TransformVisitor<'tcx> {
210212
// `gen` continues return `None`
211213
CoroutineKind::Desugared(CoroutineDesugaring::Gen, _) => {
212214
let option_def_id = self.tcx.require_lang_item(LangItem::Option, None);
213-
Rvalue::Aggregate(
214-
Box::new(AggregateKind::Adt(
215-
option_def_id,
216-
VariantIdx::ZERO,
217-
self.tcx.mk_args(&[self.old_yield_ty.into()]),
218-
None,
219-
None,
220-
)),
215+
make_aggregate_adt(
216+
option_def_id,
217+
VariantIdx::ZERO,
218+
self.tcx.mk_args(&[self.old_yield_ty.into()]),
221219
IndexVec::new(),
222220
)
223221
}
@@ -266,64 +264,28 @@ impl<'tcx> TransformVisitor<'tcx> {
266264
is_return: bool,
267265
statements: &mut Vec<Statement<'tcx>>,
268266
) {
267+
const ZERO: VariantIdx = VariantIdx::ZERO;
268+
const ONE: VariantIdx = VariantIdx::from_usize(1);
269269
let rvalue = match self.coroutine_kind {
270270
CoroutineKind::Desugared(CoroutineDesugaring::Async, _) => {
271271
let poll_def_id = self.tcx.require_lang_item(LangItem::Poll, None);
272272
let args = self.tcx.mk_args(&[self.old_ret_ty.into()]);
273-
if is_return {
274-
// Poll::Ready(val)
275-
Rvalue::Aggregate(
276-
Box::new(AggregateKind::Adt(
277-
poll_def_id,
278-
VariantIdx::ZERO,
279-
args,
280-
None,
281-
None,
282-
)),
283-
IndexVec::from_raw(vec![val]),
284-
)
273+
let (variant_idx, operands) = if is_return {
274+
(ZERO, IndexVec::from_raw(vec![val])) // Poll::Ready(val)
285275
} else {
286-
// Poll::Pending
287-
Rvalue::Aggregate(
288-
Box::new(AggregateKind::Adt(
289-
poll_def_id,
290-
VariantIdx::from_usize(1),
291-
args,
292-
None,
293-
None,
294-
)),
295-
IndexVec::new(),
296-
)
297-
}
276+
(ONE, IndexVec::new()) // Poll::Pending
277+
};
278+
make_aggregate_adt(poll_def_id, variant_idx, args, operands)
298279
}
299280
CoroutineKind::Desugared(CoroutineDesugaring::Gen, _) => {
300281
let option_def_id = self.tcx.require_lang_item(LangItem::Option, None);
301282
let args = self.tcx.mk_args(&[self.old_yield_ty.into()]);
302-
if is_return {
303-
// None
304-
Rvalue::Aggregate(
305-
Box::new(AggregateKind::Adt(
306-
option_def_id,
307-
VariantIdx::ZERO,
308-
args,
309-
None,
310-
None,
311-
)),
312-
IndexVec::new(),
313-
)
283+
let (variant_idx, operands) = if is_return {
284+
(ZERO, IndexVec::new()) // None
314285
} else {
315-
// Some(val)
316-
Rvalue::Aggregate(
317-
Box::new(AggregateKind::Adt(
318-
option_def_id,
319-
VariantIdx::from_usize(1),
320-
args,
321-
None,
322-
None,
323-
)),
324-
IndexVec::from_raw(vec![val]),
325-
)
326-
}
286+
(ONE, IndexVec::from_raw(vec![val])) // Some(val)
287+
};
288+
make_aggregate_adt(option_def_id, variant_idx, args, operands)
327289
}
328290
CoroutineKind::Desugared(CoroutineDesugaring::AsyncGen, _) => {
329291
if is_return {
@@ -349,31 +311,17 @@ impl<'tcx> TransformVisitor<'tcx> {
349311
let coroutine_state_def_id =
350312
self.tcx.require_lang_item(LangItem::CoroutineState, None);
351313
let args = self.tcx.mk_args(&[self.old_yield_ty.into(), self.old_ret_ty.into()]);
352-
if is_return {
353-
// CoroutineState::Complete(val)
354-
Rvalue::Aggregate(
355-
Box::new(AggregateKind::Adt(
356-
coroutine_state_def_id,
357-
VariantIdx::from_usize(1),
358-
args,
359-
None,
360-
None,
361-
)),
362-
IndexVec::from_raw(vec![val]),
363-
)
314+
let variant_idx = if is_return {
315+
ONE // CoroutineState::Complete(val)
364316
} else {
365-
// CoroutineState::Yielded(val)
366-
Rvalue::Aggregate(
367-
Box::new(AggregateKind::Adt(
368-
coroutine_state_def_id,
369-
VariantIdx::ZERO,
370-
args,
371-
None,
372-
None,
373-
)),
374-
IndexVec::from_raw(vec![val]),
375-
)
376-
}
317+
ZERO // CoroutineState::Yielded(val)
318+
};
319+
make_aggregate_adt(
320+
coroutine_state_def_id,
321+
variant_idx,
322+
args,
323+
IndexVec::from_raw(vec![val]),
324+
)
377325
}
378326
};
379327

@@ -509,6 +457,15 @@ impl<'tcx> MutVisitor<'tcx> for TransformVisitor<'tcx> {
509457
}
510458
}
511459

460+
fn make_aggregate_adt<'tcx>(
461+
def_id: DefId,
462+
variant_idx: VariantIdx,
463+
args: GenericArgsRef<'tcx>,
464+
operands: IndexVec<FieldIdx, Operand<'tcx>>,
465+
) -> Rvalue<'tcx> {
466+
Rvalue::Aggregate(Box::new(AggregateKind::Adt(def_id, variant_idx, args, None, None)), operands)
467+
}
468+
512469
fn make_coroutine_state_argument_indirect<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
513470
let coroutine_ty = body.local_decls.raw[1].ty;
514471

0 commit comments

Comments
 (0)