| |
|
| \ !! use a separate exception stack? anton |
\ !! use a separate exception stack? anton |
| |
|
| \ user-definable rollback actions |
|
| |
|
| Defer 'catch |
|
| Defer 'throw |
|
| |
|
| ' noop IS 'catch |
|
| ' noop IS 'throw |
|
| |
|
| \ has? backtrace [IF] |
\ has? backtrace [IF] |
| Defer store-backtrace |
Defer store-backtrace |
| ' noop IS store-backtrace |
' noop IS store-backtrace |
| first-throw on |
first-throw on |
| r> |
r> |
| swap >r \ recovery address |
swap >r \ recovery address |
| rp@ 'catch >r |
|
| sp@ >r |
sp@ >r |
| fp@ >r |
fp@ >r |
| lp@ >r |
lp@ >r |
| rdrop \ lp |
rdrop \ lp |
| rdrop \ fp |
rdrop \ fp |
| rdrop \ sp |
rdrop \ sp |
| r> rp! |
|
| rdrop \ recovery address |
rdrop \ recovery address |
| >r ; |
>r ; |
| |
|
| : recover ( compilation orig1 -- orig2 ; run-time -- ) \ gforth |
: recover ( compilation orig1 -- orig2 ; run-time -- ) \ gforth |
| \ !! check using a special tag |
\ !! check using a special tag |
| POSTPONE (recover) |
|
| POSTPONE else |
POSTPONE else |
| docol: here 0 , 0 , code-address! \ start a colon def |
docol: here 0 , 0 , code-address! \ start a colon def |
| postpone rdrop \ drop the return address |
postpone rdrop \ drop the return address |
| ; immediate compile-only |
; immediate compile-only |
| |
|
| : endtry ( compilation orig -- ; run-time -- ) \ gforth |
: endtry ( compilation orig -- ; run-time -- ) \ gforth |
| POSTPONE then ; immediate compile-only |
POSTPONE then |
| |
POSTPONE (recover) |
| |
; immediate compile-only |
| |
|
| :noname ( x1 .. xn xt -- y1 .. ym 0 / z1 .. zn error ) \ exception |
:noname ( x1 .. xn xt -- y1 .. ym 0 / z1 .. zn error ) \ exception |
| try |
try |
| 2 (bye) |
2 (bye) |
| \ quit |
\ quit |
| THEN |
THEN |
| rp! |
dup rp! |
| r> handler ! |
rdrop |
| r> lp! |
r> lp! |
| r> fp! |
r> fp! |
| r> swap >r sp! drop r> |
r> -rot 2>r sp! drop 2r> |
| rdrop 'throw r> perform |
r@ swap rp! perform |
| THEN ; |
THEN ; |
| is throw |
is throw |
| [IFDEF] rethrow |
|
| :noname ( y1 .. ym error/0 -- y1 .. ym / z1 .. zn error ) \ exception |
|
| ?DUP IF |
|
| handler @ ?dup-0=-IF |
|
| >stderr cr ." uncaught exception: " .error cr |
|
| 2 (bye) |
|
| \ quit |
|
| THEN |
|
| rp! |
|
| r> handler ! |
|
| r> lp! |
|
| r> fp! |
|
| r> swap >r sp! drop r> |
|
| rdrop 'throw r> perform |
|
| THEN ; |
|
| is rethrow |
|
| [THEN] |
|