mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-28 14:24:45 +00:00
remove a to_vec() call
This commit is contained in:
parent
990823e6b7
commit
c308276c22
1 changed files with 16 additions and 10 deletions
|
@ -2426,7 +2426,7 @@ fn generalize(
|
||||||
young_rank: Rank,
|
young_rank: Rank,
|
||||||
pools: &mut Pools,
|
pools: &mut Pools,
|
||||||
) {
|
) {
|
||||||
let young_vars = pools.get(young_rank);
|
let young_vars = std::mem::take(pools.get_mut(young_rank));
|
||||||
let rank_table = pool_to_rank_table(subs, young_mark, young_rank, young_vars);
|
let rank_table = pool_to_rank_table(subs, young_mark, young_rank, young_vars);
|
||||||
|
|
||||||
// Get the ranks right for each entry.
|
// Get the ranks right for each entry.
|
||||||
|
@ -2464,32 +2464,38 @@ fn generalize(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// re-use the last_vector (which likely has a good capacity for future runs
|
||||||
|
*pools.get_mut(young_rank) = last_pool;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Sort the variables into buckets by rank.
|
/// Sort the variables into buckets by rank.
|
||||||
|
#[inline]
|
||||||
fn pool_to_rank_table(
|
fn pool_to_rank_table(
|
||||||
subs: &mut Subs,
|
subs: &mut Subs,
|
||||||
young_mark: Mark,
|
young_mark: Mark,
|
||||||
young_rank: Rank,
|
young_rank: Rank,
|
||||||
young_vars: &[Variable],
|
mut young_vars: Vec<Variable>,
|
||||||
) -> Pools {
|
) -> Pools {
|
||||||
let mut pools = Pools::new(young_rank.into_usize() + 1);
|
let mut pools = Pools::new(young_rank.into_usize() + 1);
|
||||||
|
|
||||||
// the vast majority of young variables have young_rank
|
// the vast majority of young variables have young_rank
|
||||||
// using `retain` here prevents many `pools.get_mut(young_rank)` lookups
|
let mut i = 0;
|
||||||
let mut young_vars = young_vars.to_vec();
|
while i < young_vars.len() {
|
||||||
young_vars.retain(|var| {
|
let var = young_vars[i];
|
||||||
let rank = subs.get_rank_set_mark(*var, young_mark);
|
let rank = subs.get_rank_set_mark(var, young_mark);
|
||||||
|
|
||||||
if rank != young_rank {
|
if rank != young_rank {
|
||||||
debug_assert!(rank.into_usize() < young_rank.into_usize() + 1);
|
debug_assert!(rank.into_usize() < young_rank.into_usize() + 1);
|
||||||
|
|
||||||
pools.get_mut(rank).push(*var);
|
pools.get_mut(rank).push(var);
|
||||||
false
|
|
||||||
|
// swap an element in; don't increment i
|
||||||
|
young_vars.swap_remove(i);
|
||||||
} else {
|
} else {
|
||||||
true
|
i += 1;
|
||||||
}
|
}
|
||||||
});
|
}
|
||||||
|
|
||||||
std::mem::swap(pools.get_mut(young_rank), &mut young_vars);
|
std::mem::swap(pools.get_mut(young_rank), &mut young_vars);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue