Tcl: интерпретатор создает копию отслеживаемого объекта при изменении в этом вопросе я спросил, почему интерпретатор создает копию объекта в трассировке? Я понимаю, что использование ручек — правильный путь, но это требует огромной работы, поэтому мне нужно обходное решение.
Мне нужно, чтобы код в трассировке вел себя точно так же, как если бы он был написан после команды set. Мне нужно изменить объект в след и я хочу, чтобы переводчик не делал копию объекта. Было бы здорово, если бы как-то отключили функцию копирования в функции трассировки.
Я посмотрел здесь http://www.astro.princeton.edu/~rhl/Tcl-Tk_docs/tcl/TraceVar.3.html но не нашел его.
Изменение Tcl_Obj
сам, когда есть несколько открытых ссылок на него (т.е. когда Tcl_IsShared
сообщает, что значение является общим) может вызывать всевозможные семантические проблемы (многие функции, например, Tcl_SetIntObj
— специально проверьте и прервет процесс, если вы попробуете), поэтому вы должны быть исключительно осторожны. Вы выходите за пределы семантики Tcl; Здесь есть драконы!
Чтобы напрямую изменить Tcl_Obj
посмотрите на bytes
поле структуры ( length
поле должно быть сохранено как strlen
из bytes
). Это доступно для записи; просто измените его, учитывая, что он всегда кодируется как псевдо-UTF-8 (что очень просто для символов ASCII, кроме \u0000
). Если вы хотите изменить то, что выделено, это поле должен выделяться Tcl_Alloc
, Если bytes
является NULL
нет строкового представления; посмотрите на внутреннее представление для значения.
Внутреннее представление Tcl_Obj
определяется internalRep
союз и typePtr
поле. Понимание значения internalRep
зависит от понимания того, что typePtr
указывает на; обычно, если вы не реализовали это, вы не должны вообще возиться. Мы делать изменить, какие внутренние представления иногда присутствуют в выпусках патча. Если вы определили typePtr
чтобы указать на структуру, которой вы владеете, вы будете знать, как понимать внутреннее представление. Когда typePtr
поле NULL
, нет внутреннего представления.
Иногда вы можете столкнуться с Tcl_Obj
без внутреннего или строкового представления. НЕ ИЗМЕНИТЕ ЭТО, если найдете. Он зарезервирован для (очень распространенного) пустого значения.
Хотя технически возможно изменить общий объект, ковыряясь внутри, остальная часть Tcl предполагает, что вы не собираетесь делать это так что это довольно случайно, что может сломаться. Вы могли бы даже сойти с рук с этим! Но знайте, что мы не будем официально поддерживать вас; ты сам по себе.
Других решений пока нет …