]> Repositorios git - scryer-prolog.git/commitdiff
change project_attributes to use attribute vars queue
authorMark Thom <[email protected]>
Thu, 21 Feb 2019 02:34:31 +0000 (19:34 -0700)
committerMark Thom <[email protected]>
Thu, 21 Feb 2019 02:34:31 +0000 (19:34 -0700)
src/prolog/machine/attributed_variables.rs
src/prolog/machine/system_calls.rs

index debf27be061675ca440d4d8d038da9f8068202e5..189704c2f2afe044ab3f2b50f700af6729d7be3f 100644 (file)
@@ -2,7 +2,7 @@ use prolog::heap_iter::*;
 use prolog::machine::*;
 
 use std::collections::HashSet;
-use std::collections::hash_set::IntoIter;
+use std::vec::IntoIter;
 
 pub static VERIFY_ATTRS: &str  = include_str!("attributed_variables.pl");
 pub static PROJECT_ATTRS: &str = include_str!("project_attributes.pl");
@@ -85,20 +85,19 @@ impl MachineState {
         self[temp_v!(2)] = value_list_addr;
     }
 
-    fn gather_attr_vars_created_since(&self, h: usize) -> IntoIter<Addr> {
-        let mut attr_vars = HashSet::new();
-
-        for i in h .. self.heap.h {
-            let addr = self.heap[i].as_addr(i);
+    pub(super)
+    fn gather_attr_vars_created_since(&self, b: usize) -> IntoIter<Addr>
+    {
+        let mut attr_vars: Vec<_> = self.attr_var_init.attr_var_queue[b ..]
+            .iter().filter_map(|h|
+                               match self.store(self.deref(Addr::HeapCell(*h))) {
+                                   Addr::AttrVar(h) => Some(Addr::AttrVar(h)),
+                                   _ => None
+                               }).collect();
 
-            match addr {
-                Addr::AttrVar(h) if i == h => {
-                    attr_vars.insert(Addr::AttrVar(h));
-                },
-                _ => {}
-            }
-        }
+        attr_vars.sort_unstable_by(|a1, a2| self.compare_term_test(a1, a2));
 
+        self.term_dedup(&mut attr_vars);
         attr_vars.into_iter()
     }
 
index 075901c85063063b8ac59dab8d1bb7b2b021b7cd..7e688e2b7f6325cd82bbd1843ea0d7c9b6f75e0a 100644 (file)
@@ -316,20 +316,12 @@ impl MachineState {
 
                 match self.store(self.deref(addr)) {
                     Addr::Con(Constant::Usize(b)) => {
-                        let mut attr_vars: Vec<_> = self.attr_var_init.attr_var_queue[b ..]
-                            .iter().filter_map(|h|
-                                match self.store(self.deref(Addr::HeapCell(*h))) {
-                                    Addr::AttrVar(h) => Some(Addr::AttrVar(h)),
-                                    _ => None
-                                }).collect();
-
-                        attr_vars.sort_unstable_by(|a1, a2| self.compare_term_test(a1, a2));
-
-                        self.term_dedup(&mut attr_vars);
-                        let var_list_addr = Addr::HeapCell(self.heap.to_list(attr_vars.into_iter()));
-
+                        let iter = self.gather_attr_vars_created_since(b);
+                        
+                        let var_list_addr = Addr::HeapCell(self.heap.to_list(iter));                        
                         let list_addr = self[temp_v!(2)].clone();
-                        self.unify(var_list_addr, list_addr);
+                        
+                        self.unify(var_list_addr, list_addr);                        
                     },
                     _ => self.fail = true
                 }