有没有办法从XS访问perl中的特殊标记?

时间:2017-03-06 15:50:45

标签: perl xs perlapi

在perl特殊令牌中,例如__PACKAGE____SUB____FILE____LINE__存在且可从脚本中获取。

我想,__PACKAGE__ XS可能会HvNAME( PL_currstash )的价值为XS。 但是如何访问他人?

是否有专门的界面可以从CTX->package访问所有这些界面?例如:CTX->sub$s = Get-SPWeb "http://homesite" if (!$s.Sites) {Write-Error "Invalid Key used!"} 等。

3 个答案:

答案 0 :(得分: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传递的上下文结构,而是一堆活动的上下文块。

答案 1 :(得分:2)

Perl子例程用C表示,类型为CV。 XSUB的CVcv参数中传递:

#define XSPROTO(name) void name(pTHX_ CV* cv)

您可以使用GvNAME(CvGV(cv))获取XSUB的名称。如果您使用多个名称注册XSUB(例如使用ALIASINTERFACE关键字或在类型地图中注册),这将非常有用。

要获取当前存储(__PACKAGE__等效),我建议使用CvSTASH(cv)

__FILE____LINE__由C编译器提供为宏。

答案 2 :(得分:2)

相当于__FILE__的C是__FILE__

相当于__LINE__的C是__LINE__

相当于__SUB__的C99是__func__。之前没有任何标准。

没有C等同于__PACKAGE__,因为C没有名称空间。

那就是说,我不认为您需要有关当前执行线的信息;我想你想了解有关XS子呼叫者的信息。这意味着您实际上要求的XS等效于caller

caller的XS等效值为caller_cx。查看Perl_cx_dump中的scope.c应该会了解如何使用返回的PERL_CONTEXT结构。