improvements to adjust_rank

This commit is contained in:
Folkert 2022-03-05 23:29:33 +01:00
parent 97d9027271
commit 0351b9fce7
No known key found for this signature in database
GPG key ID: 1F17F6FFD112B97C
2 changed files with 11 additions and 7 deletions

View file

@ -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
} }

View file

@ -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)
} }