From 0c25ffc26e61b46c8cf19b90da3be4ee184f8fb6 Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Thu, 3 Mar 2022 23:22:36 -0700 Subject: [PATCH] dereference list link in delete_attribute (#1148) --- src/machine/mod.rs | 32 +++++++++++++++++++------------- src/machine/system_calls.rs | 4 ++-- 2 files changed, 21 insertions(+), 15 deletions(-) diff --git a/src/machine/mod.rs b/src/machine/mod.rs index 6ce7a7d7..19e6d5a1 100644 --- a/src/machine/mod.rs +++ b/src/machine/mod.rs @@ -539,7 +539,7 @@ impl Machine { self.machine_st.tr = or_frame.prelude.tr; 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); @@ -563,7 +563,6 @@ impl Machine { self.machine_st.e = or_frame.prelude.e; self.machine_st.cp = or_frame.prelude.cp; - // WAS: or_frame.prelude.bp = self.machine_st.p + 1; or_frame.prelude.biip += 1; let old_tr = or_frame.prelude.tr; @@ -573,14 +572,14 @@ impl Machine { self.machine_st.tr = or_frame.prelude.tr; 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.machine_st.trail.truncate(self.machine_st.tr); 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.iip = 0; } @@ -607,15 +606,16 @@ impl Machine { self.machine_st.b = or_frame.prelude.b; 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.machine_st.trail.truncate(self.machine_st.tr); self.machine_st.stack.truncate(b); 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.iip = 0; } @@ -642,14 +642,15 @@ impl Machine { self.machine_st.b = or_frame.prelude.b; self.reset_attr_var_state(); + + self.machine_st.hb = target_h; + self.machine_st.p += 1; + self.unwind_trail(old_tr, curr_tr); self.machine_st.trail.truncate(self.machine_st.tr); self.machine_st.stack.truncate(b); self.machine_st.heap.truncate(target_h); - - self.machine_st.hb = self.machine_st.heap.len(); - self.machine_st.p += 1; } #[inline(always)] @@ -825,8 +826,13 @@ impl Machine { self.machine_st.heap[h] = heap_loc_as_cell!(h); } TrailEntryTag::TrailedAttrVarListLink => { - let l = self.machine_st.trail[i + 1].get_value(); - self.machine_st.heap[h] = list_loc_as_cell!(l); + let value = HeapCellValue::from_bytes( + self.machine_st.trail[i + 1].into_bytes() + ); + + if value.get_value() < self.machine_st.hb { + self.machine_st.heap[h] = value; + } } TrailEntryTag::TrailedBlackboardEntry => { let key = Atom::from(h); diff --git a/src/machine/system_calls.rs b/src/machine/system_calls.rs index 88c85772..b8bd9063 100644 --- a/src/machine/system_calls.rs +++ b/src/machine/system_calls.rs @@ -2833,7 +2833,7 @@ impl Machine { if let HeapCellValueTag::Lis = ls1.get_tag() { 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 = if tail.is_var() { @@ -3709,7 +3709,7 @@ impl Machine { } #[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.machine_st.attr_var_init.reset(); } -- 2.54.0