Skip to content

Commit 8f08b16

Browse files
committed
Small allocation improvement
1 parent 59fa40a commit 8f08b16

File tree

1 file changed

+16
-13
lines changed

1 file changed

+16
-13
lines changed

src/librustc_mir_build/hair/pattern/_match.rs

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -990,8 +990,8 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
990990

991991
/// Construct a new `Fields` from the given patterns. You must be sure those patterns can't
992992
/// contain fields that need to be filtered out. When in doubt, prefer `replace_fields`.
993-
fn from_vec_unfiltered(pats: SmallVec<[&'p Pat<'tcx>; 2]>) -> Self {
994-
Fields::Vec(pats)
993+
fn from_slice_unfiltered(pats: &'p [Pat<'tcx>]) -> Self {
994+
Fields::Slice(pats)
995995
}
996996

997997
/// Convenience; internal use.
@@ -2537,20 +2537,23 @@ fn specialize_one_pattern<'p, 'tcx>(
25372537
if ctor_wild_subpatterns.len() as u64 != n {
25382538
return None;
25392539
}
2540+
25402541
// Convert a constant slice/array pattern to a list of patterns.
25412542
let layout = cx.tcx.layout_of(cx.param_env.and(ty)).ok()?;
25422543
let ptr = Pointer::new(AllocId(0), offset);
2543-
let pats = (0..n)
2544-
.map(|i| {
2545-
let ptr = ptr.offset(layout.size * i, &cx.tcx).ok()?;
2546-
let scalar = alloc.read_scalar(&cx.tcx, ptr, layout.size).ok()?;
2547-
let scalar = scalar.not_undef().ok()?;
2548-
let value = ty::Const::from_scalar(cx.tcx, scalar, ty);
2549-
let pattern = Pat { ty, span: pat.span, kind: box PatKind::Constant { value } };
2550-
Some(&*cx.pattern_arena.alloc(pattern))
2551-
})
2552-
.collect::<Option<_>>()?;
2553-
Some(Fields::from_vec_unfiltered(pats))
2544+
let pats = cx.pattern_arena.alloc_from_iter((0..n).filter_map(|i| {
2545+
let ptr = ptr.offset(layout.size * i, &cx.tcx).ok()?;
2546+
let scalar = alloc.read_scalar(&cx.tcx, ptr, layout.size).ok()?;
2547+
let scalar = scalar.not_undef().ok()?;
2548+
let value = ty::Const::from_scalar(cx.tcx, scalar, ty);
2549+
let pattern = Pat { ty, span: pat.span, kind: box PatKind::Constant { value } };
2550+
Some(pattern)
2551+
}));
2552+
// Ensure none of the dereferences failed.
2553+
if pats.len() as u64 != n {
2554+
return None;
2555+
}
2556+
Some(Fields::from_slice_unfiltered(pats))
25542557
}
25552558

25562559
PatKind::Constant { .. } | PatKind::Range { .. } => {

0 commit comments

Comments
 (0)