Fix panics on pattern_arena.borrow with ugly cloning

This commit is contained in:
Dawer 2021-05-06 13:15:40 +05:00
parent 975109051c
commit de6f430140
2 changed files with 15 additions and 16 deletions

View File

@ -837,20 +837,19 @@ impl Fields {
pat: PatId, pat: PatId,
cx: &MatchCheckCtx<'_>, cx: &MatchCheckCtx<'_>,
) -> Self { ) -> Self {
// TODO: these alocations are so unfortunate (+1 for switching to references) // TODO: these alocations and clones are so unfortunate (+1 for switching to references)
match cx.pattern_arena.borrow()[pat].kind.as_ref() { let mut arena = cx.pattern_arena.borrow_mut();
match arena[pat].kind.as_ref() {
PatKind::Deref { subpattern } => { PatKind::Deref { subpattern } => {
assert_eq!(self.len(), 1); assert_eq!(self.len(), 1);
let subpattern = cx.pattern_arena.borrow_mut().alloc(subpattern.clone()); let subpattern = subpattern.clone();
Fields::from_single_pattern(subpattern) Fields::from_single_pattern(arena.alloc(subpattern))
} }
PatKind::Leaf { subpatterns } | PatKind::Variant { subpatterns, .. } => { PatKind::Leaf { subpatterns } | PatKind::Variant { subpatterns, .. } => {
let subpatterns = subpatterns.iter().map(|field_pat| { let subpatterns = subpatterns.clone();
( let subpatterns = subpatterns
field_pat.field, .iter()
cx.pattern_arena.borrow_mut().alloc(field_pat.pattern.clone()), .map(|field_pat| (field_pat.field, arena.alloc(field_pat.pattern.clone())));
)
});
self.replace_with_fieldpats(subpatterns) self.replace_with_fieldpats(subpatterns)
} }

View File

@ -94,12 +94,12 @@ impl PatIdExt for PatId {
fn expand_or_pat(self, cx: &MatchCheckCtx<'_>) -> Vec<Self> { fn expand_or_pat(self, cx: &MatchCheckCtx<'_>) -> Vec<Self> {
fn expand(pat: PatId, vec: &mut Vec<PatId>, mut pat_arena: &mut PatternArena) { fn expand(pat: PatId, vec: &mut Vec<PatId>, mut pat_arena: &mut PatternArena) {
if let PatKind::Or { pats } = pat_arena[pat].kind.as_ref() { if let PatKind::Or { pats } = pat_arena[pat].kind.as_ref() {
// for pat in pats { let pats = pats.clone();
// // TODO(iDawer): Ugh, I want to go back to references (PatId -> &Pat) for pat in pats {
// let pat = pat_arena.alloc(pat.clone()); // TODO(iDawer): Ugh, I want to go back to references (PatId -> &Pat)
// expand(pat, vec, pat_arena); let pat = pat_arena.alloc(pat.clone());
// } expand(pat, vec, pat_arena);
todo!() }
} else { } else {
vec.push(pat) vec.push(pat)
} }