Определение номера строки и имени файла perl из C++
Я работаю с Perl, встроенным в наше приложение. Мы установили довольно много функций C++, которые вызываются из Perl. Одним из них является функция регистрации. Я хотел бы добавить имя файла и номер строки файла Perl, вызвавшего эту функцию, в сообщение журнала.
Я знаю, что на стороне Perl я могу использовать функцию "caller()" для получения этой информации, но эта функция уже используется в сотнях мест, поэтому я бы предпочел изменить сторону C++, если эта информация передается в C++ XSUB функции и если да, то как бы я получить на это?
Благодарю.
2 ответа
Это должно работать:
char *file;
I32 line;
file = OutCopFILE(PL_curcop);
line = CopLINE(PL_curcop);
Управляющие операции (полицейские) - это одна из двух операций OP_NEXTSTATE и op_DBSTATE, которые (условно говоря) являются отдельными операторами. Они содержат информацию, важную для лексического состояния и сообщений об ошибках. Во время выполнения PL_curcop устанавливается так, чтобы указывать на самого последнего выполненного полицейского, и, таким образом, может использоваться для определения нашего текущего состояния.
- коп.ч
Разве вы не можете вызвать Perl buildins из XS? Признаюсь, я не знаю.
Если нет, вы всегда можете сделать что-то вроде этого:
sub logger { _real_logger(caller, @_) }
при условии, logger
так называется ваша функция (и вы переименовываете свою функцию C++ XS в _real_logger
, Вы также можете сделать это, по-видимому, если вам нужно спрятаться в дереве вызовов:
sub logger {
unshift @_, caller;
goto &_real_logger;
}
что, конечно, является нормальной формой goto, используемой в AUTOLOAD
,
Это, конечно, увеличит накладные расходы, но, вероятно, не имеет большого значения для функции ведения журнала.