Skip to content

Commit aff073e

Browse files
committed
Cache len in Fields
1 parent 4f7a378 commit aff073e

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

src/librustc_mir_build/hair/pattern/_match.rs

+10-8
Original file line numberDiff line numberDiff line change
@@ -975,7 +975,7 @@ enum Fields<'p, 'tcx> {
975975
Slice(&'p [Pat<'tcx>]),
976976
Vec(SmallVec<[&'p Pat<'tcx>; 2]>),
977977
/// Patterns where some of the fields need to be hidden.
978-
Filtered(SmallVec<[FilteredField<'p, 'tcx>; 2]>),
978+
Filtered { fields: SmallVec<[FilteredField<'p, 'tcx>; 2]>, len: usize },
979979
}
980980

981981
impl<'p, 'tcx> Fields<'p, 'tcx> {
@@ -1038,6 +1038,7 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
10381038
if has_no_hidden_fields {
10391039
Fields::wildcards_from_tys(cx, field_tys)
10401040
} else {
1041+
let mut len = 0;
10411042
let fields = variant
10421043
.fields
10431044
.iter()
@@ -1054,11 +1055,12 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
10541055
if is_uninhabited && (!is_visible || is_non_exhaustive) {
10551056
FilteredField::Hidden(ty)
10561057
} else {
1058+
len += 1;
10571059
FilteredField::Kept(wildcard_from_ty(ty))
10581060
}
10591061
})
10601062
.collect();
1061-
Fields::Filtered(fields)
1063+
Fields::Filtered { fields, len }
10621064
}
10631065
}
10641066
}
@@ -1079,7 +1081,7 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
10791081
match self {
10801082
Fields::Slice(pats) => pats.len(),
10811083
Fields::Vec(pats) => pats.len(),
1082-
Fields::Filtered(fields) => fields.iter().filter(|p| p.kept().is_some()).count(),
1084+
Fields::Filtered { len, .. } => *len,
10831085
}
10841086
}
10851087

@@ -1088,7 +1090,7 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
10881090
let pats: SmallVec<[_; 2]> = match self {
10891091
Fields::Slice(pats) => pats.iter().cloned().collect(),
10901092
Fields::Vec(pats) => pats.into_iter().cloned().collect(),
1091-
Fields::Filtered(fields) => {
1093+
Fields::Filtered { fields, .. } => {
10921094
// We don't skip any fields here.
10931095
fields.into_iter().map(|p| p.to_pattern()).collect()
10941096
}
@@ -1122,7 +1124,7 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
11221124
pats[i] = pat
11231125
}
11241126
}
1125-
Fields::Filtered(fields) => {
1127+
Fields::Filtered { fields, .. } => {
11261128
for (i, pat) in new_pats {
11271129
if let FilteredField::Kept(p) = &mut fields[i] {
11281130
*p = pat
@@ -1144,7 +1146,7 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
11441146
let pats: &[_] = cx.pattern_arena.alloc_from_iter(pats);
11451147

11461148
match self {
1147-
Fields::Filtered(fields) => {
1149+
Fields::Filtered { fields, len } => {
11481150
let mut pats = pats.iter();
11491151
let mut fields = fields.clone();
11501152
for f in &mut fields {
@@ -1153,7 +1155,7 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
11531155
*p = pats.next().unwrap();
11541156
}
11551157
}
1156-
Fields::Filtered(fields)
1158+
Fields::Filtered { fields, len: *len }
11571159
}
11581160
_ => Fields::Slice(pats),
11591161
}
@@ -1166,7 +1168,7 @@ impl<'p, 'tcx> Fields<'p, 'tcx> {
11661168
pats.extend_from_slice(stack);
11671169
pats
11681170
}
1169-
Fields::Filtered(fields) => {
1171+
Fields::Filtered { fields, .. } => {
11701172
// We skip hidden fields here
11711173
fields.into_iter().filter_map(|p| p.kept()).chain(stack.iter().copied()).collect()
11721174
}

0 commit comments

Comments
 (0)