record cyclic terms in printer

This commit is contained in:
Mark Thom
2018-05-07 00:44:42 -06:00
parent 30926a71ab
commit 7573a8fb10

View File

@@ -183,16 +183,20 @@ impl<'a, Formatter: HCValueFormatter, Outputter: HCValueOutputter>
printer printer
} }
fn print_offset(&mut self, addr: Addr) { fn offset_as_string(&self, addr: Addr) -> Option<String> {
match addr { match addr {
Addr::HeapCell(h) | Addr::Lis(h) | Addr::Str(h) => Addr::HeapCell(h) | Addr::Lis(h) | Addr::Str(h) =>
self.outputter.append(format!("_{}", h).as_str()), Some(format!("_{}", h)),
Addr::StackCell(fr, sc) => Addr::StackCell(fr, sc) =>
self.outputter.append(format!("s_{}_{}", fr, sc).as_str()), Some(format!("s_{}_{}", fr, sc)),
_ => {} _ => None
} }
} }
fn print_offset(&mut self, addr: Addr) {
self.offset_as_string(addr).map(|s| self.outputter.append(s.as_str()));
}
fn check_for_seen(&mut self, iter: &mut HCPreOrderIterator) -> Option<HeapCellValue> { fn check_for_seen(&mut self, iter: &mut HCPreOrderIterator) -> Option<HeapCellValue> {
iter.stack().last().cloned().and_then(|addr| { iter.stack().last().cloned().and_then(|addr| {
let addr = self.machine_st.store(self.machine_st.deref(addr)); let addr = self.machine_st.store(self.machine_st.deref(addr));
@@ -214,6 +218,11 @@ impl<'a, Formatter: HCValueFormatter, Outputter: HCValueOutputter>
None None
} else { } else {
if let Some(s) = self.offset_as_string(addr.clone()) {
let var = Rc::new(s);
self.heap_locs.insert(addr.clone(), var);
}
self.printed_vars.insert(addr); self.printed_vars.insert(addr);
iter.next() iter.next()
} }