Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4867 leency 1
( Структурированная обработка исключений.
2
  Copyright [C] 1992-1999 A.Cherezov ac@forth.org
3
  Преобразование из 16-разрядного в 32-разрядный код - 1995-96гг
4
  Ревизия - сентябрь 1999
5
)
6
 
7
' NOOP ->VECT FATAL-HANDLER
8
\ если в результате сбоев повредилось исходное значение HANDLER,
9
\ установленное при входе в поток/задачу или позднее,
10
\ то выполнится этот обработчик FATAL-HANDLER
11
 
12
: (THROW)
13
\ Аналог THROW но в случае 0 последний не убирается со стека
14
\ Для оптимизатора.
15
  DUP
16
  IF
17
     DUP 109 = IF DROP EXIT THEN \ broken pipe - обычно не ошибка, а конец входного потока в CGI
18
     HANDLER @
19
     DUP
20
     IF RP!
21
        R> HANDLER !
22
        R> SWAP >R
23
        SP! DROP R>
24
     ELSE DROP FATAL-HANDLER THEN
25
  THEN
26
;
27
 
28
: THROW
29
\ Если любые биты n ненулевые, взять верхний кадр исключений со стека
30
\ исключений, включая все на стеке возвратов над этим кадром. Затем
31
\ восстановить спецификации входного потока, который использовался перед
32
\ соответствующим CATCH, и установить глубины всех стеков, определенных
33
\ в этом Стандарте, в то состояние, которое было сохранено в кадре
34
\ исключений (i - это то же число, что и i во входных аргументах
35
\ соответствующего CATCH), положить n на вершину стека данных и передать
36
\ управление в точку сразу после CATCH, которое положило этот кадр
37
\ исключений.
38
\ Если вершина стека не ноль, и на стеке исключений есть кадр
39
\ исключений, то поведение следующее:
40
\   Если n=-1, выполнить функцию ABORT (версию ABORT из слов CORE),
41
\   не выводя сообщений.
42
\   Если n=-2, выполнить функцию ABORT" (версию ABORT" из слов CORE),
43
\   выводя символы ccc, ассоциированные с ABORT", генерирующим THROW.
44
\   Иначе система может вывести на дисплей зависящее от реализации
45
\   сообщение об условии, соответствующем THROW с кодом n. Затем
46
\   система выполнит функцию ABORT (версию ABORT из CORE).
47
  ?DUP
48
  IF HANDLER @
49
     ?DUP
50
     IF RP!
51
        R> HANDLER !
52
        R> SWAP >R
53
        SP! DROP R>
54
     ELSE FATAL-HANDLER THEN
55
  THEN
56
;
57
 
58
VECT  \ установить обработчик аппаратных исключений
59
 
60
: CATCH ( i*x xt -- j*x 0 | i*x n ) \ 94 EXCEPTION
61
\ Положить на стек исключений кадр перехвата исключительных ситуаций
62
\ и выполнить токен xt (как по EXECUTE) таким образом, чтобы управление
63
\ могло быть передано в точку сразу после CATCH, если во время выполнения
64
\ xt выполняется THROW.
65
\ Если выполнение xt заканчивается нормально (т.е. кадр исключений,
66
\ положенный на стек словом CATCH не был взят выполнением THROW),
67
\ взять кадр исключений и вернуть ноль на вершину стека данных,
68
\ остальные элементы стека возвращаются xt EXECUTE. Иначе остаток
69
\ семантики выполнения дается THROW.
70
\  
71
  SP@ >R  HANDLER @ >R
72
  RP@ HANDLER !
73
  EXECUTE
74
  R> HANDLER !
75
  RDROP
76
 
77
;
78
: ABORT  \ 94 EXCEPTION EXT
79
\ Расширить сематику CORE ABORT чтобы было:
80
  ( i*x -- ) ( R: j*x -- )
81
\ Выполнить функцию -1 THROW
82
  -1 THROW
83
;