Есть ли способ получить доступ к специальным токенам в 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 как макрос.

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