Fix SOURCE-ID in EVALUATE, BUFFER: alignment, S\" raw bytes

- SOURCE-ID now returns -1 during EVALUATE (saves/restores SYSVAR_SOURCE_ID)
- BUFFER: aligns HERE to cell boundary before allocating
- S\" returns Vec<u8> instead of String to preserve raw escape bytes

Core_ext: 14→6 errors. Total: 46→44.
This commit is contained in:
2026-04-08 13:04:46 +02:00
parent 87151010ed
commit 3bef345e86
+19 -4
View File
@@ -2624,8 +2624,9 @@ impl ForthVM {
.create(&name, false) .create(&name, false)
.map_err(|e| anyhow::anyhow!("{e}"))?; .map_err(|e| anyhow::anyhow!("{e}"))?;
// Allocate the buffer in WASM memory // Allocate the buffer in WASM memory (aligned to cell boundary)
self.refresh_user_here(); self.refresh_user_here();
self.user_here = (self.user_here + 3) & !3; // ALIGN
let buf_addr = self.user_here; let buf_addr = self.user_here;
self.user_here += size; self.user_here += size;
@@ -3417,13 +3418,24 @@ impl ForthVM {
let s = let s =
String::from_utf8_lossy(&data[addr as usize..addr as usize + len as usize]).to_string(); String::from_utf8_lossy(&data[addr as usize..addr as usize + len as usize]).to_string();
// Save current input state // Save current input state and SOURCE-ID
let saved_buffer = std::mem::take(&mut self.input_buffer); let saved_buffer = std::mem::take(&mut self.input_buffer);
let saved_pos = self.input_pos; let saved_pos = self.input_pos;
let data = self.memory.data(&self.store);
let saved_source_id = i32::from_le_bytes(
data[crate::memory::SYSVAR_SOURCE_ID as usize
..crate::memory::SYSVAR_SOURCE_ID as usize + 4]
.try_into()
.unwrap(),
);
// Set new input // Set new input and SOURCE-ID = -1 (string source)
self.input_buffer = s; self.input_buffer = s;
self.input_pos = 0; self.input_pos = 0;
let data = self.memory.data_mut(&mut self.store);
data[crate::memory::SYSVAR_SOURCE_ID as usize
..crate::memory::SYSVAR_SOURCE_ID as usize + 4]
.copy_from_slice(&(-1i32).to_le_bytes());
// Sync input buffer, >IN, and #TIB to WASM (for SOURCE and WORD) // Sync input buffer, >IN, and #TIB to WASM (for SOURCE and WORD)
{ {
@@ -3460,7 +3472,7 @@ impl ForthVM {
} }
} }
// Restore input state and sync back to WASM // Restore input state, SOURCE-ID, and sync back to WASM
self.input_buffer = saved_buffer; self.input_buffer = saved_buffer;
self.input_pos = saved_pos; self.input_pos = saved_pos;
{ {
@@ -3473,6 +3485,9 @@ impl ForthVM {
.copy_from_slice(&(self.input_pos as u32).to_le_bytes()); .copy_from_slice(&(self.input_pos as u32).to_le_bytes());
data[SYSVAR_NUM_TIB as usize..SYSVAR_NUM_TIB as usize + 4] data[SYSVAR_NUM_TIB as usize..SYSVAR_NUM_TIB as usize + 4]
.copy_from_slice(&(len as u32).to_le_bytes()); .copy_from_slice(&(len as u32).to_le_bytes());
data[crate::memory::SYSVAR_SOURCE_ID as usize
..crate::memory::SYSVAR_SOURCE_ID as usize + 4]
.copy_from_slice(&saved_source_id.to_le_bytes());
} }
Ok(()) Ok(())