]> Repositorios git - scryer-prolog.git/commitdiff
avoid pushing stack variables to the heap in get_continuation_chunk (#1644)
authorMark Thom <[email protected]>
Tue, 6 Dec 2022 06:17:15 +0000 (23:17 -0700)
committerMark Thom <[email protected]>
Tue, 6 Dec 2022 06:17:15 +0000 (23:17 -0700)
src/machine/system_calls.rs

index f249f655e51e9647c54ef2f800bf279b0029ad4e..0006f53fee1ab09b38967edf15bc54d50790f7eb 100644 (file)
@@ -4336,7 +4336,21 @@ impl Machine {
         let mut addrs = vec![];
 
         for idx in 1..num_cells + 1 {
-            addrs.push(self.machine_st.stack[stack_loc!(AndFrame, e, idx)]);
+            let addr = self.machine_st.stack[stack_loc!(AndFrame, e, idx)];
+            let addr = self.machine_st.store(self.machine_st.deref(addr));
+
+            // avoid pushing stack variables to the heap where they
+            // must not go.
+            if addr.is_stack_var() {
+                let h = self.machine_st.heap.len();
+
+                self.machine_st.heap.push(heap_loc_as_cell!(h));
+                self.machine_st.bind(Ref::heap_cell(h), addr);
+
+                addrs.push(heap_loc_as_cell!(h));
+            } else {
+                addrs.push(addr);
+            }
         }
 
         let chunk = str_loc_as_cell!(self.machine_st.heap.len());