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 | ; |