У меня есть proc MYPROC, который вызывается из подчиненного интерпретатора (с именем MYPRO) с использованием псевдонимов и неизвестных механизмов.Получение номера строки inviki при использовании псевдонимов
#include <tcl.h>
#include <iostream>
int main()
{
Tcl_Interp* interp0 = Tcl_CreateInterp();
Tcl_Interp* interp1 = Tcl_CreateSlave(interp0, "sl", false);
const char* script1 =
"proc MYPROC {a} { \n"
" puts [info frame] \n"
" global tcl_version \n"
" if { $tcl_version >= \"8.5\" } { \n"
" puts \"frame 0 [info frame 0]\" \n"
" puts \"frame 1 [info frame 1]\" \n"
" puts \"frame 2 [info frame 2]\" \n"
" puts \"frame 3 [info frame 3]\" \n"
" } \n"
"} \n"
"proc m_unknown {cmd args} { \n"
" ${cmd}C $args \n"
"} \n";
Tcl_Eval(interp0, script1);
Tcl_CreateAlias(interp1, "unknown", interp0, "m_unknown", NULL, NULL);
const char* script2 =
"set a 1 \n"
"set b 2 \n"
"MYPRO {""} \n";
if (Tcl_Eval(interp1, script2) == TCL_ERROR) {
Tcl_Eval(interp1, "puts $errorInfo");
Tcl_Eval(interp0, "puts $errorInfo");
}
return 0;
}
Внутри тела MyProc мне нужно получить номер строки MYPRO вызова (Ie номер строки «MYPRO {„“}» в Скрипт2, который является 3)
Вот выход этого образца
не2
frame 0 type proc line 5 cmd {info frame 0} proc ::MYPROC level 0
frame 1 type proc line -1 cmd {${cmd}C $args } proc ::m_unknown level 1
frame 2 type proc line 7 cmd {info frame 2} proc ::MYPROC level 0
bad level "3"
while executing
"info frame 3"
(procedure "MYPROC" line 8)
invoked from within
"${cmd}C $args "
(procedure "m_unknown" line 2)
invoked from within
"MYPRO {} "
bad level "3"
while executing
"info frame 3"
(procedure "MYPROC" line 8)
invoked from within
"${cmd}C $args "
(procedure "m_unknown" line 2)
Здесь нет какой-либо кадр информация о MYPRO строке вызова, так как число кадров равно 2. Кроме того, из ошибок трассировки interp1 вы можете увидеть, что ргос и строки информации отсутствует для MYPRO {} запись.
Это интересная проблема на самом деле, а не совсем тривиальная. _Контекст имеет значение; _ читатели должны знать, что используются несколько интерпретаторов, и что это сильно влияет на результаты. –