如何从perl XS中找到当前的包名?

时间:2017-03-01 12:18:21

标签: perl perlapi

要获取当前上下文,我在perlapi中找到caller_cx函数。但是没有结构描述。在perl源代码perl.h中,我只能找到typedef

typedef struct context PERL_CONTEXT;

是否有示例如何使用caller_cx返回的此结构来从XS中查找当前包?

1 个答案:

答案 0 :(得分:5)

@Dada在评论中提到了context结构cop.h

struct context {
    union {
    struct block    cx_blk;
    struct subst    cx_subst;
    } cx_u;
};

block结构也在cop.h中定义。

通过检查pp_ctl.c中的Perl caller函数的C实现(第1850行),我认为您可以使用以下代码获取包名称:

const PERL_CONTEXT *cx = caller_cx(0, NULL);
char *pack_name = HvNAME((HV*)CopSTASH(cx->blk_oldcop));