mirror of
https://github.com/roc-lang/roc.git
synced 2025-09-29 14:54:47 +00:00
improvements to adjust_rank
This commit is contained in:
parent
97d9027271
commit
0351b9fce7
2 changed files with 11 additions and 7 deletions
|
@ -1539,21 +1539,24 @@ fn adjust_rank(
|
||||||
group_rank: Rank,
|
group_rank: Rank,
|
||||||
var: Variable,
|
var: Variable,
|
||||||
) -> Rank {
|
) -> Rank {
|
||||||
let (desc_rank, desc_mark) = subs.get_rank_mark(var);
|
let desc = subs.get_ref_mut(var);
|
||||||
|
|
||||||
|
let desc_rank = desc.rank;
|
||||||
|
let desc_mark = desc.mark;
|
||||||
|
|
||||||
if desc_mark == young_mark {
|
if desc_mark == young_mark {
|
||||||
// Mark the variable as visited before adjusting content, as it may be cyclic.
|
|
||||||
subs.set_mark(var, visit_mark);
|
|
||||||
|
|
||||||
// SAFETY: in this function (and functions it calls, we ONLY modify rank and mark, never content!
|
// SAFETY: in this function (and functions it calls, we ONLY modify rank and mark, never content!
|
||||||
// hence, we can have an immutable reference to it even though we also have a mutable
|
// hence, we can have an immutable reference to it even though we also have a mutable
|
||||||
// reference to the Subs as a whole. This prevents a clone of the content, which turns out
|
// reference to the Subs as a whole. This prevents a clone of the content, which turns out
|
||||||
// to be quite expensive.
|
// to be quite expensive.
|
||||||
let content = {
|
let content = {
|
||||||
let ptr = &subs.get_ref(var).content as *const _;
|
let ptr = &desc.content as *const _;
|
||||||
unsafe { &*ptr }
|
unsafe { &*ptr }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// Mark the variable as visited before adjusting content, as it may be cyclic.
|
||||||
|
desc.mark = visit_mark;
|
||||||
|
|
||||||
let max_rank = adjust_rank_content(subs, young_mark, visit_mark, group_rank, content);
|
let max_rank = adjust_rank_content(subs, young_mark, visit_mark, group_rank, content);
|
||||||
|
|
||||||
subs.set_rank_mark(var, max_rank, visit_mark);
|
subs.set_rank_mark(var, max_rank, visit_mark);
|
||||||
|
@ -1566,7 +1569,8 @@ fn adjust_rank(
|
||||||
let min_rank = group_rank.min(desc_rank);
|
let min_rank = group_rank.min(desc_rank);
|
||||||
|
|
||||||
// TODO from elm-compiler: how can min_rank ever be group_rank?
|
// TODO from elm-compiler: how can min_rank ever be group_rank?
|
||||||
subs.set_rank_mark(var, min_rank, visit_mark);
|
desc.rank = min_rank;
|
||||||
|
desc.mark = visit_mark;
|
||||||
|
|
||||||
min_rank
|
min_rank
|
||||||
}
|
}
|
||||||
|
|
2
vendor/ena/src/unify/mod.rs
vendored
2
vendor/ena/src/unify/mod.rs
vendored
|
@ -470,7 +470,7 @@ where
|
||||||
K1: Into<K>,
|
K1: Into<K>,
|
||||||
{
|
{
|
||||||
let id = id.into();
|
let id = id.into();
|
||||||
let id = self.get_root_key_without_compacting(id);
|
let id = self.get_root_key(id);
|
||||||
self.value_mut(id)
|
self.value_mut(id)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue