From: Mark Thom Date: Tue, 6 Dec 2022 06:17:15 +0000 (-0700) Subject: avoid pushing stack variables to the heap in get_continuation_chunk (#1644) X-Git-Tag: v0.9.2~261 X-Git-Url: https://git.sagredo.dev/?a=commitdiff_plain;h=d383e5eb8b648d9511705f507ad9d122e78592a4;p=scryer-prolog.git avoid pushing stack variables to the heap in get_continuation_chunk (#1644) --- diff --git a/src/machine/system_calls.rs b/src/machine/system_calls.rs index f249f655..0006f53f 100644 --- a/src/machine/system_calls.rs +++ b/src/machine/system_calls.rs @@ -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());