binding attributed variables more eagerly after each implementation of verify_attributes/3 has been called (#248)

This commit is contained in:
Mark Thom
2019-12-05 00:33:46 -07:00
parent 9ae029b04d
commit 018b076835
5 changed files with 49 additions and 16 deletions

View File

@@ -165,6 +165,7 @@ pub enum SystemClauseType {
CallAttributeGoals, CallAttributeGoals,
CharCode, CharCode,
CharsToNumber, CharsToNumber,
ClearAttrVarBindings,
CloneAttributeGoals, CloneAttributeGoals,
CodesToNumber, CodesToNumber,
CopyTermWithoutAttrVars, CopyTermWithoutAttrVars,
@@ -214,7 +215,7 @@ pub enum SystemClauseType {
REPL(REPLCodePtr), REPL(REPLCodePtr),
ReadQueryTerm, ReadQueryTerm,
ReadTerm, ReadTerm,
RedoAttrVarBindings, RedoAttrVarBinding,
RemoveCallPolicyCheck, RemoveCallPolicyCheck,
RemoveInferenceCounter, RemoveInferenceCounter,
ResetGlobalVarAtKey, ResetGlobalVarAtKey,
@@ -280,6 +281,7 @@ impl SystemClauseType {
&SystemClauseType::REPL(REPLCodePtr::UseQualifiedModuleFromFile) => { &SystemClauseType::REPL(REPLCodePtr::UseQualifiedModuleFromFile) => {
clause_name!("$use_qualified_module_from_file") clause_name!("$use_qualified_module_from_file")
} }
&SystemClauseType::ClearAttrVarBindings => clause_name!("$clear_attr_var_bindings"),
&SystemClauseType::CopyToLiftedHeap => clause_name!("$copy_to_lh"), &SystemClauseType::CopyToLiftedHeap => clause_name!("$copy_to_lh"),
&SystemClauseType::DeleteAttribute => clause_name!("$del_attr_non_head"), &SystemClauseType::DeleteAttribute => clause_name!("$del_attr_non_head"),
&SystemClauseType::DeleteHeadAttribute => clause_name!("$del_attr_head"), &SystemClauseType::DeleteHeadAttribute => clause_name!("$del_attr_head"),
@@ -340,7 +342,7 @@ impl SystemClauseType {
&SystemClauseType::NumberToChars => clause_name!("$number_to_chars"), &SystemClauseType::NumberToChars => clause_name!("$number_to_chars"),
&SystemClauseType::NumberToCodes => clause_name!("$number_to_codes"), &SystemClauseType::NumberToCodes => clause_name!("$number_to_codes"),
&SystemClauseType::RawInputReadChar => clause_name!("$raw_input_read_char"), &SystemClauseType::RawInputReadChar => clause_name!("$raw_input_read_char"),
&SystemClauseType::RedoAttrVarBindings => clause_name!("$redo_attr_var_bindings"), &SystemClauseType::RedoAttrVarBinding => clause_name!("$redo_attr_var_binding"),
&SystemClauseType::RemoveCallPolicyCheck => clause_name!("$remove_call_policy_check"), &SystemClauseType::RemoveCallPolicyCheck => clause_name!("$remove_call_policy_check"),
&SystemClauseType::RemoveInferenceCounter => clause_name!("$remove_inference_counter"), &SystemClauseType::RemoveInferenceCounter => clause_name!("$remove_inference_counter"),
&SystemClauseType::RestoreCutPolicy => clause_name!("$restore_cut_policy"), &SystemClauseType::RestoreCutPolicy => clause_name!("$restore_cut_policy"),
@@ -395,6 +397,7 @@ impl SystemClauseType {
("$call_attribute_goals", 2) => Some(SystemClauseType::CallAttributeGoals), ("$call_attribute_goals", 2) => Some(SystemClauseType::CallAttributeGoals),
("$char_code", 2) => Some(SystemClauseType::CharCode), ("$char_code", 2) => Some(SystemClauseType::CharCode),
("$chars_to_number", 2) => Some(SystemClauseType::CharsToNumber), ("$chars_to_number", 2) => Some(SystemClauseType::CharsToNumber),
("$clear_attr_var_bindings", 0) => Some(SystemClauseType::ClearAttrVarBindings),
("$clone_attribute_goals", 1) => Some(SystemClauseType::CloneAttributeGoals), ("$clone_attribute_goals", 1) => Some(SystemClauseType::CloneAttributeGoals),
("$codes_to_number", 2) => Some(SystemClauseType::CodesToNumber), ("$codes_to_number", 2) => Some(SystemClauseType::CodesToNumber),
("$copy_term_without_attr_vars", 2) => Some(SystemClauseType::CopyTermWithoutAttrVars), ("$copy_term_without_attr_vars", 2) => Some(SystemClauseType::CopyTermWithoutAttrVars),
@@ -444,7 +447,7 @@ impl SystemClauseType {
("$number_to_chars", 2) => Some(SystemClauseType::NumberToChars), ("$number_to_chars", 2) => Some(SystemClauseType::NumberToChars),
("$number_to_codes", 2) => Some(SystemClauseType::NumberToCodes), ("$number_to_codes", 2) => Some(SystemClauseType::NumberToCodes),
("$op", 3) => Some(SystemClauseType::OpDeclaration), ("$op", 3) => Some(SystemClauseType::OpDeclaration),
("$redo_attr_var_bindings", 0) => Some(SystemClauseType::RedoAttrVarBindings), ("$redo_attr_var_binding", 2) => Some(SystemClauseType::RedoAttrVarBinding),
("$remove_call_policy_check", 1) => Some(SystemClauseType::RemoveCallPolicyCheck), ("$remove_call_policy_check", 1) => Some(SystemClauseType::RemoveCallPolicyCheck),
("$remove_inference_counter", 2) => Some(SystemClauseType::RemoveInferenceCounter), ("$remove_inference_counter", 2) => Some(SystemClauseType::RemoveInferenceCounter),
("$restore_cut_policy", 0) => Some(SystemClauseType::RestoreCutPolicy), ("$restore_cut_policy", 0) => Some(SystemClauseType::RestoreCutPolicy),

View File

@@ -46,7 +46,8 @@
'$get_attr_list'(V, Ls), '$add_to_list'(Ls, V, Attr). '$get_attr_list'(V, Ls), '$add_to_list'(Ls, V, Attr).
'$add_to_list'(Ls, V, Attr) :- '$add_to_list'(Ls, V, Attr) :-
( var(Ls) -> Ls = [Attr | _], '$enqueue_attr_var'(V) ( var(Ls) ->
Ls = [Attr | _], '$enqueue_attr_var'(V)
; Ls = [_ | Ls0], '$add_to_list'(Ls0, V, Attr) ; Ls = [_ | Ls0], '$add_to_list'(Ls0, V, Attr)
). ).
@@ -56,7 +57,8 @@
Ls0 = [Att | Ls1], Ls0 = [Att | Ls1],
nonvar(Att), nonvar(Att),
( Att \= Attr -> '$del_attr_buried'(Ls0, Ls1, V, Attr) ( Att \= Attr -> '$del_attr_buried'(Ls0, Ls1, V, Attr)
; '$enqueue_attr_var'(V), '$del_attr_head'(V), '$del_attr'(Ls1, V, Attr) ; '$enqueue_attr_var'(V),
'$del_attr_head'(V), '$del_attr'(Ls1, V, Attr)
). ).
'$del_attr_step'(Ls1, V, Attr) :- '$del_attr_step'(Ls1, V, Attr) :-
@@ -122,13 +124,18 @@ put_attr(Name, Arity) -->
{ functor(Attr, Name, Arity), { functor(Attr, Name, Arity),
numbervars(Attr, 0, Arity), numbervars(Attr, 0, Arity),
V = '$VAR'(Arity) }, V = '$VAR'(Arity) },
[(put_atts(V, +Attr) :- !, functor(Attr, Head, Arity), functor(AttrForm, Head, Arity), [(put_atts(V, +Attr) :- !, functor(Attr, Head, Arity),
'$get_attr_list'(V, Ls), '$del_attr'(Ls, V, AttrForm), functor(AttrForm, Head, Arity),
'$get_attr_list'(V, Ls),
'$del_attr'(Ls, V, AttrForm),
'$put_attr'(V, Attr)), '$put_attr'(V, Attr)),
(put_atts(V, Attr) :- !, functor(Attr, Head, Arity), functor(AttrForm, Head, Arity), (put_atts(V, Attr) :- !, functor(Attr, Head, Arity),
'$get_attr_list'(V, Ls), '$del_attr'(Ls, V, AttrForm), functor(AttrForm, Head, Arity),
'$get_attr_list'(V, Ls),
'$del_attr'(Ls, V, AttrForm),
'$put_attr'(V, Attr)), '$put_attr'(V, Attr)),
(put_atts(V, -Attr) :- !, functor(Attr, _, _), '$get_attr_list'(V, Ls), (put_atts(V, -Attr) :- !, functor(Attr, _, _),
'$get_attr_list'(V, Ls),
'$del_attr'(Ls, V, Attr))]. '$del_attr'(Ls, V, Attr))].
get_attr(Name, Arity) --> get_attr(Name, Arity) -->

View File

@@ -1,6 +1,6 @@
driver(Vars, Values) :- driver(Vars, Values) :-
iterate(Vars, Values, ListOfListsOfGoalLists), iterate(Vars, Values, ListOfListsOfGoalLists),
'$redo_attr_var_bindings', % the bindings list is emptied here. '$clear_attr_var_bindings',
!, !,
call_goals(ListOfListsOfGoalLists), call_goals(ListOfListsOfGoalLists),
'$return_from_verify_attr'. '$return_from_verify_attr'.
@@ -8,6 +8,7 @@ driver(Vars, Values) :-
iterate([Var|VarBindings], [Value|ValueBindings], [ListOfGoalLists | ListsCubed]) :- iterate([Var|VarBindings], [Value|ValueBindings], [ListOfGoalLists | ListsCubed]) :-
'$get_attr_list'(Var, Ls), '$get_attr_list'(Var, Ls),
call_verify_attributes(Ls, Var, Value, ListOfGoalLists), call_verify_attributes(Ls, Var, Value, ListOfGoalLists),
'$redo_attr_var_binding'(Var, Value),
iterate(VarBindings, ValueBindings, ListsCubed). iterate(VarBindings, ValueBindings, ListsCubed).
iterate([], [], []). iterate([], [], []).

View File

@@ -649,7 +649,8 @@ impl ListingCompiler {
let idx = code_dir let idx = code_dir
.entry((name.clone(), arity)) .entry((name.clone(), arity))
.or_insert(CodeIndex::default()); .or_insert(CodeIndex::default());
set_code_index!(idx, IndexPtr::Index(p), self.get_module_name());
set_code_index!(idx, IndexPtr::Index(p), self.get_module_name());
self.localize_self_calls(name, arity, &mut decl_code, p); self.localize_self_calls(name, arity, &mut decl_code, p);
code.extend(decl_code.into_iter()); code.extend(decl_code.into_iter());

View File

@@ -1644,11 +1644,32 @@ impl MachineState {
} }
}; };
} }
&SystemClauseType::RedoAttrVarBindings => { &SystemClauseType::ClearAttrVarBindings => {
let bindings = mem::replace(&mut self.attr_var_init.bindings, vec![]); self.attr_var_init.bindings.clear();
}
&SystemClauseType::RedoAttrVarBinding => {
let var = self.store(self.deref(self[temp_v!(1)].clone()));
let value = self.store(self.deref(self[temp_v!(2)].clone()));
for (h, addr) in bindings { match var {
self.heap[h] = HeapCellValue::Addr(addr); Addr::AttrVar(h) => {
if let Addr::AttrVar(h1) = value {
self.heap[h] = HeapCellValue::Addr(Addr::AttrVar(h1));
// append h's attributes list to h1's.
let mut l = h1 + 1;
while let Addr::Lis(l1) = self.store(self.deref(self.heap[l].as_addr(l))) {
l = l1 + 1;
}
self.heap[l] = HeapCellValue::Addr(Addr::HeapCell(h + 1));
self.trail(TrailRef::Ref(Ref::HeapCell(l)));
} else {
self.heap[h] = HeapCellValue::Addr(value);
}
}
_ => unreachable!()
} }
} }
&SystemClauseType::ResetGlobalVarAtKey => { &SystemClauseType::ResetGlobalVarAtKey => {