KolSPForth12 uploaded to SVN

git-svn-id: svn://kolibrios.org@4867 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
2014-04-21 19:22:58 +00:00
parent b3031965cc
commit 09488af869
91 changed files with 58885 additions and 0 deletions
+83
View File
@@ -0,0 +1,83 @@
( Структурированная обработка исключений.
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
;