Есть ли способ получить доступ к специальным токенам в Perl из XS?
В Perl специальные токены вроде __PACKAGE__
, __SUB__
, __FILE__
, __LINE__
существует и доступен из скрипта.
Я могу получить значение __PACKAGE__
от XS
как HvNAME( PL_currstash )
, Я полагаю.
Но как получить доступ к другим?
Есть ли специальный интерфейс для доступа ко всем из них? XS
? Подобно: CTX->package
, CTX->sub
и т.п.
3 ответа
Вы можете посмотреть их один за другим в toke.c
для значений времени компиляции:
__PACKAGE__
=>HvNAME(PL_curstash)
или жеPL_curstname
__FILE__
=>CopFILE(PL_curcop)
(во время компиляции)__LINE__
=>CopLINE(PL_curcop)
(во время компиляции)__SUB__
=>PL_compcv
Если они вам нужны во время выполнения, посмотрите на различные поля данных, доступные в контексте caller_cx
и текущий саб (cv
). Там нет структуры контекста, как в parrot или perl6, скорее, стек активных блоков контекста.
С эквивалентно __FILE__
является __FILE__
,
С эквивалентно __LINE__
является __LINE__
,
С99 эквивалентно __SUB__
является __func__
, Там не было ничего стандартного раньше.
Там нет C эквивалентно __PACKAGE__
потому что у C нет пространств имен.
Тем не менее, я не думаю, что вы хотите получить информацию о текущей строке исполнения; Я думаю, что вы хотите получить информацию о вызывающем абоненте XS. Это означает, что вы на самом деле просите эквивалент XS caller
,
XS эквивалент caller
является caller_cx
, Смотря на Perl_cx_dump
в scope.c
должен дать представление о том, как использовать возвращаемый PERL_CONTEXT
состав.
Подпрограммы Perl представлены в C с типом CV
, CV
для XSUB передается в cv
аргумент:
#define XSPROTO(name) void name(pTHX_ CV* cv)
Вы можете получить имя XSUB с GvNAME(CvGV(cv))
, Это особенно полезно, если вы регистрируете XSUB под несколькими именами, например, с помощью ALIAS
или же INTERFACE
ключевые слова, или в раскладках.
Чтобы получить текущий тайник (__PACKAGE__
эквивалент), я бы предложил использовать CvSTASH(cv)
,
__FILE__
а также __LINE__
предоставляются компилятором C как макрос.