Tcl字节码和命名空间

时间:2017-03-16 09:08:44

标签: namespaces tcl bytecode

据我所知,如果调用者的名称空间与原始名称空间不同,则Tcl字节码无效。 到现在为止还挺好。 我不完全理解的棘手问题是如何使用procs。

如果我在全局命名空间中有proc并且我从特定命名空间调用它,那么proc的字节码将在全局命名空间的特定命名空间下吗? 由于从不同的命名空间调用proc,特定命名空间的字节码是否会失效?

如果proc处于特定的,但是与调用者不同的命名空间会改变答案吗?

当我们从不同的proc调用proc时会发生什么?

当proc必须链接到来自不同命名空间的变量时,proc中的upvar 1是否有效?

非常感谢。

1 个答案:

答案 0 :(得分:0)

从另一个命名空间调用过程会使使该过程的字节码无效。当前命名空间是过程运行时过程的命名空间,并且是与调用堆栈帧的命名空间不同的命名空间。

使用rename命令将过程从一个名称空间移动到另一个名称空间 - 生产代码中的罕见操作 - 通常使字节码无效。 (问题是不同的命名空间可能会将命令名解析为不同的东西,这可能反过来意味着正确的字节码序列不同。)

TclOO方法的工作方式不同,尽管我的第一段中的事实 - 一个堆栈帧中的当前命名空间不一定是调用者堆栈帧中的当前命名空间,并且永远不会使字节码无效 - 继续适用。

如果您已经定义了调试选项compile的Tcl版本,则可以将特殊全局tcl_traceCompile设置为1以获取每次编译时打印的一些调试信息。 (您可以通过将其设置为2来获取详细信息,但tcl::unsupported::disassemble命令是很多更方便的方法。)这可以帮助您了解实际完成编译的时间; Tcl试图避免重新编译,即使它的编译器速度相当快。