有什么办法可以从TCL_interpreter中找出行号

时间:2020-04-16 09:39:05

标签: tcl

我正在尝试在c ++中实现几个Tcl指令。

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 :(得分:0)

不是特别容易获得呼叫者的电话号码(这不是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报告的信息不会通过Tcl的任何公共C API导出。您确实必须运行(小)脚本来获取它。


请注意,根据行为的源头或命名方式,使代码的行为发生显着不同,这被认为是 极端错误的样式 。这也是使您的代码极难调试和测试的一类事情。小心点!