deduplicate index ptr inlining for 0-arity atoms (#1538)

This commit is contained in:
Mark Thom
2022-07-23 13:16:02 -06:00
parent edea1273c8
commit ea95a7900c
2 changed files with 32 additions and 5 deletions

View File

@@ -351,12 +351,33 @@ impl<Iter: FocusedHeapIter> Iterator for PostOrderIterator<Iter> {
} }
impl<Iter: FocusedHeapIter> FocusedHeapIter for PostOrderIterator<Iter> { impl<Iter: FocusedHeapIter> FocusedHeapIter for PostOrderIterator<Iter> {
#[inline] #[inline(always)]
fn focus(&self) -> usize { fn focus(&self) -> usize {
self.focus self.focus
} }
} }
impl<Iter: FocusedHeapIter> PostOrderIterator<Iter> {
/* return true if the term at heap offset idx_loc is a
* direct/inlined subterm of a structure at the focus of
* self.stack.last(). this function is used to determine, e.g.,
* ownership of inlined code indices.
*/
#[inline]
pub(crate) fn direct_subterm_of_str(&self, idx_loc: usize) -> bool {
if let Some((_child_count, item, focus)) = self.parent_stack.last() {
read_heap_cell!(item,
(HeapCellValueTag::Atom, (_name, arity)) => {
return focus + arity >= idx_loc && *focus < idx_loc;
}
_ => {}
);
}
false
}
}
pub(crate) type LeftistPostOrderHeapIter<'a> = PostOrderIterator<StackfulPreOrderHeapIter<'a>>; pub(crate) type LeftistPostOrderHeapIter<'a> = PostOrderIterator<StackfulPreOrderHeapIter<'a>>;
impl<'a> LeftistPostOrderHeapIter<'a> { impl<'a> LeftistPostOrderHeapIter<'a> {

View File

@@ -517,6 +517,11 @@ impl<'a, LS: LoadState<'a>> Loader<'a, LS> {
let value = iter.heap[h + arity + 1]; let value = iter.heap[h + arity + 1];
if let Some(idx) = get_structure_index(value) { if let Some(idx) = get_structure_index(value) {
// in the second condition, arity == 0,
// meaning idx cannot pertain to this atom
// if it is the direct subterm of a larger
// structure.
if arity > 0 || !iter.direct_subterm_of_str(h) {
term_stack.push( term_stack.push(
Term::Literal(Cell::default(), Literal::CodeIndex(idx)) Term::Literal(Cell::default(), Literal::CodeIndex(idx))
); );
@@ -524,6 +529,7 @@ impl<'a, LS: LoadState<'a>> Loader<'a, LS> {
arity += 1; arity += 1;
} }
} }
}
if arity == 0 { if arity == 0 {
term_stack.push(Term::Literal(Cell::default(), Literal::Atom(name))); term_stack.push(Term::Literal(Cell::default(), Literal::Atom(name)));