fix(core): search order is authoritative; host words validate stack args
- Dictionary::find no longer falls back to the newest entry across all wordlists when the search order has no match (Forth 2012 16.3.3; gforth and SwiftForth agree). Cross-engine corpus program guards it. - ~40 argument-taking host words (RND-SEED, ACCEPT, RESIZE, ALLOCATE, SEARCH, SUBSTITUTE, ROLL, M*, UM/MOD, SF@/SF!/DF@/DF!, F./FE./FS./F~, 2R@, ...) popped or read stack cells with no underflow check; on an empty stack the pointer silently drifted past its base. New host_need/ host_fneed/host_fpop checked helpers; class-wide regression test drives every word on an empty stack.
This commit is contained in:
@@ -192,10 +192,9 @@ impl Dictionary {
|
||||
}
|
||||
}
|
||||
}
|
||||
// Fallback: return newest entry across all wordlists
|
||||
if let Some(&(_wid, word_addr, fn_index, is_immediate)) = entries.last() {
|
||||
return Some((word_addr, WordId(fn_index), is_immediate));
|
||||
}
|
||||
// In no wordlist of the search order: not findable
|
||||
// (Forth 2012 §16.3.3 — the order is authoritative).
|
||||
return None;
|
||||
}
|
||||
|
||||
// Fallback: linked-list walk (for words not yet in the index)
|
||||
|
||||
Reference in New Issue
Block a user