kolibrios/programs/develop/SPForth/src/spf_except.f
Kirill Lipatov (Leency) 09488af869 KolSPForth12 uploaded to SVN
git-svn-id: svn://kolibrios.org@4867 a494cfbc-eb01-0410-851d-a64ba20cac60
2014-04-21 19:22:58 +00:00

84 lines
2.9 KiB
Forth
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

( Структурированная обработка исключений.
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
;