From: Mark Thom Date: Sun, 13 Mar 2022 16:48:03 +0000 (-0600) Subject: throw errors on cycles in sort/2 and keysort/2 (#1350 and #1351) X-Git-Tag: v0.9.1~111 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=c55bfa2c6e816824f8928bde3717d94fc2ec8491;p=scryer-prolog.git throw errors on cycles in sort/2 and keysort/2 (#1350 and #1351) --- diff --git a/src/heap_print.rs b/src/heap_print.rs index 18d2d427..5380133f 100644 --- a/src/heap_print.rs +++ b/src/heap_print.rs @@ -1193,7 +1193,7 @@ impl<'a, Outputter: HCValueOutputter> HCPrinter<'a, Outputter> { self.state_stack.push(TokenOrRedirect::Atom(atom!("..."))); self.state_stack.push(TokenOrRedirect::HeadTailSeparator); } else if end_cell != empty_list_as_cell!() { - if value.get_tag() != HeapCellValueTag::CStr { + if end_h != h+1 && value.get_tag() != HeapCellValueTag::CStr { self.iter.pop_stack(); self.iter.push_stack(h+1); } diff --git a/src/machine/machine_errors.rs b/src/machine/machine_errors.rs index 889eb7ee..ced4c1af 100644 --- a/src/machine/machine_errors.rs +++ b/src/machine/machine_errors.rs @@ -792,7 +792,7 @@ impl MachineState { let err = self.instantiation_error(); return Err(self.error_form(err, stub_gen())) } - CycleSearchResult::NotList(..) => { + CycleSearchResult::NotList(..) | CycleSearchResult::Cyclic(_) => { let err = self.type_error(ValidType::List, list); return Err(self.error_form(err, stub_gen())); } @@ -800,7 +800,7 @@ impl MachineState { }; match BrentAlgState::detect_cycles(&self.heap, sorted) { - CycleSearchResult::NotList(..) if !sorted.is_var() => { + CycleSearchResult::NotList(..) | CycleSearchResult::Cyclic(_) if !sorted.is_var() => { let err = self.type_error(ValidType::List, sorted); Err(self.error_form(err, stub_gen())) } @@ -812,7 +812,7 @@ impl MachineState { let stub_gen = || functor_stub(atom!("keysort"), 2); match BrentAlgState::detect_cycles(&self.heap, list) { - CycleSearchResult::NotList(..) if !list.is_var() => { + CycleSearchResult::NotList(..) | CycleSearchResult::Cyclic(_) if !list.is_var() => { let err = self.type_error(ValidType::List, list); Err(self.error_form(err, stub_gen())) } @@ -878,7 +878,7 @@ impl MachineState { let err = self.instantiation_error(); Err(self.error_form(err, stub_gen())) } - CycleSearchResult::NotList(..) => { + CycleSearchResult::NotList(..) | CycleSearchResult::Cyclic(_) => { let err = self.type_error(ValidType::List, pairs); Err(self.error_form(err, stub_gen())) }