diff --git a/compiler/solve/src/solve.rs b/compiler/solve/src/solve.rs index 51d1035b80..5c1263218d 100644 --- a/compiler/solve/src/solve.rs +++ b/compiler/solve/src/solve.rs @@ -1175,23 +1175,25 @@ fn check_for_infinite_type( }, ); - let mut new_tags = Vec::with_capacity(tags.len()); + let new_variable_slices = SubsSlice::reserve_variable_slices(subs, tags.len()); - for (name_index, slice_index) in tags.iter_all() { + let it = new_variable_slices.indices().zip(tags.iter_all()); + for (variable_slice_index, (_, slice_index)) in it { let slice = subs[slice_index]; - let mut new_vars = Vec::new(); - for var_index in slice { + let new_variables = VariableSubsSlice::reserve_into_subs(subs, slice.len()); + for (target_index, var_index) in new_variables.indices().zip(slice) { let var = subs[var_index]; - new_vars.push(subs.explicit_substitute(recursive, rec_var, var)); + subs.variables[target_index] = + subs.explicit_substitute(recursive, rec_var, var); } - new_tags.push((subs[name_index].clone(), new_vars)); + subs.variable_slices[variable_slice_index] = new_variables; } let new_ext_var = subs.explicit_substitute(recursive, rec_var, ext_var); - let new_tags = UnionTags::insert_into_subs(subs, new_tags); + let new_tags = UnionTags::from_slices(tags.tag_names(), new_variable_slices); let flat_type = FlatType::RecursiveTagUnion(rec_var, new_tags, new_ext_var); diff --git a/compiler/types/src/subs.rs b/compiler/types/src/subs.rs index f4d95fa0c3..8569d0771e 100644 --- a/compiler/types/src/subs.rs +++ b/compiler/types/src/subs.rs @@ -1983,9 +1983,11 @@ impl RecordFields { SubsIndex>, ), > { - let range1 = self.field_names_start..self.field_names_start + self.length as u32; - let range2 = self.variables_start..self.variables_start + self.length as u32; - let range3 = self.field_types_start..self.field_types_start + self.length as u32; + let helper = |start| start..(start + self.length as u32); + + let range1 = helper(self.field_names_start); + let range2 = helper(self.variables_start); + let range3 = helper(self.field_types_start); let it = range1 .into_iter() @@ -3247,8 +3249,7 @@ fn deep_copy_var_to_help<'a>( let new_tag_names = { let tag_names = tags.tag_names(); - let slice = &source.tag_names[tag_names.start as usize..] - [..tag_names.length as usize]; + let slice = &source.tag_names[tag_names.indices()]; let start = target.tag_names.len() as u32; let length = tag_names.len() as u16; @@ -3305,8 +3306,7 @@ fn deep_copy_var_to_help<'a>( let new_tag_names = { let tag_names = tags.tag_names(); - let slice = &source.tag_names[tag_names.start as usize..] - [..tag_names.length as usize]; + let slice = &source.tag_names[tag_names.indices()]; let start = target.tag_names.len() as u32; let length = tag_names.len() as u16;