tcl - потерянный след на элементе массива tcl :: env - PullRequest
0 голосов
/ 01 февраля 2019

Недавно я столкнулся с некоторым кодом в моем проекте, который работает с массивом env в tcl.

По сути, есть функция инициализации, которая добавляет 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 голосов
/ 01 февраля 2019

Вы должны использовать Tcl 8.5 или раньше.В этих версиях массив ::env был особенным в том смысле, что он часто разрушался и создавался заново из-за сложности отслеживания системной среды.Это была ошибка, потому что она вызывала всевозможные проблемы, особенно с upvar с элементами из ::env (в отличие от всего массива) и трассировками (которые вы наблюдали сами).

В 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.

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