tcl-在tcl :: env数组的元素上丢失的跟踪

时间:2019-02-01 13:16:33

标签: tcl

我最近在我的项目中遇到了一些代码,该代码处理tcl中的env数组。

基本上,有一个初始化函数可以在write trace中存在的元素之一上添加env。在同一用例的后续处理流程中,有一个array get ::env被调用,似乎删除了所添加的跟踪。

我试图用普通的tcl数组复制相同的用例,并且工作正常,即使对它进行了array get arrayName,我添加的跟踪仍然保留。我怀疑某些东西正在有关元素上调用unset。因此,我确实在其上放了另一个unset跟踪,并尝试在此跟踪附带的函数中打印调用堆栈。不幸的是,它没有打印出任何有用的信息。

我在这里想念什么吗?如果没有,您能帮我建议我做些什么来调试吗?总结一下,我正在编写此用例的步骤。我是tcl的新手,可以在这里提供一些帮助

#add a trace on one of the elements present in env
trace variable ::env(myVar) w myFunction

#get the contents of env 
array get ::env

#trace is lost after the second step,can check by below command
trace vinfo ::env(myVar)

1 个答案:

答案 0 :(得分:1)

您必须使用Tcl 8.5或更低版本。在那些版本中,::env数组的特殊之处在于,由于跟踪系统环境的复杂性,它会经常被破坏和重新创建。这是一个错误,因为它引起了各种各样的问题,尤其是upvar中的::env elements 的元素(而不是整个数组)和跟踪(您已经为自己观察)。

在8.6版中(至少在8.6.8版中;我确切地忘记了修正的时间),我们将其更改为假定环境不会一直在脚下改变(因为实际上实际上是这样),并且变量从那里正确地维护了trace和upvar'd变量。核心的根本变化是,环境数组的更新更加谨慎,并且其中的Tcl_Var结构与以前一样短暂。

$ tclsh8.5
% trace variable ::env(myVar) w myFunction
% array get env
# ... blah blah ...
% trace vinfo ::env(myVar)
$ tclsh8.6
% trace variable ::env(myVar) w myFunction
% array get env
# ... blah blah ...
% trace vinfo ::env(myVar)
{w myFunction}

简而言之, 通过升级到Tcl 8.6进行修复。