binding attributed variables more eagerly after each implementation of verify_attributes/3 has been called (#248)
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
driver(Vars, Values) :-
|
||||
iterate(Vars, Values, ListOfListsOfGoalLists),
|
||||
'$redo_attr_var_bindings', % the bindings list is emptied here.
|
||||
'$clear_attr_var_bindings',
|
||||
!,
|
||||
call_goals(ListOfListsOfGoalLists),
|
||||
'$return_from_verify_attr'.
|
||||
@@ -8,6 +8,7 @@ driver(Vars, Values) :-
|
||||
iterate([Var|VarBindings], [Value|ValueBindings], [ListOfGoalLists | ListsCubed]) :-
|
||||
'$get_attr_list'(Var, Ls),
|
||||
call_verify_attributes(Ls, Var, Value, ListOfGoalLists),
|
||||
'$redo_attr_var_binding'(Var, Value),
|
||||
iterate(VarBindings, ValueBindings, ListsCubed).
|
||||
iterate([], [], []).
|
||||
|
||||
|
||||
@@ -649,7 +649,8 @@ impl ListingCompiler {
|
||||
let idx = code_dir
|
||||
.entry((name.clone(), arity))
|
||||
.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);
|
||||
code.extend(decl_code.into_iter());
|
||||
|
||||
@@ -1644,11 +1644,32 @@ impl MachineState {
|
||||
}
|
||||
};
|
||||
}
|
||||
&SystemClauseType::RedoAttrVarBindings => {
|
||||
let bindings = mem::replace(&mut self.attr_var_init.bindings, vec![]);
|
||||
&SystemClauseType::ClearAttrVarBindings => {
|
||||
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 {
|
||||
self.heap[h] = HeapCellValue::Addr(addr);
|
||||
match var {
|
||||
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 => {
|
||||
|
||||
Reference in New Issue
Block a user