Определение номера строки и имени файла 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,

Это, конечно, увеличит накладные расходы, но, вероятно, не имеет большого значения для функции ведения журнала.

Другие вопросы по тегам