( óÔÒÕËÔÕÒÉÒÏ×ÁÎÎÁÑ ÏÂÒÁÂÏÔËÁ ÉÓËÌÀÞÅÎÉÊ.
Copyright [C] 1992-1999 A.Cherezov ac@forth.org
ðÒÅÏÂÒÁÚÏ×ÁÎÉÅ ÉÚ 16-ÒÁÚÒÑÄÎÏÇÏ × 32-ÒÁÚÒÑÄÎÙÊ ËÏÄ - 1995-96ÇÇ
òÅ×ÉÚÉÑ - ÓÅÎÔÑÂÒØ 1999
)
' NOOP ->VECT FATAL-HANDLER
\ ÅÓÌÉ × ÒÅÚÕÌØÔÁÔÅ ÓÂÏÅ× ÐÏ×ÒÅÄÉÌÏÓØ ÉÓÈÏÄÎÏÅ ÚÎÁÞÅÎÉÅ HANDLER,
\ ÕÓÔÁÎÏ×ÌÅÎÎÏÅ ÐÒÉ ×ÈÏÄÅ × ÐÏÔÏË/ÚÁÄÁÞÕ ÉÌÉ ÐÏÚÄÎÅÅ,
\ ÔÏ ×ÙÐÏÌÎÉÔÓÑ ÜÔÏÔ ÏÂÒÁÂÏÔÞÉË FATAL-HANDLER
: (THROW)
\ áÎÁÌÏÇ THROW ÎÏ × ÓÌÕÞÁÅ 0 ÐÏÓÌÅÄÎÉÊ ÎÅ ÕÂÉÒÁÅÔÓÑ ÓÏ ÓÔÅËÁ
\ äÌÑ ÏÐÔÉÍÉÚÁÔÏÒÁ.
DUP
IF
DUP 109 = IF DROP EXIT THEN \ broken pipe - ÏÂÙÞÎÏ ÎÅ ÏÛÉÂËÁ, Á ËÏÎÅà ×ÈÏÄÎÏÇÏ ÐÏÔÏËÁ × CGI
HANDLER @
DUP
IF RP!
R> HANDLER !
R> SWAP >R
SP! DROP R>
ELSE DROP FATAL-HANDLER THEN
THEN
;
: THROW
\ åÓÌÉ ÌÀÂÙÅ ÂÉÔÙ n ÎÅÎÕÌÅ×ÙÅ, ×ÚÑÔØ ×ÅÒÈÎÉÊ ËÁÄÒ ÉÓËÌÀÞÅÎÉÊ ÓÏ ÓÔÅËÁ
\ ÉÓËÌÀÞÅÎÉÊ, ×ËÌÀÞÁÑ ×ÓÅ ÎÁ ÓÔÅËÅ ×ÏÚ×ÒÁÔÏ× ÎÁÄ ÜÔÉÍ ËÁÄÒÏÍ. úÁÔÅÍ
\ ×ÏÓÓÔÁÎÏ×ÉÔØ ÓÐÅÃÉÆÉËÁÃÉÉ ×ÈÏÄÎÏÇÏ ÐÏÔÏËÁ, ËÏÔÏÒÙÊ ÉÓÐÏÌØÚÏ×ÁÌÓÑ ÐÅÒÅÄ
\ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÉÍ CATCH, É ÕÓÔÁÎÏ×ÉÔØ ÇÌÕÂÉÎÙ ×ÓÅÈ ÓÔÅËÏ×, ÏÐÒÅÄÅÌÅÎÎÙÈ
\ × ÜÔÏÍ óÔÁÎÄÁÒÔÅ, × ÔÏ ÓÏÓÔÏÑÎÉÅ, ËÏÔÏÒÏÅ ÂÙÌÏ ÓÏÈÒÁÎÅÎÏ × ËÁÄÒÅ
\ ÉÓËÌÀÞÅÎÉÊ (i - ÜÔÏ ÔÏ ÖÅ ÞÉÓÌÏ, ÞÔÏ É i ×Ï ×ÈÏÄÎÙÈ ÁÒÇÕÍÅÎÔÁÈ
\ ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÇÏ CATCH), ÐÏÌÏÖÉÔØ n ÎÁ ×ÅÒÛÉÎÕ ÓÔÅËÁ ÄÁÎÎÙÈ É ÐÅÒÅÄÁÔØ
\ ÕÐÒÁ×ÌÅÎÉÅ × ÔÏÞËÕ ÓÒÁÚÕ ÐÏÓÌÅ CATCH, ËÏÔÏÒÏÅ ÐÏÌÏÖÉÌÏ ÜÔÏÔ ËÁÄÒ
\ ÉÓËÌÀÞÅÎÉÊ.
\ åÓÌÉ ×ÅÒÛÉÎÁ ÓÔÅËÁ ÎÅ ÎÏÌØ, É ÎÁ ÓÔÅËÅ ÉÓËÌÀÞÅÎÉÊ ÅÓÔØ ËÁÄÒ
\ ÉÓËÌÀÞÅÎÉÊ, ÔÏ ÐÏ×ÅÄÅÎÉÅ ÓÌÅÄÕÀÝÅÅ:
\ åÓÌÉ n=-1, ×ÙÐÏÌÎÉÔØ ÆÕÎËÃÉÀ ABORT (×ÅÒÓÉÀ ABORT ÉÚ ÓÌÏ× CORE),
\ ÎÅ ×Ù×ÏÄÑ ÓÏÏÂÝÅÎÉÊ.
\ åÓÌÉ n=-2, ×ÙÐÏÌÎÉÔØ ÆÕÎËÃÉÀ ABORT" (×ÅÒÓÉÀ ABORT" ÉÚ ÓÌÏ× CORE),
\ ×Ù×ÏÄÑ ÓÉÍ×ÏÌÙ ccc, ÁÓÓÏÃÉÉÒÏ×ÁÎÎÙÅ Ó ABORT", ÇÅÎÅÒÉÒÕÀÝÉÍ THROW.
\ éÎÁÞÅ ÓÉÓÔÅÍÁ ÍÏÖÅÔ ×Ù×ÅÓÔÉ ÎÁ ÄÉÓÐÌÅÊ ÚÁ×ÉÓÑÝÅÅ ÏÔ ÒÅÁÌÉÚÁÃÉÉ
\ ÓÏÏÂÝÅÎÉÅ Ï ÕÓÌÏ×ÉÉ, ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÅÍ THROW Ó ËÏÄÏÍ n. úÁÔÅÍ
\ ÓÉÓÔÅÍÁ ×ÙÐÏÌÎÉÔ ÆÕÎËÃÉÀ ABORT (×ÅÒÓÉÀ ABORT ÉÚ CORE).
?DUP
IF HANDLER @
?DUP
IF RP!
R> HANDLER !
R> SWAP >R
SP! DROP R>
ELSE FATAL-HANDLER THEN
THEN
;
VECT <SET-EXC-HANDLER> \ ÕÓÔÁÎÏ×ÉÔØ ÏÂÒÁÂÏÔÞÉË ÁÐÐÁÒÁÔÎÙÈ ÉÓËÌÀÞÅÎÉÊ
: CATCH ( i*x xt -- j*x 0 | i*x n ) \ 94 EXCEPTION
\ ðÏÌÏÖÉÔØ ÎÁ ÓÔÅË ÉÓËÌÀÞÅÎÉÊ ËÁÄÒ ÐÅÒÅÈ×ÁÔÁ ÉÓËÌÀÞÉÔÅÌØÎÙÈ ÓÉÔÕÁÃÉÊ
\ É ×ÙÐÏÌÎÉÔØ ÔÏËÅÎ xt (ËÁË ÐÏ EXECUTE) ÔÁËÉÍ ÏÂÒÁÚÏÍ, ÞÔÏÂÙ ÕÐÒÁ×ÌÅÎÉÅ
\ ÍÏÇÌÏ ÂÙÔØ ÐÅÒÅÄÁÎÏ × ÔÏÞËÕ ÓÒÁÚÕ ÐÏÓÌÅ CATCH, ÅÓÌÉ ×Ï ×ÒÅÍÑ ×ÙÐÏÌÎÅÎÉÑ
\ xt ×ÙÐÏÌÎÑÅÔÓÑ THROW.
\ åÓÌÉ ×ÙÐÏÌÎÅÎÉÅ xt ÚÁËÁÎÞÉ×ÁÅÔÓÑ ÎÏÒÍÁÌØÎÏ (Ô.Å. ËÁÄÒ ÉÓËÌÀÞÅÎÉÊ,
\ ÐÏÌÏÖÅÎÎÙÊ ÎÁ ÓÔÅË ÓÌÏ×ÏÍ CATCH ÎÅ ÂÙÌ ×ÚÑÔ ×ÙÐÏÌÎÅÎÉÅÍ THROW),
\ ×ÚÑÔØ ËÁÄÒ ÉÓËÌÀÞÅÎÉÊ É ×ÅÒÎÕÔØ ÎÏÌØ ÎÁ ×ÅÒÛÉÎÕ ÓÔÅËÁ ÄÁÎÎÙÈ,
\ ÏÓÔÁÌØÎÙÅ ÜÌÅÍÅÎÔÙ ÓÔÅËÁ ×ÏÚ×ÒÁÝÁÀÔÓÑ xt EXECUTE. éÎÁÞÅ ÏÓÔÁÔÏË
\ ÓÅÍÁÎÔÉËÉ ×ÙÐÏÌÎÅÎÉÑ ÄÁÅÔÓÑ THROW.
\ <SET-EXC-HANDLER>
SP@ >R HANDLER @ >R
RP@ HANDLER !
EXECUTE
R> HANDLER !
RDROP
0
;
: ABORT \ 94 EXCEPTION EXT
\ òÁÓÛÉÒÉÔØ ÓÅÍÁÔÉËÕ CORE ABORT ÞÔÏÂÙ ÂÙÌÏ:
( i*x -- ) ( R: j*x -- )
\ ÷ÙÐÏÌÎÉÔØ ÆÕÎËÃÉÀ -1 THROW
-1 THROW
;