Макросы NEXT_INST_F
и NEXT_INST_V
(в реализации механизма байт-кода Tcl) очищают состояние стека операндов и передают результат операции перед переходом к следующей инструкции.Единственное практическое различие между ними состоит в том, что один разработан так, чтобы быть высокоэффективным, когда число очищаемых мест в стеке является постоянным (из небольшого диапазона: 0, 1 и 2 - это подавляющее большинство случаев)и другой менее эффективен, но может обрабатывать различное количество мест для очистки или число за пределами небольшого диапазона.Так что NEXT_INST_F
- это в основном оптимизированная версия NEXT_INST_V
.
Место, где макросы объявляются в tclExecute.c, может сказать о них следующее:
/*
* The new macro for ending an instruction; note that a reasonable C-optimiser
* will resolve all branches at compile time. (result) is always a constant;
* the macro NEXT_INST_F handles constant (nCleanup), NEXT_INST_V is resolved
* at runtime for variable (nCleanup).
*
* ARGUMENTS:
* pcAdjustment: how much to increment pc
* nCleanup: how many objects to remove from the stack
* resultHandling: 0 indicates no object should be pushed on the stack;
* otherwise, push objResultPtr. If (result < 0), objResultPtr already
* has the correct reference count.
*
* We use the new compile-time assertions to check that nCleanup is constant
* and within range.
*/
Однако, инструкции также могут напрямую манипулировать стеком.Это сильно усложняет ситуацию. Большинство нет, но это не то же самое, что и все.Если бы вы рассматривали эту конкретную загрузку кода как одну огромную кучу особых случаев, вы бы не ошиблись.
INST_LOAD_STK
(иначе loadStk
, если вы читаете разборкунекоторый код Tcl) - это операция, которая извлекает непарсированное имя переменной из стека и выталкивает значение, считанное из переменной с этим именем.(Или будет выдано сообщение об ошибке.) Полностью ожидается, что одно значение вытолкнет и выдвинет другое (из objResultPtr
), поскольку мы выталкиваем (и уменьшаем счетчик ссылок) значения имени переменной, а также увеличиваем и увеличиваем счетчик ссылокс другим значением, которое было прочитано из переменной.
Код для чтения и записи переменных является одним из самых извращенных в механизме байт-кода.Гораздо больше goto
, чем полезно для вашего здоровья.