From 0453435bcd5f61aec345e2098eb328482d00a1cd Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Wed, 20 Feb 2019 19:34:31 -0700 Subject: [PATCH] change project_attributes to use attribute vars queue --- src/prolog/machine/attributed_variables.rs | 25 +++++++++++----------- src/prolog/machine/system_calls.rs | 18 +++++----------- 2 files changed, 17 insertions(+), 26 deletions(-) diff --git a/src/prolog/machine/attributed_variables.rs b/src/prolog/machine/attributed_variables.rs index debf27be..189704c2 100644 --- a/src/prolog/machine/attributed_variables.rs +++ b/src/prolog/machine/attributed_variables.rs @@ -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 { - 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 + { + 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() } diff --git a/src/prolog/machine/system_calls.rs b/src/prolog/machine/system_calls.rs index 075901c8..7e688e2b 100644 --- a/src/prolog/machine/system_calls.rs +++ b/src/prolog/machine/system_calls.rs @@ -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 } -- 2.54.0