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

0

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

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

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

Теги:
tcl
copy
trace

1 ответ

2
Лучший ответ

НЕ ДЕЛАЙТЕ ЭТО!


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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню