From 02eb24cd577ddc1ee624b2001acb7b04ad2c419e Mon Sep 17 00:00:00 2001 From: Mark Thom Date: Sun, 12 Apr 2020 23:33:07 -0600 Subject: [PATCH] correct partial string copying by resetting threshold to redirected partial string stubs to 0 --- src/prolog/machine/copier.rs | 2 +- src/prolog/machine/stack.rs | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/prolog/machine/copier.rs b/src/prolog/machine/copier.rs index baa1f2b9..c5a3ef18 100644 --- a/src/prolog/machine/copier.rs +++ b/src/prolog/machine/copier.rs @@ -104,7 +104,7 @@ impl CopyTermState { fn copy_partial_string(&mut self, addr: usize, n: usize) { if let &HeapCellValue::Addr(Addr::PStrLocation(h, _)) = &self.target[addr] { if h >= self.old_h { - *self.value_at_scan() = HeapCellValue::Addr(Addr::PStrLocation(h, n)); + *self.value_at_scan() = HeapCellValue::Addr(Addr::PStrLocation(h, 0)); self.scan += 1; return; diff --git a/src/prolog/machine/stack.rs b/src/prolog/machine/stack.rs index e2602e72..4468899c 100644 --- a/src/prolog/machine/stack.rs +++ b/src/prolog/machine/stack.rs @@ -165,16 +165,19 @@ impl Stack { unsafe { let new_top = self.buf.new_block(frame_size); + let e = self.buf.top as usize - self.buf.base as usize; for idx in 0 .. num_cells { let offset = prelude_size::() + idx * mem::size_of::(); - ptr::write((self.buf.top as usize + offset) as *mut Addr, Addr::StackCell(0,0)); + ptr::write( + (self.buf.top as usize + offset) as *mut Addr, + Addr::StackCell(e, idx + 1), + ); } let and_frame = &mut *(self.buf.top as *mut AndFrame); and_frame.prelude.univ_prelude.num_cells = num_cells; - let e = self.buf.top as usize - self.buf.base as usize; self.buf.top = new_top; e @@ -186,16 +189,19 @@ impl Stack { unsafe { let new_top = self.buf.new_block(frame_size); + let b = self.buf.top as usize - self.buf.base as usize; for idx in 0 .. num_cells { let offset = prelude_size::() + idx * mem::size_of::(); - ptr::write((self.buf.top as usize + offset) as *mut Addr, Addr::StackCell(0,0)); + ptr::write( + (self.buf.top as usize + offset) as *mut Addr, + Addr::StackCell(b, idx), + ); } let or_frame = &mut *(self.buf.top as *mut OrFrame); or_frame.prelude.univ_prelude.num_cells = num_cells; - let b = self.buf.top as usize - self.buf.base as usize; self.buf.top = new_top; b -- 2.54.0