From cb79552dd09a4b5f4a69a91e0b224eb566ce8a36 Mon Sep 17 00:00:00 2001 From: Mark Date: Fri, 21 Jul 2023 15:05:27 -0600 Subject: [PATCH] correct max_depth option (#1876) --- src/heap_print.rs | 75 +++++++++++++++++++++++++++++------------------ 1 file changed, 47 insertions(+), 28 deletions(-) diff --git a/src/heap_print.rs b/src/heap_print.rs index 110f8942e..f1ac11ce2 100644 --- a/src/heap_print.rs +++ b/src/heap_print.rs @@ -589,7 +589,11 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> { fn enqueue_op(&mut self, mut max_depth: usize, name: Atom, spec: OpDesc) { if is_postfix!(spec.get_spec()) { - if self.check_max_depth(&mut max_depth) { + if self.max_depth_exhausted(max_depth) { + self.iter.pop_stack(); + self.state_stack.push(TokenOrRedirect::Atom(atom!("..."))); + return; + } else if self.check_max_depth(&mut max_depth) { self.iter.pop_stack(); self.state_stack.push(TokenOrRedirect::Op(name, spec)); @@ -606,7 +610,11 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> { right_directed_op, )); } else if is_prefix!(spec.get_spec()) { - if self.check_max_depth(&mut max_depth) { + if self.max_depth_exhausted(max_depth) { + self.iter.pop_stack(); + self.state_stack.push(TokenOrRedirect::Atom(atom!("..."))); + return; + } else if self.check_max_depth(&mut max_depth) { self.iter.pop_stack(); self.state_stack.push(TokenOrRedirect::Atom(atom!("..."))); @@ -618,13 +626,6 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> { let op = DirectedOp::Left(name, spec); self.state_stack.push(TokenOrRedirect::CompositeRedirect(max_depth, op)); - - /* - if fetch_op_spec(name, 2, self.op_dir).is_some() { - self.state_stack.push(TokenOrRedirect::Space); - } - */ - self.state_stack.push(TokenOrRedirect::Atom(name)); } else { match name.as_str() { @@ -635,31 +636,30 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> { _ => {} }; - let ellipsis_atom = atom!("..."); + let left_directed_op = DirectedOp::Left(name, spec); + let right_directed_op = DirectedOp::Right(name, spec); - if self.check_max_depth(&mut max_depth) { + if self.max_depth_exhausted(max_depth) { self.iter.pop_stack(); self.iter.pop_stack(); - self.state_stack.push(TokenOrRedirect::Atom(ellipsis_atom)); + self.state_stack.push(TokenOrRedirect::Atom(atom!("..."))); + + return; + } else if self.check_max_depth(&mut max_depth) { + self.iter.pop_stack(); + self.iter.pop_stack(); + + self.state_stack.push(TokenOrRedirect::Atom(atom!("..."))); self.state_stack.push(TokenOrRedirect::Op(name, spec)); - self.state_stack.push(TokenOrRedirect::Atom(ellipsis_atom)); + self.state_stack.push(TokenOrRedirect::Atom(atom!("..."))); return; } - let left_directed_op = DirectedOp::Left(name, spec); - let right_directed_op = DirectedOp::Right(name, spec); - - self.state_stack.push(TokenOrRedirect::CompositeRedirect( - max_depth, - left_directed_op, - )); + self.state_stack.push(TokenOrRedirect::CompositeRedirect(max_depth, left_directed_op)); self.state_stack.push(TokenOrRedirect::Op(name, spec)); - self.state_stack.push(TokenOrRedirect::CompositeRedirect( - max_depth, - right_directed_op, - )); + self.state_stack.push(TokenOrRedirect::CompositeRedirect(max_depth, right_directed_op)); } } @@ -1197,7 +1197,9 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> { if !self.print_string_as_functor(focus.value() as usize, max_depth) { if end_cell == empty_list_as_cell!() { - append_str!(self, "[]"); + if !self.at_cdr("") { + append_str!(self, "[]"); + } } else { self.state_stack.push(TokenOrRedirect::FunctorRedirect(max_depth)); self.iter.push_stack(IterStackLoc::iterable_loc(end_h, HeapOrStackTag::Heap)); @@ -1269,6 +1271,11 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> { } } + #[inline] + fn max_depth_exhausted(&self, max_depth: usize) -> bool { + self.max_depth > 0 && max_depth == 0 + } + fn check_max_depth(&self, max_depth: &mut usize) -> bool { if self.max_depth > 0 && *max_depth == 0 { return true; @@ -1282,7 +1289,14 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> { } fn push_list(&mut self, mut max_depth: usize) { - if self.check_max_depth(&mut max_depth) { + if self.max_depth_exhausted(max_depth) { + self.iter.pop_stack(); + self.iter.pop_stack(); + + self.state_stack.push(TokenOrRedirect::Atom(atom!("..."))); + + return; + } else if self.check_max_depth(&mut max_depth) { self.iter.pop_stack(); self.iter.pop_stack(); @@ -1301,7 +1315,7 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> { self.state_stack.push(TokenOrRedirect::FunctorRedirect(max_depth)); self.state_stack.push(TokenOrRedirect::HeadTailSeparator); // bar - self.state_stack.push(TokenOrRedirect::FunctorRedirect(max_depth)); + self.state_stack.push(TokenOrRedirect::FunctorRedirect(max_depth+1)); self.state_stack.push(TokenOrRedirect::OpenList(cell)); } @@ -1504,6 +1518,11 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> { None => return, }; + if !addr.is_compound(&self.iter.heap) && self.max_depth_exhausted(max_depth) { + self.state_stack.push(TokenOrRedirect::Atom(atom!("..."))); + return; + } + read_heap_cell!(addr, (HeapCellValueTag::Atom, (name, arity)) => { print_struct(self, name, arity); @@ -1847,7 +1866,7 @@ mod tests { let output = printer.print(); - assert_eq!(output.result(), "[_1,_3,_5,_7,_9,...]"); + assert_eq!(output.result(), "[_1,_3,_5,_7,_9|...]"); } all_cells_unmarked(&wam.machine_st.heap);