MOVE: do not crash when u is 0 (#126)

This commit adds ?DUP IF guards to MOVE and MOVE- that make them exit
when u is 0. Without these guards a DO loop was executed 65535 times
instead of 0.

In particular, this fixes a crash when "105 LOAD I " is executed
immediately after boot. Block editor word "I" passes IBUF length (0)
to MOVE- and MOVE in this case, causing a crash.
This commit is contained in:
link2xt 2020-06-21 13:49:45 +03:00 committed by GitHub
parent 99c05fff3c
commit d83d12899b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 4 additions and 4 deletions

View File

@ -1,15 +1,15 @@
: MOVE ( a1 a2 u -- ) : MOVE ( a1 a2 u -- )
( u ) 0 DO ( a1 a2 ) ?DUP IF ( u ) 0 DO ( a1 a2 )
SWAP C@+ ( a2 a1+1 x ) SWAP C@+ ( a2 a1+1 x )
ROT C!+ ( a1+1 a2+1 ) ROT C!+ ( a1+1 a2+1 )
LOOP 2DROP ; LOOP THEN 2DROP ;
: MOVE- ( a1 a2 u -- ) : MOVE- ( a1 a2 u -- )
TUCK + 1- ( a1 u a2+u-1 ) ?DUP IF TUCK + 1- ( a1 u a2+u-1 )
ROT 2 PICK + 1- ( u a2+u-1 a1+u-1 ) ROT 2 PICK + 1- ( u a2+u-1 a1+u-1 )
ROT ( u ) 0 DO ( a2 a1 ) ROT ( u ) 0 DO ( a2 a1 )
C@- ( a2 a1-1 x ) C@- ( a2 a1-1 x )
ROT C!- ( a1-1 a2-1 ) SWAP ( a2 a1 ) ROT C!- ( a1-1 a2-1 ) SWAP ( a2 a1 )
LOOP 2DROP ; LOOP THEN 2DROP ;
: MOVE, ( a u -- ) H@ OVER ALLOT SWAP MOVE ; : MOVE, ( a u -- ) H@ OVER ALLOT SWAP MOVE ;
: PREV 3 - DUP @ - ; : PREV 3 - DUP @ - ;

Binary file not shown.