--- gforth/except.fs 2007/02/23 14:50:02 1.19 +++ gforth/except.fs 2010/09/01 16:52:12 1.23 @@ -1,12 +1,12 @@ \ catch, throw, etc. -\ Copyright (C) 1999,2000,2003,2006 Free Software Foundation, Inc. +\ Copyright (C) 1999,2000,2003,2006,2007 Free Software Foundation, Inc. \ This file is part of Gforth. \ Gforth is free software; you can redistribute it and/or \ modify it under the terms of the GNU General Public License -\ as published by the Free Software Foundation; either version 2 +\ as published by the Free Software Foundation, either version 3 \ of the License, or (at your option) any later version. \ This program is distributed in the hope that it will be useful, @@ -15,8 +15,7 @@ \ GNU General Public License for more details. \ You should have received a copy of the GNU General Public License -\ along with this program; if not, write to the Free Software -\ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA. +\ along with this program. If not, see http://www.gnu.org/licenses/. \ !! use a separate exception stack? anton @@ -76,6 +75,25 @@ Variable first-throw \G backtrace. 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 -- ) first-throw on r> @@ -87,10 +105,17 @@ Variable first-throw rp@ handler ! >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 \G Start an exception-catching region. 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) ( -- ) \ normal end of try block: restore handler, forget rest @@ -143,6 +168,15 @@ Variable first-throw then endtry ; is catch +[undefined] (throw1) +: (throw1) ( ... ball frame -- ... ball ) + dup rp! ( ... ball frame ) + cell+ dup @ lp! + cell+ dup @ fp! + cell+ dup @ ( ... ball addr sp ) -rot 2>r sp! drop 2r> + cell+ @ perform ; +[endif] + :noname ( y1 .. ym error/0 -- y1 .. ym / z1 .. zn error ) \ exception ?DUP IF [ here forthstart 9 cells + ! ] @@ -155,10 +189,7 @@ is catch 2 (bye) \ quit THEN - dup rp! ( ... ball frame ) - cell+ dup @ lp! - cell+ dup @ fp! - cell+ dup @ ( ... ball addr sp ) -rot 2>r sp! drop 2r> - cell+ @ perform + \ cr .s dup 64 dump + (throw1) THEN ; is throw