correct bugs in verify_attributes handling
This commit is contained in:
@@ -4,9 +4,8 @@ pub static VERIFY_ATTRS: &str = "
|
||||
iterate([Var|VarBindings], [Value|ValueBindings]) :-
|
||||
'$get_attr_list'(Var, Ls),
|
||||
call_verify_attributes(Ls, Var, Value),
|
||||
iterate(VarBindings, ValueBindings),
|
||||
'$restore_p_from_sfcp'.
|
||||
iterate([], []).
|
||||
iterate(VarBindings, ValueBindings).
|
||||
iterate([], []) :- '$restore_p_from_sfcp'.
|
||||
|
||||
call_verify_attributes(Attrs, _, _) :-
|
||||
var(Attrs), !.
|
||||
@@ -21,8 +20,7 @@ call_verify_attributes([Attr|Attrs], Var, Value) :-
|
||||
call_verify_attributes_goals(Goals) :-
|
||||
var(Goals), throw(error(instantiation_error, call_verify_attributes_goals/1)).
|
||||
call_verify_attributes_goals([Goal|Goals]) :-
|
||||
call(Goal), !,
|
||||
call_verify_attributes_goals(Goals).
|
||||
call(Goal), !, call_verify_attributes_goals(Goals).
|
||||
call_verify_attributes_goals([]).
|
||||
";
|
||||
|
||||
@@ -66,13 +64,13 @@ impl MachineState {
|
||||
pub(super)
|
||||
fn verify_attributes(&mut self)
|
||||
{
|
||||
/* STEP 1: Undo bindings in machine (DONE)
|
||||
STEP 2: Write the list of bindings to two lists in the heap, one for vars, one for values. (DONE)
|
||||
STEP 3: Swap the machine's Registers for attr_var_init's Registers. (DONE)
|
||||
STEP 4: Pass the addresses of the lists to iterate in the attr_vars special form. (DONE)
|
||||
STEP 5: Restore AttrVarInitializer::special_form_cp to self.p (DONE).
|
||||
STEP 6: Swap the bindings' Registers back for the machine's Registers. (DONE)
|
||||
STEP 7: Redo the bindings. (DONE)
|
||||
/* STEP 1: Undo bindings in machine.
|
||||
STEP 2: Write the list of bindings to two lists in the heap, one for vars, one for values.
|
||||
STEP 3: Swap the machine's Registers for attr_var_init's Registers.
|
||||
STEP 4: Pass the addresses of the lists to iterate in the attr_vars special form.
|
||||
STEP 5: Restore AttrVarInitializer::special_form_cp to self.p.
|
||||
STEP 6: Swap the bindings' Registers back for the machine's Registers.
|
||||
STEP 7: Redo the bindings.
|
||||
STEP 8: Continue.
|
||||
*/
|
||||
|
||||
|
||||
@@ -1620,11 +1620,18 @@ impl MachineState {
|
||||
return Ordering::Less;
|
||||
},
|
||||
(HeapCellValue::Addr(Addr::HeapCell(hc1)),
|
||||
HeapCellValue::Addr(Addr::HeapCell(hc2))) =>
|
||||
HeapCellValue::Addr(Addr::HeapCell(hc2)))
|
||||
| (HeapCellValue::Addr(Addr::AttrVar(hc1)),
|
||||
HeapCellValue::Addr(Addr::HeapCell(hc2)))
|
||||
| (HeapCellValue::Addr(Addr::HeapCell(hc1)),
|
||||
HeapCellValue::Addr(Addr::AttrVar(hc2)))
|
||||
| (HeapCellValue::Addr(Addr::AttrVar(hc1)),
|
||||
HeapCellValue::Addr(Addr::AttrVar(hc2))) =>
|
||||
if hc1 != hc2 {
|
||||
return hc1.cmp(&hc2);
|
||||
},
|
||||
(HeapCellValue::Addr(Addr::HeapCell(_)), _) =>
|
||||
(HeapCellValue::Addr(Addr::HeapCell(_)), _)
|
||||
| (HeapCellValue::Addr(Addr::AttrVar(_)), _) =>
|
||||
return Ordering::Less,
|
||||
(HeapCellValue::Addr(Addr::StackCell(fr1, sc1)),
|
||||
HeapCellValue::Addr(Addr::StackCell(fr2, sc2))) =>
|
||||
@@ -1636,12 +1643,16 @@ impl MachineState {
|
||||
return Ordering::Greater;
|
||||
},
|
||||
(HeapCellValue::Addr(Addr::StackCell(..)),
|
||||
HeapCellValue::Addr(Addr::HeapCell(_))) =>
|
||||
HeapCellValue::Addr(Addr::HeapCell(_)))
|
||||
| (HeapCellValue::Addr(Addr::StackCell(..)),
|
||||
HeapCellValue::Addr(Addr::AttrVar(_))) =>
|
||||
return Ordering::Greater,
|
||||
(HeapCellValue::Addr(Addr::StackCell(..)), _) =>
|
||||
return Ordering::Less,
|
||||
(HeapCellValue::Addr(Addr::Con(Constant::Number(..))),
|
||||
HeapCellValue::Addr(Addr::HeapCell(_))) =>
|
||||
HeapCellValue::Addr(Addr::HeapCell(_)))
|
||||
| (HeapCellValue::Addr(Addr::Con(Constant::Number(..))),
|
||||
HeapCellValue::Addr(Addr::AttrVar(_))) =>
|
||||
return Ordering::Greater,
|
||||
(HeapCellValue::Addr(Addr::Con(Constant::Number(..))),
|
||||
HeapCellValue::Addr(Addr::StackCell(..))) =>
|
||||
@@ -1654,7 +1665,9 @@ impl MachineState {
|
||||
(HeapCellValue::Addr(Addr::Con(Constant::Number(_))), _) =>
|
||||
return Ordering::Less,
|
||||
(HeapCellValue::Addr(Addr::Con(Constant::String(..))),
|
||||
HeapCellValue::Addr(Addr::HeapCell(_))) =>
|
||||
HeapCellValue::Addr(Addr::HeapCell(_)))
|
||||
| (HeapCellValue::Addr(Addr::Con(Constant::String(..))),
|
||||
HeapCellValue::Addr(Addr::AttrVar(_))) =>
|
||||
return Ordering::Greater,
|
||||
(HeapCellValue::Addr(Addr::Con(Constant::String(..))),
|
||||
HeapCellValue::Addr(Addr::StackCell(..))) =>
|
||||
@@ -1680,7 +1693,9 @@ impl MachineState {
|
||||
(HeapCellValue::Addr(Addr::Con(Constant::String(_))), _) =>
|
||||
return Ordering::Less,
|
||||
(HeapCellValue::Addr(Addr::Con(Constant::Atom(..))),
|
||||
HeapCellValue::Addr(Addr::HeapCell(_))) =>
|
||||
HeapCellValue::Addr(Addr::HeapCell(_)))
|
||||
| (HeapCellValue::Addr(Addr::Con(Constant::Atom(..))),
|
||||
HeapCellValue::Addr(Addr::AttrVar(_))) =>
|
||||
return Ordering::Greater,
|
||||
(HeapCellValue::Addr(Addr::Con(Constant::Atom(..))),
|
||||
HeapCellValue::Addr(Addr::StackCell(..))) =>
|
||||
@@ -2075,7 +2090,12 @@ impl MachineState {
|
||||
},
|
||||
(HeapCellValue::Addr(Addr::Lis(_)), HeapCellValue::Addr(Addr::Lis(_))) =>
|
||||
continue,
|
||||
(HeapCellValue::Addr(v1 @ Addr::HeapCell(_)), HeapCellValue::Addr(v2 @ Addr::HeapCell(_)))
|
||||
(HeapCellValue::Addr(v1 @ Addr::HeapCell(_)), HeapCellValue::Addr(v2 @ Addr::AttrVar(_)))
|
||||
| (HeapCellValue::Addr(v1 @ Addr::StackCell(..)), HeapCellValue::Addr(v2 @ Addr::AttrVar(_)))
|
||||
| (HeapCellValue::Addr(v1 @ Addr::AttrVar(_)), HeapCellValue::Addr(v2 @ Addr::AttrVar(_)))
|
||||
| (HeapCellValue::Addr(v1 @ Addr::AttrVar(_)), HeapCellValue::Addr(v2 @ Addr::HeapCell(_)))
|
||||
| (HeapCellValue::Addr(v1 @ Addr::AttrVar(_)), HeapCellValue::Addr(v2 @ Addr::StackCell(..)))
|
||||
| (HeapCellValue::Addr(v1 @ Addr::HeapCell(_)), HeapCellValue::Addr(v2 @ Addr::HeapCell(_)))
|
||||
| (HeapCellValue::Addr(v1 @ Addr::HeapCell(_)), HeapCellValue::Addr(v2 @ Addr::StackCell(..)))
|
||||
| (HeapCellValue::Addr(v1 @ Addr::StackCell(..)), HeapCellValue::Addr(v2 @ Addr::StackCell(..)))
|
||||
| (HeapCellValue::Addr(v1 @ Addr::StackCell(..)), HeapCellValue::Addr(v2 @ Addr::HeapCell(_))) =>
|
||||
|
||||
@@ -451,7 +451,16 @@ impl MachineState {
|
||||
mem::swap(&mut bindings, &mut self.attr_var_init.bindings);
|
||||
|
||||
for (h, addr) in bindings {
|
||||
self.heap[h] = HeapCellValue::Addr(addr);
|
||||
let deref_h = self.store(self.deref(Addr::AttrVar(h)));
|
||||
|
||||
if &Addr::AttrVar(h) != &deref_h {
|
||||
if &deref_h != &addr {
|
||||
self.fail = true;
|
||||
return Ok(());
|
||||
}
|
||||
} else {
|
||||
self.heap[h] = HeapCellValue::Addr(addr);
|
||||
}
|
||||
}
|
||||
|
||||
return Ok(());
|
||||
|
||||
Reference in New Issue
Block a user