From: Mark Thom Date: Sat, 18 Feb 2023 21:12:07 +0000 (-0700) Subject: change '$delete_all_attributes' to '$delete_all_attributes_from_var' X-Git-Tag: v0.9.2~183 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=92d543b8a8a91ecbce8d74e4fd5c4b40a967e2a7;p=scryer-prolog.git change '$delete_all_attributes' to '$delete_all_attributes_from_var' --- diff --git a/build/instructions_template.rs b/build/instructions_template.rs index 6e21c165..0ea3fa59 100644 --- a/build/instructions_template.rs +++ b/build/instructions_template.rs @@ -566,8 +566,8 @@ enum SystemClauseType { PutToAttributedVarList, #[strum_discriminants(strum(props(Arity = "3", Name = "$del_from_attr_list")))] DeleteFromAttributedVarList, - #[strum_discriminants(strum(props(Arity = "1", Name = "$delete_all_attributes")))] - DeleteAllAttributes, + #[strum_discriminants(strum(props(Arity = "1", Name = "$delete_all_attributes_from_var")))] + DeleteAllAttributesFromVar, REPL(REPLCodePtr), } @@ -1629,7 +1629,7 @@ fn generate_instruction_preface() -> TokenStream { &Instruction::CallGetFromAttributedVarList(_) | &Instruction::CallPutToAttributedVarList(_) | &Instruction::CallDeleteFromAttributedVarList(_) | - &Instruction::CallDeleteAllAttributes(_) | + &Instruction::CallDeleteAllAttributesFromVar(_) | &Instruction::CallFetchGlobalVar(_) | &Instruction::CallFirstStream(_) | &Instruction::CallFlushOutput(_) | @@ -1845,7 +1845,7 @@ fn generate_instruction_preface() -> TokenStream { &Instruction::ExecuteGetFromAttributedVarList(_) | &Instruction::ExecutePutToAttributedVarList(_) | &Instruction::ExecuteDeleteFromAttributedVarList(_) | - &Instruction::ExecuteDeleteAllAttributes(_) | + &Instruction::ExecuteDeleteAllAttributesFromVar(_) | &Instruction::ExecuteFetchGlobalVar(_) | &Instruction::ExecuteFirstStream(_) | &Instruction::ExecuteFlushOutput(_) | diff --git a/src/machine/dispatch.rs b/src/machine/dispatch.rs index e15e8048..f0ed0469 100644 --- a/src/machine/dispatch.rs +++ b/src/machine/dispatch.rs @@ -5207,12 +5207,12 @@ impl Machine { self.delete_from_attributed_variable_list(); step_or_fail!(self, self.machine_st.p = self.machine_st.cp); } - &Instruction::CallDeleteAllAttributes(_) => { - self.delete_all_attributes(); + &Instruction::CallDeleteAllAttributesFromVar(_) => { + self.delete_all_attributes_from_var(); self.machine_st.p += 1; } - &Instruction::ExecuteDeleteAllAttributes(_) => { - self.delete_all_attributes(); + &Instruction::ExecuteDeleteAllAttributesFromVar(_) => { + self.delete_all_attributes_from_var(); self.machine_st.p = self.machine_st.cp; } } diff --git a/src/machine/project_attributes.pl b/src/machine/project_attributes.pl index 968859cd..0c51096e 100644 --- a/src/machine/project_attributes.pl +++ b/src/machine/project_attributes.pl @@ -1,8 +1,9 @@ :- module('$project_atts', [copy_term/3]). :- use_module(library(dcgs)). +:- use_module(library(error), [can_be/2]). :- use_module(library(lambda)). -:- use_module(library(lists), [foldl/4]). +:- use_module(library(lists), [foldl/4, maplist/2]). project_attributes(QueryVars, AttrVars) :- phrase(gather_attr_modules(AttrVars), Modules0), @@ -97,12 +98,13 @@ gather_residual_goals([V|Vs]) --> foldl(V+\M^phrase(M:attribute_goals(V)), Modules), gather_residual_goals(Vs). -delete_all_attributes(Term) :- '$delete_all_attributes'(Term). +delete_all_attributes_from_var(V) :- '$delete_all_attributes_from_var'(V). copy_term(Term, Copy, Gs) :- - '$term_attributed_variables'(Term, Vs), - findall(Term-Gs, - ( phrase(gather_residual_goals(Vs), Gs), - delete_all_attributes(Term) - ), - [Copy-Gs]). + can_be(list, Gs), + findall(Term-Rs, term_residual_goals(Term,Rs), [Copy-Gs]). + +term_residual_goals(Term,Rs) :- + '$term_attributed_variables'(Term, Vs), + phrase(gather_residual_goals(Vs), Rs), + maplist(delete_all_attributes_from_var, Vs). diff --git a/src/machine/system_calls.rs b/src/machine/system_calls.rs index 402bcac7..e39f3d22 100644 --- a/src/machine/system_calls.rs +++ b/src/machine/system_calls.rs @@ -1037,23 +1037,13 @@ impl MachineState { impl Machine { #[inline(always)] - pub(crate) fn delete_all_attributes(&mut self) { - let h = self.machine_st.heap.len(); - - self.machine_st.heap.push(heap_loc_as_cell!(h)); - self.machine_st.registers[2] = heap_loc_as_cell!(h); - - self.term_attributed_variables(); - - let mut list_of_attr_vars = self.deref_register(2); - - while let HeapCellValueTag::Lis = list_of_attr_vars.get_tag() { - let attr_var_loc = list_of_attr_vars.get_value(); + pub(crate) fn delete_all_attributes_from_var(&mut self) { + let attr_var = self.deref_register(1); + if let HeapCellValueTag::AttrVar = attr_var.get_tag() { + let attr_var_loc = attr_var.get_value(); self.machine_st.heap[attr_var_loc] = heap_loc_as_cell!(attr_var_loc); self.machine_st.trail(TrailRef::Ref(Ref::attr_var(attr_var_loc))); - - list_of_attr_vars = self.machine_st.heap[attr_var_loc + 1]; } }