这个
NEXT_INST_F
NEXT_INST_V
宏(在Tcl字节码引擎的实现中)清除操作数堆栈的状态,并将操作结果推送到下一条指令。两者之间唯一的实际区别是,当要清理的堆栈位置的数量是一个常量时(从一个很小的范围:0、1和2,这是绝大多数情况下),其中一个设计为高效,另一种效率较低,但可以处理数量可变的要清理的位置或小范围之外的数量。所以呢
下一次安装
.
在tcleexecute.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
对你的健康有好处。