Remove more push_new and extend_new usages

This commit is contained in:
Richard Feldman 2024-10-11 14:59:58 -04:00
parent b2ea0b842c
commit 49d1786f6c
No known key found for this signature in database
GPG key ID: DAC334802F365236
10 changed files with 517 additions and 269 deletions

View file

@ -1787,7 +1787,11 @@ fn unify_unspecialized_lambdas<M: MetaCollector>(
);
Ok((
SubsSlice::extend_new(&mut env.unspecialized_lambda_sets, merged_uls),
{
let start = env.unspecialized_lambda_sets.len() as u32;
env.unspecialized_lambda_sets.extend(merged_uls);
SubsSlice::new(start, env.unspecialized_lambda_sets.len() as u16)
},
whole_outcome,
))
}
@ -3325,19 +3329,23 @@ fn unify_flat_type<M: MetaCollector>(
*ext2,
),
(TagUnion(tags1, ext1), FunctionOrTagUnion(tag_names, _, ext2)) => {
let empty_tag_var_slices = SubsSlice::extend_new(
&mut env.variable_slices,
std::iter::repeat(Default::default()).take(tag_names.len()),
);
let empty_tag_var_slices = {
let start = env.variable_slices.len() as u32;
env.variable_slices
.extend(std::iter::repeat(SubsSlice::empty()).take(tag_names.len()));
SubsSlice::new(start, env.variable_slices.len() as u16)
};
let tags2 = UnionTags::from_slices(*tag_names, empty_tag_var_slices);
unify_tag_unions(env, pool, ctx, *tags1, *ext1, tags2, *ext2)
}
(FunctionOrTagUnion(tag_names, _, ext1), TagUnion(tags2, ext2)) => {
let empty_tag_var_slices = SubsSlice::extend_new(
&mut env.variable_slices,
std::iter::repeat(Default::default()).take(tag_names.len()),
);
let empty_tag_var_slices = {
let start = env.variable_slices.len() as u32;
env.variable_slices
.extend(std::iter::repeat(SubsSlice::empty()).take(tag_names.len()));
SubsSlice::new(start, env.variable_slices.len() as u16)
};
let tags1 = UnionTags::from_slices(*tag_names, empty_tag_var_slices);
unify_tag_unions(env, pool, ctx, tags1, *ext1, *tags2, *ext2)
@ -3347,10 +3355,12 @@ fn unify_flat_type<M: MetaCollector>(
// this never happens in type-correct programs, but may happen if there is a type error
debug_assert!(is_recursion_var(env, *recursion_var));
let empty_tag_var_slices = SubsSlice::extend_new(
&mut env.variable_slices,
std::iter::repeat(Default::default()).take(tag_names.len()),
);
let empty_tag_var_slices = {
let start = env.variable_slices.len() as u32;
env.variable_slices
.extend(std::iter::repeat(SubsSlice::empty()).take(tag_names.len()));
SubsSlice::new(start, env.variable_slices.len() as u16)
};
let tags2 = UnionTags::from_slices(*tag_names, empty_tag_var_slices);
unify_tag_unions(env, pool, ctx, *tags1, *ext1, tags2, *ext2)
@ -3359,10 +3369,12 @@ fn unify_flat_type<M: MetaCollector>(
(FunctionOrTagUnion(tag_names, _, ext1), RecursiveTagUnion(recursion_var, tags2, ext2)) => {
debug_assert!(is_recursion_var(env, *recursion_var));
let empty_tag_var_slices = SubsSlice::extend_new(
&mut env.variable_slices,
std::iter::repeat(Default::default()).take(tag_names.len()),
);
let empty_tag_var_slices = {
let start = env.variable_slices.len() as u32;
env.variable_slices
.extend(std::iter::repeat(SubsSlice::empty()).take(tag_names.len()));
SubsSlice::new(start, env.variable_slices.len() as u16)
};
let tags1 = UnionTags::from_slices(*tag_names, empty_tag_var_slices);
unify_tag_unions(env, pool, ctx, tags1, *ext1, *tags2, *ext2)
@ -3587,7 +3599,7 @@ pub fn merged_ability_slices(
let merged = merge_sorted_keys(left.iter().copied(), right.iter().copied());
// TODO: check if there's an existing run in subs rather than re-inserting
SubsSlice::extend_new(&mut subs.symbol_names, merged)
subs.extend_symbol_names(merged)
}
#[inline(always)]
@ -3888,11 +3900,13 @@ fn unify_function_or_tag_union_and_func<M: MetaCollector>(
{
let lambda_names = env.get_subs_slice(tag_fn_lambdas).to_vec();
let new_lambda_names = SubsSlice::extend_new(&mut env.symbol_names, lambda_names);
let empty_captures_slices = SubsSlice::extend_new(
&mut env.variable_slices,
std::iter::repeat(Default::default()).take(new_lambda_names.len()),
);
let new_lambda_names = env.extend_symbol_names(lambda_names);
let empty_captures_slices = {
let start = env.variable_slices.len() as u32;
env.variable_slices
.extend(std::iter::repeat(SubsSlice::empty()).take(new_lambda_names.len()));
SubsSlice::new(start, env.variable_slices.len() as u16)
};
let union_tags = UnionLambdas::from_slices(new_lambda_names, empty_captures_slices);
let ambient_function_var = if left { ctx.first } else { ctx.second };
@ -3955,7 +3969,7 @@ fn unify_two_function_or_tag_unions<M: MetaCollector>(
.collect();
all_tags.sort();
all_tags.dedup();
SubsSlice::extend_new(&mut env.tag_names, all_tags)
env.extend_tag_names(all_tags)
};
let merged_lambdas = {
let mut all_lambdas: Vec<_> = (env.get_subs_slice(tag_symbols_1).iter())
@ -3964,7 +3978,7 @@ fn unify_two_function_or_tag_unions<M: MetaCollector>(
.collect();
all_lambdas.sort();
all_lambdas.dedup();
SubsSlice::extend_new(&mut env.symbol_names, all_lambdas)
env.extend_symbol_names(all_lambdas)
};
let mut outcome = unify_pool(env, pool, ext1.var(), ext2.var(), ctx.mode);