]> Repositorios git - scryer-prolog.git/commitdiff
correct partial string copying by resetting threshold to redirected partial string...
authorMark Thom <[email protected]>
Mon, 13 Apr 2020 05:33:07 +0000 (23:33 -0600)
committerMark Thom <[email protected]>
Mon, 13 Apr 2020 05:33:07 +0000 (23:33 -0600)
src/prolog/machine/copier.rs
src/prolog/machine/stack.rs

index baa1f2b92abe8fe75a2c8ceb4f551d94f28dc2fe..c5a3ef180faedf55e92ce924cf134e987ae6c127 100644 (file)
@@ -104,7 +104,7 @@ impl<T: CopierTarget> CopyTermState<T> {
     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;
index e2602e721d808ff9e1e50fa16174a03a857c349b..4468899c00d9318b481ebcb514c0cccf55e28cde 100644 (file)
@@ -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::<AndFramePrelude>() + idx * mem::size_of::<Addr>();
-                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::<OrFramePrelude>() + idx * mem::size_of::<Addr>();
-                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