| \G backtrace. |
\G backtrace. |
| first-throw on ; |
first-throw on ; |
| |
|
| |
: (try0) ( -- aoldhandler ) |
| |
first-throw on |
| |
handler @ ; |
| |
|
| |
[undefined] (try1) [if] |
| |
: (try1) ( aoldhandler arecovery -- anewhandler ) |
| |
r> |
| |
swap >r \ recovery address |
| |
sp@ cell+ >r |
| |
fp@ >r |
| |
lp@ >r |
| |
swap >r \ old handler |
| |
rp@ swap \ new handler |
| |
>r ; |
| |
[endif] |
| |
|
| |
: (try2) |
| |
handler ! ; |
| |
|
| : (try) ( ahandler -- ) |
: (try) ( ahandler -- ) |
| first-throw on |
first-throw on |
| r> |
r> |
| rp@ handler ! |
rp@ handler ! |
| >r ; |
>r ; |
| |
|
| |
\ : try ( compilation -- orig ; run-time -- R:sys1 ) \ gforth |
| |
\ \G Start an exception-catching region. |
| |
\ POSTPONE ahead here >r >mark 1 cs-roll POSTPONE then |
| |
\ r> POSTPONE literal POSTPONE (try) ; immediate compile-only |
| |
|
| : try ( compilation -- orig ; run-time -- R:sys1 ) \ gforth |
: try ( compilation -- orig ; run-time -- R:sys1 ) \ gforth |
| \G Start an exception-catching region. |
\G Start an exception-catching region. |
| POSTPONE ahead here >r >mark 1 cs-roll POSTPONE then |
POSTPONE ahead here >r >mark 1 cs-roll POSTPONE then |
| r> POSTPONE literal POSTPONE (try) ; immediate compile-only |
POSTPONE (try0) r> POSTPONE literal POSTPONE (try1) POSTPONE (try2) |
| |
; immediate compile-only |
| |
|
| |
|
| : (endtry) ( -- ) |
: (endtry) ( -- ) |
| \ normal end of try block: restore handler, forget rest |
\ normal end of try block: restore handler, forget rest |