Что означает «очистка» в NEXT_INST_F и NEXT_INST_V? - PullRequest
0 голосов
/ 12 февраля 2019

Я вспахиваю исходный код TCL и запутался в макросах NEXT_INST_F и NEXT_INST_V в tclExecute.c.В частности, параметр cleanup макроса.

Первоначально я думал, что cleanup означает чистое количество слотов, потребляемых / извлекаемых из стека, например, когда 3 объекта выталкиваются и 1 объект выдвигается, очистка выполняется2.

Но я вижу INST_LOAD_STK имеет cleanup, установленное в 1, не должно ли оно быть нулевым, так как один объект выталкивается, а 1 объект выдвигается?

Я потерянчитая код NEXT_INST_F и NEXT_INST_V, слишком много прыжков.

Надеюсь, вы сможете уточнить для меня семантику cleanup.

1 Ответ

0 голосов
/ 13 февраля 2019

Макросы 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, чем полезно для вашего здоровья.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...