]> Repositorios git - scryer-prolog.git/commitdiff
dereference bindings returned by stackful iterator (#1410, #1411)
authorMark Thom <[email protected]>
Sat, 9 Apr 2022 17:47:54 +0000 (11:47 -0600)
committerMark Thom <[email protected]>
Sat, 9 Apr 2022 17:47:54 +0000 (11:47 -0600)
src/machine/machine_state_impl.rs
src/machine/system_calls.rs

index 0822c9da8834ca50bfa17dfe369efef2685d2897..2686aef4b6706811b5ef30beff7373b897d0a648 100644 (file)
@@ -2047,16 +2047,16 @@ impl MachineState {
     }
 
     #[inline]
-    pub fn is_cyclic_term(&mut self, addr: HeapCellValue) -> bool {
-        if addr.is_constant() {
+    pub fn is_cyclic_term(&mut self, value: HeapCellValue) -> bool {
+        if value.is_constant() {
             return false;
         }
 
-        let addr = self.store(self.deref(addr));
-        let mut iter = stackful_preorder_iter(&mut self.heap, addr);
+        let mut iter = stackful_preorder_iter(&mut self.heap, value);
 
         while let Some(value) = iter.next() {
             if value.get_forwarding_bit() {
+                let value = unmark_cell_bits!(value);
                 let value = heap_bound_store(iter.heap, heap_bound_deref(iter.heap, value));
 
                 if value.is_compound() {
@@ -2514,11 +2514,20 @@ impl MachineState {
             return true;
         }
 
-        for v in stackful_preorder_iter(&mut self.heap, value) {
-            let v = unmark_cell_bits!(v);
+        let mut iter = stackful_preorder_iter(&mut self.heap, value);
 
-            if v.is_var() {
-                return true;
+        while let Some(value) = iter.next() {
+            let value = unmark_cell_bits!(value);
+
+            if value.is_var() {
+                let value = heap_bound_store(
+                    iter.heap,
+                    heap_bound_deref(iter.heap, value),
+                );
+
+                if value.is_var() {
+                    return true;
+                }
             }
         }
 
index 110f55ac136bf667d26f4faacc7063b313cfafca..6a572b8f491fb119d98d29a45ae53dfd5e51d475 100644 (file)
@@ -609,7 +609,7 @@ impl MachineState {
 
                 let value = unmark_cell_bits!(value);
 
-                if value.is_var() && !seen_set.contains(&value) {
+                if value.is_var() {
                     seen_set.insert(value);
                 }
             }
@@ -4902,26 +4902,29 @@ impl Machine {
             return;
         }
 
-        let mut seen_vec = vec![];
+        let mut seen_set = IndexSet::new();
 
         {
             let mut iter = stackful_preorder_iter(&mut self.machine_st.heap, stored_v);
 
-            while let Some(addr) = iter.next() {
-                let addr = unmark_cell_bits!(addr);
+            while let Some(value) = iter.next() {
+                let value = unmark_cell_bits!(value);
+
+                if value.is_var() {
+                    let value = heap_bound_store(
+                        iter.heap,
+                        heap_bound_deref(iter.heap, value)
+                    );
 
-                if addr.is_var() {
-                    seen_vec.push(addr);
+                    if value.is_var() {
+                        seen_set.insert(value);
+                    }
                 }
             }
         }
 
-        seen_vec.dedup_by(|v1, v2| {
-            compare_term_test!(self.machine_st, *v1, *v2) == Some(std::cmp::Ordering::Equal)
-        });
-
         let outcome = heap_loc_as_cell!(
-            iter_to_heap_list(&mut self.machine_st.heap, seen_vec.into_iter())
+            iter_to_heap_list(&mut self.machine_st.heap, seen_set.into_iter())
         );
 
         unify_fn!(self.machine_st, a2, outcome);