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:
@@ -453,6 +453,21 @@ fn programs() -> Vec<Program> {
|
||||
expected: "99 \n",
|
||||
category: Category::Definitions,
|
||||
},
|
||||
Program {
|
||||
name: "search-order-hides",
|
||||
code: "WORDLIST CONSTANT MY-WL\n\
|
||||
MY-WL SET-CURRENT\n\
|
||||
: SECRET 42 ;\n\
|
||||
FORTH-WORDLIST SET-CURRENT\n\
|
||||
[UNDEFINED] SECRET . CR\n\
|
||||
GET-ORDER MY-WL SWAP 1+ SET-ORDER\n\
|
||||
[DEFINED] SECRET . CR\n\
|
||||
SECRET . CR\n\
|
||||
-1 SET-ORDER\n\
|
||||
[UNDEFINED] SECRET . CR",
|
||||
expected: "-1 \n-1 \n42 \n-1 \n",
|
||||
category: Category::Definitions,
|
||||
},
|
||||
// -- Strings --
|
||||
Program {
|
||||
name: "s-quote-type",
|
||||
|
||||
Reference in New Issue
Block a user