Fixup decompile DO LOOP.

This commit is contained in:
Brad Nelson
2022-07-30 17:01:48 -07:00
parent f0a1d54b35
commit a32fce7334
4 changed files with 23 additions and 19 deletions

View File

@ -61,20 +61,20 @@ variable leaving
: leaving( leaving @ 0 leaving ! 2 nest-depth +! ; : leaving( leaving @ 0 leaving ! 2 nest-depth +! ;
: )leaving leaving @ swap leaving ! -2 nest-depth +! : )leaving leaving @ swap leaving ! -2 nest-depth +!
begin dup while dup @ swap here swap ! repeat drop ; begin dup while dup @ swap here swap ! repeat drop ;
: (do) ( n n -- .. ) swap r> -rot >r >r >r ; : DO ( n n -- .. ) swap r> -rot >r >r >r ;
: do ( lim s -- ) leaving( postpone (do) here ; immediate : do ( lim s -- ) leaving( postpone DO here ; immediate
: (?do) ( n n -- n n f .. ) : ?DO ( n n -- n n f .. )
2dup = if 2drop r> @ >r else swap r> cell+ -rot >r >r >r then ; 2dup = if 2drop r> @ >r else swap r> cell+ -rot >r >r >r then ;
: ?do ( lim s -- ) leaving( postpone (?do) leaving, here ; immediate : ?do ( lim s -- ) leaving( postpone ?DO leaving, here ; immediate
: unloop r> rdrop rdrop >r ; : UNLOOP r> rdrop rdrop >r ;
: (leave) r> rdrop rdrop @ >r ; : LEAVE r> rdrop rdrop @ >r ;
: leave postpone (leave) leaving, ; immediate : leave postpone LEAVE leaving, ; immediate
: (+loop) ( n -- ) dup 0< swap r> r> rot + dup r@ < -rot >r >r xor 0= : +LOOP ( n -- ) dup 0< swap r> r> rot + dup r@ < -rot >r >r xor 0=
if r> cell+ rdrop rdrop >r else r> @ >r then ; if r> cell+ rdrop rdrop >r else r> @ >r then ;
: +loop ( n -- ) postpone (+loop) , )leaving ; immediate : +loop ( n -- ) postpone +LOOP , )leaving ; immediate
: (loop) r> r> 1+ dup r@ < -rot >r >r 0= : LOOP r> r> 1+ dup r@ < -rot >r >r 0=
if r> cell+ rdrop rdrop >r else r> @ >r then ; if r> cell+ rdrop rdrop >r else r> @ >r then ;
: loop postpone (loop) , )leaving ; immediate : loop postpone LOOP , )leaving ; immediate
create I ' r@ @ ' i ! ( i is same as r@ ) create I ' r@ @ ' i ! ( i is same as r@ )
: J ( -- n ) rp@ 3 cells - @ ; : J ( -- n ) rp@ 3 cells - @ ;
: K ( -- n ) rp@ 5 cells - @ ; : K ( -- n ) rp@ 5 cells - @ ;

View File

@ -103,7 +103,7 @@ e: check-boot
out: loop out: loop
out: +loop out: +loop
out: leave out: leave
out: unloop out: UNLOOP
out: ?do out: ?do
out: do out: do
out: next out: next

View File

@ -34,6 +34,7 @@ internals definitions
16 constant NONAMED 16 constant NONAMED
32 constant +TAB 32 constant +TAB
64 constant -TAB 64 constant -TAB
128 constant ARGS_MARK
: mem= ( a a n -- f) : mem= ( a a n -- f)
for aft 2dup c@ swap c@ <> if 2drop rdrop 0 exit then 1+ swap 1+ then next 2drop -1 ; for aft 2dup c@ swap c@ <> if 2drop rdrop 0 exit then 1+ swap 1+ then next 2drop -1 ;
forth definitions also internals forth definitions also internals
@ -60,6 +61,11 @@ internals internalized definitions
+TAB flags'or! AFT +TAB flags'or! AFT
+TAB flags'or! FOR +TAB flags'or! FOR
-TAB flags'or! NEXT -TAB flags'or! NEXT
+TAB flags'or! DO
ARGS_MARK +TAB or flags'or! ?DO
ARGS_MARK -TAB or flags'or! +LOOP
ARGS_MARK -TAB or flags'or! LOOP
ARGS_MARK flags'or! LEAVE
forth definitions forth definitions
@ -90,10 +96,7 @@ variable indent
dup @ ['] BRANCH @ = dup @ ['] BRANCH @ =
over @ ['] 0BRANCH @ = or over @ ['] 0BRANCH @ = or
over @ ['] DONEXT @ = or over @ ['] DONEXT @ = or
over ['] (?do) = or over >flags ARGS_MARK and or
over ['] (+loop) = or
over ['] (loop) = or
over ['] (leave) = or
if swap cell+ swap then if swap cell+ swap then
drop drop
; ;

View File

@ -57,7 +57,6 @@ transfer{
immediate? input-buffer ?echo ?arrow. arrow immediate? input-buffer ?echo ?arrow. arrow
evaluate-buffer aliteral value-bind evaluate-buffer aliteral value-bind
leaving( )leaving leaving leaving, leaving( )leaving leaving leaving,
(do) (?do) (+loop) (loop) (leave)
parse-quote digit $@ raw.s parse-quote digit $@ raw.s
tib-setup input-limit tib-setup input-limit
[SKIP] [SKIP]' raw-ok boot-prompt free. [SKIP] [SKIP]' raw-ok boot-prompt free.
@ -71,6 +70,8 @@ cleave begin cleave again cleave until
cleave ahead cleave then cleave if cleave ahead cleave then cleave if
cleave else cleave while cleave repeat cleave else cleave while cleave repeat
cleave aft cleave for cleave next cleave aft cleave for cleave next
cleave do cleave ?do cleave +loop
cleave loop cleave leave
forth definitions forth definitions