]> Repositorios git - scryer-prolog.git/commitdiff
throw errors on cycles in sort/2 and keysort/2 (#1350 and #1351)
authorMark Thom <[email protected]>
Sun, 13 Mar 2022 16:48:03 +0000 (10:48 -0600)
committerMark Thom <[email protected]>
Sun, 13 Mar 2022 17:03:52 +0000 (11:03 -0600)
src/heap_print.rs
src/machine/machine_errors.rs

index 18d2d4276f773460fb4738404bfdc1869cc38996..5380133fd0ca36af7d4226a812843f037460df13 100644 (file)
@@ -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);
                         }
index 889eb7ee0b7ab2464a5a84e2da9a9fba34a30dd2..ced4c1afd6db1dd11694273a42d3aba1a08581ea 100644 (file)
@@ -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()))
             }