| \ !! allow the user to add rollback actions anton |
\ !! allow the user to add rollback actions anton |
| \ !! use a separate exception stack? anton |
\ !! use a separate exception stack? anton |
| |
|
| has-locals [IF] |
has? glocals [IF] |
| : lp@ ( -- addr ) \ gforth l-p-fetch |
: lp@ ( -- addr ) \ gforth l-p-fetch |
| laddr# [ 0 , ] ; |
laddr# [ 0 , ] ; |
| [THEN] |
[THEN] |
| : catch ( x1 .. xn xt -- y1 .. ym 0 / z1 .. zn error ) \ exception |
: catch ( x1 .. xn xt -- y1 .. ym 0 / z1 .. zn error ) \ exception |
| 'catch |
'catch |
| sp@ >r |
sp@ >r |
| [ has-floats [IF] ] |
[ has? floating [IF] ] |
| fp@ >r |
fp@ >r |
| [ [THEN] ] |
[ [THEN] ] |
| [ has-locals [IF] ] |
[ has? glocals [IF] ] |
| lp@ >r |
lp@ >r |
| [ [THEN] ] |
[ [THEN] ] |
| handler @ >r |
handler @ >r |
| rp@ handler ! |
rp@ handler ! |
| execute |
execute |
| r> handler ! rdrop |
r> handler ! rdrop |
| [ has-floats [IF] ] |
[ has? floating [IF] ] |
| rdrop |
rdrop |
| [ [THEN] ] |
[ [THEN] ] |
| [ has-locals [IF] ] |
[ has? glocals [IF] ] |
| rdrop |
rdrop |
| [ [THEN] ] |
[ [THEN] ] |
| 0 ; |
0 ; |
| |
|
| : throw ( y1 .. ym error/0 -- y1 .. ym / z1 .. zn error ) \ exception |
: throw ( y1 .. ym error/0 -- y1 .. ym / z1 .. zn error ) \ exception |
| ?DUP IF |
?DUP IF |
| [ has-header [IF] here 9 cells ! [THEN] ] ] \ entry point for signal handler |
[ has? header [IF] here 9 cells ! [THEN] ] ] \ entry point for signal handler |
| [ has-interpreter [IF] ] |
[ has? interpreter [IF] ] |
| handler @ dup 0= IF |
handler @ dup 0= IF |
| [ has-os [IF] ] |
[ has? os [IF] ] |
| 2 (bye) |
2 (bye) |
| [ [ELSE] ] |
[ [ELSE] ] |
| quit |
quit |
| [ [THEN] ] |
[ [THEN] ] |
| rp! |
rp! |
| r> handler ! |
r> handler ! |
| [ has-locals [IF] ] |
[ has? glocals [IF] ] |
| r> lp! |
r> lp! |
| [ [THEN] ] |
[ [THEN] ] |
| [ has-floats [IF] ] |
[ has? floating [IF] ] |
| r> fp! |
r> fp! |
| [ [THEN] ] |
[ [THEN] ] |
| r> swap >r sp! drop r> |
r> swap >r sp! drop r> |
| ?DUP IF |
?DUP IF |
| handler @ rp! |
handler @ rp! |
| r> handler ! |
r> handler ! |
| [ has-locals [IF] ] |
[ has? glocals [IF] ] |
| r> lp! |
r> lp! |
| [ [THEN] ] |
[ [THEN] ] |
| [ has-floats [IF] ] |
[ has? floating [IF] ] |
| rdrop |
rdrop |
| [ [THEN] ] |
[ [THEN] ] |
| rdrop |
rdrop |
| |
|
| : ?stack ( ?? -- ?? ) \ gforth |
: ?stack ( ?? -- ?? ) \ gforth |
| sp@ sp0 @ u> IF -4 throw THEN |
sp@ sp0 @ u> IF -4 throw THEN |
| [ has-floats [IF] ] |
[ has? floating [IF] ] |
| fp@ fp0 @ u> IF -&45 throw THEN |
fp@ fp0 @ u> IF -&45 throw THEN |
| [ [THEN] ] |
[ [THEN] ] |
| ; |
; |