forked from KolibriOS/kolibrios
09488af869
git-svn-id: svn://kolibrios.org@4867 a494cfbc-eb01-0410-851d-a64ba20cac60
84 lines
2.9 KiB
Forth
84 lines
2.9 KiB
Forth
( Структурированная обработка исключений.
|
||
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
|
||
;
|