[OpenBIOS] [PATCH 2/3] interpreter.fs: don't clobber stack across evaluate strings split on newlines
Segher Boessenkool
segher at kernel.crashing.org
Sun Jul 17 18:39:10 CEST 2016
On Sun, Jul 17, 2016 at 03:20:58PM +0100, Mark Cave-Ayland wrote:
> When an evaluate string is split across a newline, the current string
> position is assumed to be the top-most item on the stack. However
> in the case of yaboot, items are left on the stack to be used by a
> subsequent line within the same evaluate statement and so subsequent
> lines are parsed incorrectly.
Nice catch! These things are hard to debug.
> --- a/forth/bootstrap/interpreter.fs
> +++ b/forth/bootstrap/interpreter.fs
> @@ -165,7 +165,9 @@ defer outer-interpreter
> over + over do
> i c@ 0a = if
> i over -
> + rot >r
> (evaluate)
> + r>
> i 1+
> then
> loop
This becomes hard to read. So you have (inside the "if"):
( a b ) i over -
( a b i-b ) rot >r
( b i-b R: a ) (evaluate)
( R: a ) r>
( a )
swap >r dup i swap - (evaluate) r>
but that is even longer. Wow. Long definitions are bad, mkay? ;-)
It might be better without the DO loop (it blocks the R stack). Probably
it is best to break out a natural factor (like, find the length of a string
until the first line break -- isn't there a word like it already, like
"left-split" but splitting on any line break char instead of on one delim).
Segher
More information about the OpenBIOS
mailing list