Есть ли способ узнать номер строки из TCL_interpreter - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь реализовать пару команд Tcl в c ++.

static __tcl_command_t __tcl_command_list[] = {
    {"reset_clock_declaration", 0 ,ZBCU::resetClockDeclaration, 0, "reset clock declaration"},
    {"clock_declaration",       0, ZBCU::recognizeNotClocks,    0, "populate clock declarations"}
};

auto a_command = &__tcl_command_list[index];
Tcl_CreateCommand(interp, a_command->command_name, a_command->command_func,
        (ClientData) this, (Tcl_CmdDeleteProc *) nullptr);

// ...

static int
recognizeNotClocks(ClientData clientData, Tcl_Interp *interp, int argc, const char **argv)
{
    // ...
}

Внутри функции recognizeNotClocks() Я хочу знать, какой номер строки обрабатывается. Как мне этого добиться?

1 Ответ

0 голосов
/ 17 апреля 2020

Номер строки звонящего не особенно легко получить (это не информация, которую Tcl действительно много раскрывает), но вы можете попробовать (предполагая, что Tcl достаточно недавно; без info frame вы застряли):

int line = -1; // A dummy value
if (Tcl_Eval(interp, "dict get [info frame -1] line") == TCL_OK)
    // The nullptr below because we're ignoring errors
    (void) Tcl_GetIntFromObj(nullptr, Tcl_GetObjResult(interp), &line);
// if line is at least 1, you've got a valid line number.

Возможно, вам потребуется изменить значение, переданное на info frame (-1 означает «вызывающий», но я не уверен, как с этим взаимодействует вызов через уровень C / C ++).

Обратите внимание, что вы также можете выполнять извлечение словаря в коде C; это может означать, что вы можете подобрать другие полезные отображения, такие как file и, возможно, proc. Они там не гарантированы (ключ proc присутствует только для процедур, а условия, когда присутствует ключ file, очень сложно охарактеризовать, за исключением того, что он почти всегда присутствует для исходного кода), но они очень помогают при отладке.

Обратите внимание, что информация, сообщаемая info frame, не экспортируется через какой-либо публичный c C API Tcl. Вам действительно нужно запустить (крошечный) скрипт, чтобы получить его.


Имейте в виду, что он считается ЧРЕЗВЫЧАЙНО ПЛОХОЙ СТИЛЬ , чтобы ваш код изменился значительно в поведении в зависимости от того, откуда он вызывается или как он называется. Это также может сделать ваш код чрезвычайно сложным для отладки и тестирования. Имейте большую заботу!

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