Вперед: Организация вызовов
Вверх: Приложение Б. Псевдокод системы
Назад: Структура виртуальной машины и
  Содержание
a. push string1, string2, ..., stringn
Команда записывает в стек строки. Сначала в стек записывается string1,
потом string2 и т.д. Т.е. string1 оказывается глубже всех остальных
строк в стеке.
b. concat
Команда склеивает две строки, находящиеся на стеке (более глубокая
строка становится началом новой строки, верхняя -- концом).
c. getcgi
Имя CGI-переменной, лежащее на стеке, заменяется ее значением. Если
переменной нет, возвращается пустая строка.
d. setcgi
На стеке лежит имя переменной и ее значение. Операция присваивает
переменной это значение.
e. getslot
Имя слота, лежащее на стеке, заменяется его значением. Если такого
слота нет, на стек кладется пустая строка.
f. setslot
На стеке лежит имя слота и его значение. Операция присваивает слоту
это значение.
g. call n, m
Вызов модуля. При этом на стеке (от верха стека вниз):
- m пар вида (имя слота, значение).
- n значений упорядоченных аргументов
- имя вызываемого модуля
Если значение слота равно undef, в модуль передается значение слота
текущего модуля.
Если у call указан только один аргумент, m=0, если ни одного аргумента
- и n, и m равны 0.
Модуль обязан положить на стек некоторое значение. Если
значение отсутствует, на стек кладется пустая строка.
h. callm n, m, ...метки..
Вызов модуля без вычисления аргументов. При этом стек содержит (от
верха стека вниз):
- m имен слотов
- имя вызываемого модуля
Затем в коде идут участки кода, которые вычисляют тот или иной
параметр. В вызове callm передается таблица смещений конца участков
кода, ответственных за вычисление аргументов.
К моменту вычисления аргументов со стека уже сняты имена слотов и имя
вызываемого модуля. Код, вычисляющий аргумент, должен оставить на
вершине стека вычисленное значение.
Пример:
push "<FORM>"
...
push "if", L1, L2, L3
push "user_id"
getcgi
L1: push "save_button"
call
L2: push "user_is_not_registered"
call
L3: ...
push "</FORM">
Код рисует HTML-форму. Если установлена CGI-переменная user_id , код
рисует кнопку "Save" через модуль "save_button" иначе возвращается
значение "user_is_not_registered" .
i. redirect
Команда останавливает формирование HTML-страницы и производит redirect
на URL, который лежит на стеке.
Примечание:
Команды getslot/setslot, getcgi/setcgi являются простыми сокращениями
вызовов соответствующих методов класса Library. Возможно, что будут
введены и другие сокращения.
|