--- gforth/kernel/cond.fs 2002/09/24 17:57:29 1.13 +++ gforth/kernel/cond.fs 2004/12/31 13:24:04 1.19 @@ -1,6 +1,6 @@ \ Structural Conditionals 12dec92py -\ Copyright (C) 1995,1996,1997,2000 Free Software Foundation, Inc. +\ Copyright (C) 1995,1996,1997,2000,2003,2004 Free Software Foundation, Inc. \ This file is part of Gforth. @@ -105,10 +105,13 @@ variable backedge-locals \ Structural Conditionals 12dec92py +defer other-control-flow ( -- ) +\ hook for control-flow stuff that's not handled by begin-like etc. + : ?struc ( flag -- ) abort" unstructured " ; : sys? ( sys -- ) dup 0= ?struc ; : >mark ( -- orig ) - cs-push-orig 0 , ; + cs-push-orig 0 , other-control-flow ; : >resolve ( addr -- ) here swap ! basic-block-end ; @@ -122,18 +125,18 @@ variable backedge-locals \ Structural Conditionals 12dec92py : AHEAD ( compilation -- orig ; run-time -- ) \ tools-ext - POSTPONE abranch >mark POSTPONE unreachable ; immediate restrict + POSTPONE branch >mark POSTPONE unreachable ; immediate restrict : IF ( compilation -- orig ; run-time f -- ) \ core - POSTPONE a?branch >mark ; immediate restrict + POSTPONE ?branch >mark ; immediate restrict : ?DUP-IF ( compilation -- orig ; run-time n -- n| ) \ gforth question-dupe-if \G This is the preferred alternative to the idiom "@code{?DUP IF}", since it can be \G better handled by tools like stack checkers. Besides, it's faster. - POSTPONE a?dup-?branch >mark ; immediate restrict + POSTPONE ?dup-?branch >mark ; immediate restrict : ?DUP-0=-IF ( compilation -- orig ; run-time n -- n| ) \ gforth question-dupe-zero-equals-if - POSTPONE a?dup-0=-?branch >mark ; immediate restrict + POSTPONE ?dup-0=-?branch >mark ; immediate restrict Defer then-like ( orig -- ) : cs>addr ( orig/dest -- ) drop >resolve drop ; @@ -164,7 +167,7 @@ Defer again-like ( dest -- addr ) ' nip IS again-like : AGAIN ( compilation dest -- ; run-time -- ) \ core-ext - dest? again-like POSTPONE abranch