]> Repositorios git - scryer-prolog.git/commitdiff
fix root reading of complete strings (#2882)
authorMark Thom <[email protected]>
Sun, 13 Apr 2025 00:32:11 +0000 (17:32 -0700)
committerMark Thom <[email protected]>
Wed, 23 Apr 2025 06:33:11 +0000 (23:33 -0700)
src/read.rs

index 7b476b3e792266c8ca21b669b8d7dee2ba34b05a..4c6b033cc48b1ef4644d03aed5c71d2844c83ecb 100644 (file)
@@ -345,7 +345,7 @@ impl<'a> TermWriter<'a> {
     fn push_cell(&mut self, cell: HeapCellValue) -> Result<(), CompilationError> {
         self.heap
             .push_cell(cell)
-            .map_err(|h| CompilationError::FiniteMemoryInHeap(h))
+            .map_err(CompilationError::FiniteMemoryInHeap)
     }
 
     fn term_as_addr(&mut self, term: &TermRef, h: usize) -> HeapCellValue {
@@ -435,16 +435,22 @@ impl<'a> TermWriter<'a> {
                     continue;
                 }
                 TermRef::CompleteString(lvl, _, src) => {
+                    if let Level::Root = lvl {
+                        self.push_stub_addr()?;
+                    }
+
                     let cell = self
                         .heap
                         .allocate_cstr(src)
                         .map_err(CompilationError::FiniteMemoryInHeap)?;
 
-                    let h = self.heap.cell_len();
+                    let new_h = self.heap.cell_len();
                     self.push_cell(cell)?;
 
                     if !matches!(lvl, Level::Root) {
-                        self.modify_head_of_queue(&term, h);
+                        self.modify_head_of_queue(&term, new_h);
+                    } else {
+                        self.heap[h] = cell;
                     }
 
                     continue;
@@ -462,7 +468,7 @@ impl<'a> TermWriter<'a> {
                     let tail_h = self.heap.cell_len();
                     self.push_stub_addr()?;
 
-                    if let Level::Root = lvl {
+                    if matches!(lvl, Level::Root) {
                         self.heap[h] = cell;
                     } else {
                         self.push_cell(cell)?;