10

在 perl 中,诸如__PACKAGE__, __SUB__, __FILE__,之类的特殊标记__LINE__存在并且可从脚本中获得。

__PACKAGE__我想我可能会从XSas中获得价值HvNAME( PL_currstash )
但是如何访问其他人?

是否有特殊的界面可以访问所有这些XS?比如:CTX->packageCTX->sub

4

3 回答 3

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 中传递的上下文结构,而是一堆活动的上下文块。

于 2017-08-16T15:54:10.630 回答
2

C 等价于__FILE____FILE__

C 等价于__LINE____LINE__

C99 等价于__SUB__. __func__以前没有什么标准。

没有 C 等价物,__PACKAGE__因为 C 没有名称空间。

也就是说,我认为您不需要有关当前执行线的信息。我认为您需要有关 XS 潜艇呼叫者的信息。这意味着您实际上是在要求 XS 等效于caller.

XS等价于caller. caller_cx查看Perl_cx_dumpinscope.c应该可以了解如何使用返回的PERL_CONTEXT结构。

于 2017-08-06T23:12:30.273 回答
2

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 编译器作为宏提供。

于 2017-08-06T19:32:09.830 回答