Интерпретатор создает копию объекта в трассировке

Tcl: интерпретатор создает копию отслеживаемого объекта при изменении в этом вопросе я спросил, почему интерпретатор создает копию объекта в трассировке? Я понимаю, что использование ручек — правильный путь, но это требует огромной работы, поэтому мне нужно обходное решение.

Мне нужно, чтобы код в трассировке вел себя точно так же, как если бы он был написан после команды set. Мне нужно изменить объект в след и я хочу, чтобы переводчик не делал копию объекта. Было бы здорово, если бы как-то отключили функцию копирования в функции трассировки.

Я посмотрел здесь http://www.astro.princeton.edu/~rhl/Tcl-Tk_docs/tcl/TraceVar.3.html но не нашел его.

0

Решение


Изменение 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 предполагает, что вы не собираетесь делать это так что это довольно случайно, что может сломаться. Вы могли бы даже сойти с рук с этим! Но знайте, что мы не будем официально поддерживать вас; ты сам по себе.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]