代码之家  ›  专栏  ›  技术社区  ›  my_question

下一次安装和下一次安装中的“清理”是什么意思?

tcl
  •  0
  • my_question  · 技术社区  · 5 年前

    我正在研究TCL源代码,对tclExecute.c中的宏NEXT INST\F和NEXT INST\V感到困惑 cleanup 宏的参数。

    清理 表示从堆栈中消耗/弹出的插槽的净数量,例如,当弹出3个对象并推入1个对象时,清除为2。

    但我明白了 INST_LOAD_STK 清理 设置为1,不应该是零,因为一个对象弹出,一个对象推入?

    希望你能澄清 清理

    1 回复  |  直到 5 年前
        1
  •  0
  •   Donal Fellows    5 年前

    这个 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 对你的健康有好处。