]> Repositorios git - scryer-prolog.git/commitdiff
dereference list link in delete_attribute (#1148)
authorMark Thom <[email protected]>
Fri, 4 Mar 2022 06:22:36 +0000 (23:22 -0700)
committerMark Thom <[email protected]>
Sun, 6 Mar 2022 00:39:03 +0000 (17:39 -0700)
src/machine/mod.rs
src/machine/system_calls.rs

index 6ce7a7d75bfd5205e4db343bc9681d6e79448146..19e6d5a1cffc607b5f03d6c83e3472af3cf119d4 100644 (file)
@@ -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);
index 88c857723dc817b0c69a7561946058fa9e2aa744..b8bd9063e8c8222e7d02d8a7d85b76afb8a95fd5 100644 (file)
@@ -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();
     }