在 perl 中,诸如__PACKAGE__, __SUB__, __FILE__,之类的特殊标记__LINE__存在并且可从脚本中获得。
__PACKAGE__我想我可能会从XSas中获得价值HvNAME( PL_currstash )。
但是如何访问其他人?
是否有特殊的界面可以访问所有这些XS?比如:CTX->package等CTX->sub。
您可以一一查找它们以toke.c获取编译时值:
__PACKAGE__=>HvNAME(PL_curstash)或PL_curstname__FILE__=> CopFILE(PL_curcop)(在编译时)__LINE__=> CopLINE(PL_curcop)(在编译时)__SUB__=>PL_compcv如果您在运行时需要它们,请查看上下文caller_cx和当前子 ( cv) 中可用的各种数据字段。没有在 parrot 或 perl6 中传递的上下文结构,而是一堆活动的上下文块。
Perl 子例程在 C 中用 type 表示CV。XSUB的参数CV在参数中传递cv:
#define XSPROTO(name) void name(pTHX_ CV* cv)
您可以使用 . 获取 XSUB 的名称GvNAME(CvGV(cv))。如果您在多个名称下注册 XSUB,例如使用ALIASorINTERFACE关键字或在类型映射中,这将特别有用。
要获得当前的存储(__PACKAGE__等效),我建议使用CvSTASH(cv).
__FILE__并由__LINE__C 编译器作为宏提供。