Tcl: Interpreter создает копию прослеживаемого объекта, который изменяется в этом вопросе. Я спросил, почему интерпретатор создает копию объекта в трассировке? Я понимаю, что использование ручек - правильный путь здесь, но для этого требуется огромная работа, поэтому мне нужно обходное решение.
Мне нужно, чтобы код на трассе вел себя точно так же, как если бы он был записан после команды set. Мне нужно изменить объект в трассировке, и я хочу, чтобы интерпретатор не делал копию объекта. Было бы здорово, если бы каким-то образом отключить функцию копирования в функции трассировки.
Я просмотрел здесь http://www.astro.princeton.edu/~rhl/Tcl-Tk_docs/tcl/TraceVar.3.html, но не нашел его.
Изменение самого Tcl_Obj
, когда есть несколько ссылок, открытых для него (т. Tcl_IsShared
Когда Tcl_IsShared
сообщает, что значение является общим) может вызвать всевозможные семантические проблемы (многие функции - например, Tcl_SetIntObj
- специально проверяют и 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 предполагает, что вы не собираетесь делать это, поэтому довольно случайным образом, что может сломаться. Вы даже можете уйти от этого! Но имейте в виду, что мы официально не поддержим вас; ты сам по себе.