Определение номера строки и имени файла perl-файла из C++

Я работаю с Perl, встроенным в наше приложение. Мы установили довольно много функций C++, которые вызываются из Perl. Одна из них — функция логирования. Я хотел бы добавить имя файла и номер строки файла Perl, вызвавшего эту функцию, в сообщение журнала.
Я знаю, что на стороне Perl я могу использовать функцию caller() для получения этой информации, но это функция уже используется в сотнях мест, поэтому я бы предпочел изменить сторону C++, передается ли эта информация функциям XSUB C++, и если да, то как я могу ее получить?

Спасибо.


person Toblakai    schedule 12.12.2011    source источник


Ответы (2)


Это должно работать:

char *file;
I32 line;

file = OutCopFILE(PL_curcop);
line = CopLINE(PL_curcop);

Операции управления (cops) — это одна из двух операций OP_NEXTSTATE и op_DBSTATE, которые (грубо говоря) являются отдельными операторами. Они содержат информацию, важную для лексического состояния и сообщений об ошибках. Во время выполнения PL_curcop указывает на последний выполненный коп, и поэтому его можно использовать для определения нашего текущего состояния.

— коп.ч

person hobbs    schedule 12.12.2011

Разве вы не можете вызвать встроенные функции Perl из XS? Признаюсь, я не знаю.

Если нет, вы всегда можете сделать что-то вроде этого:

sub logger { _real_logger(caller, @_) }

предполагая, что ваша функция называется logger (и вы переименовываете свою функцию С++ XS в _real_logger. Вы также можете сделать это, по-видимому, если вам нужно спрятаться в дереве вызовов:

sub logger {
    unshift @_, caller;
    goto &_real_logger;
}

что, конечно, является нормальной формой goto, используемой в AUTOLOAD.

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

person derobert    schedule 12.12.2011
comment
Функции устанавливаются в пространство имен, вызванное из С++, на него везде ссылаются через out::debug, хотя я не знаю, смогу ли я установить функцию perl в том же пространстве имен. Накладные расходы не будут иметь большого значения, на самом деле они нужны только для отладки. - person Toblakai; 13.12.2011