fix read_s logic around HeapPtr::PStrLoc (#2894)

This commit is contained in:
Mark Thom
2025-04-19 23:51:26 -07:00
committed by Mark Thom
parent 4644ea2404
commit 995a39419a

View File

@@ -345,8 +345,8 @@ impl MachineState {
pub(crate) fn read_s(&mut self) -> HeapCellValue {
match self.s {
HeapPtr::HeapCell(h) => self.deref(self.heap[h + self.s_offset]),
HeapPtr::PStr(h) => {
let mut char_iter = self.heap.char_iter(h);
HeapPtr::PStr(byte_index) => {
let mut char_iter = self.heap.char_iter(byte_index);
if self.s_offset == 0 {
// read the car of the list
@@ -354,10 +354,9 @@ impl MachineState {
char_as_cell!(c)
} else {
// read the (self.s_offset)^{th} cdr of the list
let byte_offset: usize =
char_iter.take(self.s_offset).map(|c| c.len_utf8()).sum();
let new_h = h + byte_offset;
// self.s_offset is the number of bytes offset into the PStr
// in this context, *not* the number of heap cells.
let new_h = byte_index + self.s_offset;
self.s_offset = 0;
if self.heap.char_iter(new_h).next().is_some() {