PutToAttributedVarList,
#[strum_discriminants(strum(props(Arity = "3", Name = "$del_from_attr_list")))]
DeleteFromAttributedVarList,
+ #[strum_discriminants(strum(props(Arity = "1", Name = "$delete_all_attributes")))]
+ DeleteAllAttributes,
REPL(REPLCodePtr),
}
&Instruction::CallGetFromAttributedVarList(_) |
&Instruction::CallPutToAttributedVarList(_) |
&Instruction::CallDeleteFromAttributedVarList(_) |
+ &Instruction::CallDeleteAllAttributes(_) |
&Instruction::CallFetchGlobalVar(_) |
&Instruction::CallFirstStream(_) |
&Instruction::CallFlushOutput(_) |
&Instruction::ExecuteGetFromAttributedVarList(_) |
&Instruction::ExecutePutToAttributedVarList(_) |
&Instruction::ExecuteDeleteFromAttributedVarList(_) |
+ &Instruction::ExecuteDeleteAllAttributes(_) |
&Instruction::ExecuteFetchGlobalVar(_) |
&Instruction::ExecuteFirstStream(_) |
&Instruction::ExecuteFlushOutput(_) |
current_module/1
]).
-
:- use_module(library(error)).
:- use_module(library(lists)).
:- use_module(library(pairs)).
integer(N),
N >= 0,
HeadArg =.. [Functor | InnerHeadArgs],
- length(SuppArgs, N),
+ % the next two lines are equivalent to length(SuppArgs, N) but
+ % avoid length/2 so that copy_term/3 (which is invoked by
+ % length/2) can be bootstrapped without self-reference.
+ functor(SuppArgsFunctor, '.', N),
+ SuppArgsFunctor =.. [_ | SuppArgs],
+ % length(SuppArgs, N),
append(InnerHeadArgs, SuppArgs, InnerHeadArgs0),
CompleteHeadArg =.. [Functor | InnerHeadArgs0].
:- module('$project_atts', [copy_term/3]).
+:- use_module(library(dcgs)).
+:- use_module(library(lambda)).
+:- use_module(library(lists), [foldl/4]).
+
project_attributes(QueryVars, AttrVars) :-
- gather_attr_modules(AttrVars, Modules0),
+ phrase(gather_attr_modules(AttrVars), Modules0),
sort(Modules0, Modules),
call_project_attributes(Modules, QueryVars, AttrVars).
call_project_attributes([], _, _).
call_project_attributes([Module|Modules], QueryVars, AttrVars) :-
( catch(Module:project_attributes(QueryVars, AttrVars),
- E,
- '$project_atts':'$print_project_attributes_exception'(Module, E)
- )
+ E,
+ '$project_atts':'$print_project_attributes_exception'(Module, E)
+ )
-> true
; true
),
module_prefixed_goals(Goals0, Module, Goals, Gs),
call_attribute_goals_with_module_prefix(Modules, GoalCaller, AttrVars, Gs).
+gather_attr_modules([]) --> [].
+gather_attr_modules([AttrVar|AttrVars]) -->
+ { '$get_attr_list'(AttrVar, Attrs) },
+ copy_attribute_modules(Attrs),
+ gather_attr_modules(AttrVars).
-gather_attr_modules([], []).
-gather_attr_modules([AttrVar|AttrVars], Modules) :-
- '$get_attr_list'(AttrVar, Attrs),
- copy_attribute_modules(Attrs, Modules, Modules0),
- gather_attr_modules(AttrVars, Modules0).
+copy_attribute_modules(Attrs) -->
+ { var(Attrs) },
+ !.
+copy_attribute_modules([Module:_|Attrs]) -->
+ [Module],
+ copy_attribute_modules(Attrs).
-copy_attribute_modules(Attrs, Ls, Ls) :-
- var(Attrs), !.
-copy_attribute_modules([Module:_|Attrs], [Module|Modules0], Modules1) :-
- copy_attribute_modules(Attrs, Modules0, Modules1).
+gather_residual_goals([]) --> [].
+gather_residual_goals([V|Vs]) -->
+ { '$get_attr_list'(V, Attrs),
+ phrase(copy_attribute_modules(Attrs), Modules0),
+ sort(Modules0, Modules) },
+ foldl(V+\M^phrase(M:attribute_goals(V)), Modules),
+ gather_residual_goals(Vs).
+delete_all_attributes(Term) :- '$delete_all_attributes'(Term).
-copy_term(Source, Dest, Goals) :-
- '$term_attributed_variables'(Source, AttrVars),
- gather_attr_modules(AttrVars, Modules0),
- sort(Modules0, Modules),
- call_attribute_goals_with_module_prefix(Modules, '$project_atts':call_query_var_goals,
- AttrVars, Goals0),
- sort(Goals0, Goals1),
- !,
- '$copy_term_without_attr_vars'([Source | Goals1], [Dest | Goals]).
+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]).
}
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();
+
+ 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];
+ }
+ }
+
#[inline(always)]
pub(crate) fn get_clause_p(&self, module_name: Atom) -> (usize, usize) {
use crate::machine::loader::CompilationTarget;