dereference list link in delete_attribute (#1148)
This commit is contained in:
@@ -539,7 +539,7 @@ impl Machine {
|
|||||||
self.machine_st.tr = or_frame.prelude.tr;
|
self.machine_st.tr = or_frame.prelude.tr;
|
||||||
|
|
||||||
self.reset_attr_var_state();
|
self.reset_attr_var_state();
|
||||||
self.machine_st.hb = self.machine_st.heap.len();
|
self.machine_st.hb = target_h;
|
||||||
|
|
||||||
self.unwind_trail(old_tr, curr_tr);
|
self.unwind_trail(old_tr, curr_tr);
|
||||||
|
|
||||||
@@ -563,7 +563,6 @@ impl Machine {
|
|||||||
self.machine_st.e = or_frame.prelude.e;
|
self.machine_st.e = or_frame.prelude.e;
|
||||||
self.machine_st.cp = or_frame.prelude.cp;
|
self.machine_st.cp = or_frame.prelude.cp;
|
||||||
|
|
||||||
// WAS: or_frame.prelude.bp = self.machine_st.p + 1;
|
|
||||||
or_frame.prelude.biip += 1;
|
or_frame.prelude.biip += 1;
|
||||||
|
|
||||||
let old_tr = or_frame.prelude.tr;
|
let old_tr = or_frame.prelude.tr;
|
||||||
@@ -573,14 +572,14 @@ impl Machine {
|
|||||||
self.machine_st.tr = or_frame.prelude.tr;
|
self.machine_st.tr = or_frame.prelude.tr;
|
||||||
self.reset_attr_var_state();
|
self.reset_attr_var_state();
|
||||||
|
|
||||||
|
self.machine_st.hb = target_h;
|
||||||
|
self.machine_st.p = self.machine_st.p + offset;
|
||||||
|
|
||||||
self.unwind_trail(old_tr, curr_tr);
|
self.unwind_trail(old_tr, curr_tr);
|
||||||
|
|
||||||
self.machine_st.trail.truncate(self.machine_st.tr);
|
self.machine_st.trail.truncate(self.machine_st.tr);
|
||||||
self.machine_st.heap.truncate(target_h);
|
self.machine_st.heap.truncate(target_h);
|
||||||
|
|
||||||
self.machine_st.hb = self.machine_st.heap.len();
|
|
||||||
self.machine_st.p = self.machine_st.p + offset;
|
|
||||||
|
|
||||||
self.machine_st.oip = 0;
|
self.machine_st.oip = 0;
|
||||||
self.machine_st.iip = 0;
|
self.machine_st.iip = 0;
|
||||||
}
|
}
|
||||||
@@ -607,15 +606,16 @@ impl Machine {
|
|||||||
self.machine_st.b = or_frame.prelude.b;
|
self.machine_st.b = or_frame.prelude.b;
|
||||||
|
|
||||||
self.reset_attr_var_state();
|
self.reset_attr_var_state();
|
||||||
|
|
||||||
|
self.machine_st.hb = target_h;
|
||||||
|
self.machine_st.p = self.machine_st.p + offset;
|
||||||
|
|
||||||
self.unwind_trail(old_tr, curr_tr);
|
self.unwind_trail(old_tr, curr_tr);
|
||||||
|
|
||||||
self.machine_st.trail.truncate(self.machine_st.tr);
|
self.machine_st.trail.truncate(self.machine_st.tr);
|
||||||
self.machine_st.stack.truncate(b);
|
self.machine_st.stack.truncate(b);
|
||||||
self.machine_st.heap.truncate(target_h);
|
self.machine_st.heap.truncate(target_h);
|
||||||
|
|
||||||
self.machine_st.hb = self.machine_st.heap.len();
|
|
||||||
self.machine_st.p = self.machine_st.p + offset;
|
|
||||||
|
|
||||||
self.machine_st.oip = 0;
|
self.machine_st.oip = 0;
|
||||||
self.machine_st.iip = 0;
|
self.machine_st.iip = 0;
|
||||||
}
|
}
|
||||||
@@ -642,14 +642,15 @@ impl Machine {
|
|||||||
self.machine_st.b = or_frame.prelude.b;
|
self.machine_st.b = or_frame.prelude.b;
|
||||||
|
|
||||||
self.reset_attr_var_state();
|
self.reset_attr_var_state();
|
||||||
|
|
||||||
|
self.machine_st.hb = target_h;
|
||||||
|
self.machine_st.p += 1;
|
||||||
|
|
||||||
self.unwind_trail(old_tr, curr_tr);
|
self.unwind_trail(old_tr, curr_tr);
|
||||||
|
|
||||||
self.machine_st.trail.truncate(self.machine_st.tr);
|
self.machine_st.trail.truncate(self.machine_st.tr);
|
||||||
self.machine_st.stack.truncate(b);
|
self.machine_st.stack.truncate(b);
|
||||||
self.machine_st.heap.truncate(target_h);
|
self.machine_st.heap.truncate(target_h);
|
||||||
|
|
||||||
self.machine_st.hb = self.machine_st.heap.len();
|
|
||||||
self.machine_st.p += 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
@@ -825,8 +826,13 @@ impl Machine {
|
|||||||
self.machine_st.heap[h] = heap_loc_as_cell!(h);
|
self.machine_st.heap[h] = heap_loc_as_cell!(h);
|
||||||
}
|
}
|
||||||
TrailEntryTag::TrailedAttrVarListLink => {
|
TrailEntryTag::TrailedAttrVarListLink => {
|
||||||
let l = self.machine_st.trail[i + 1].get_value();
|
let value = HeapCellValue::from_bytes(
|
||||||
self.machine_st.heap[h] = list_loc_as_cell!(l);
|
self.machine_st.trail[i + 1].into_bytes()
|
||||||
|
);
|
||||||
|
|
||||||
|
if value.get_value() < self.machine_st.hb {
|
||||||
|
self.machine_st.heap[h] = value;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
TrailEntryTag::TrailedBlackboardEntry => {
|
TrailEntryTag::TrailedBlackboardEntry => {
|
||||||
let key = Atom::from(h);
|
let key = Atom::from(h);
|
||||||
|
|||||||
@@ -2833,7 +2833,7 @@ impl Machine {
|
|||||||
if let HeapCellValueTag::Lis = ls1.get_tag() {
|
if let HeapCellValueTag::Lis = ls1.get_tag() {
|
||||||
let l2 = ls1.get_value();
|
let l2 = ls1.get_value();
|
||||||
|
|
||||||
let old_addr = self.machine_st.heap[l1+1];
|
let old_addr = self.machine_st.store(self.machine_st.deref(self.machine_st.heap[l1+1]));
|
||||||
let tail = self.machine_st.store(self.machine_st.deref(heap_loc_as_cell!(l2 + 1)));
|
let tail = self.machine_st.store(self.machine_st.deref(heap_loc_as_cell!(l2 + 1)));
|
||||||
|
|
||||||
let tail = if tail.is_var() {
|
let tail = if tail.is_var() {
|
||||||
@@ -3709,7 +3709,7 @@ impl Machine {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub(crate) fn reset_attr_var_state(&mut self) { // 1344! That's the value of self.b we need to pop this.
|
pub(crate) fn reset_attr_var_state(&mut self) {
|
||||||
self.restore_instr_at_verify_attr_interrupt();
|
self.restore_instr_at_verify_attr_interrupt();
|
||||||
self.machine_st.attr_var_init.reset();
|
self.machine_st.attr_var_init.reset();
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user