| lp@ >r |
lp@ >r |
| handler @ >r |
handler @ >r |
| rp@ handler ! |
rp@ handler ! |
| backtrace-empty on |
|
| >r ; |
>r ; |
| |
|
| : try ( compilation -- orig ; run-time -- ) \ gforth |
: try ( compilation -- orig ; run-time -- ) \ gforth |
| :noname ( y1 .. ym error/0 -- y1 .. ym / z1 .. zn error ) \ exception |
:noname ( y1 .. ym error/0 -- y1 .. ym / z1 .. zn error ) \ exception |
| ?DUP IF |
?DUP IF |
| [ here forthstart 9 cells + ! ] |
[ here forthstart 9 cells + ! ] |
| store-backtrace |
store-backtrace error-stack off |
| handler @ ?dup-0=-IF |
handler @ ?dup-0=-IF |
| >stderr cr ." uncaught exception: " .error cr |
>stderr cr ." uncaught exception: " .error cr |
| 2 (bye) |
2 (bye) |
| rdrop 'throw r> perform |
rdrop 'throw r> perform |
| THEN ; |
THEN ; |
| is throw |
is throw |
| |
[IFDEF] throw>error |
| |
: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 throw>error |
| |
[THEN] |