Определение номера строки и имени файла perl из C ++ - PullRequest
4 голосов
/ 13 декабря 2011

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

Спасибо.

Ответы [ 2 ]

2 голосов
/ 13 декабря 2011

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

char *file;
I32 line;

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

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

- cop.h

1 голос
/ 13 декабря 2011

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

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

sub logger { _real_logger(caller, @_) }

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

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

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

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

...