如何从 perl XS 中查找当前包名称?

How to find current package name from perl XS?

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

typedef struct context PERL_CONTEXT;

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

context 结构被定义为 cop.h 正如 @Dada 在评论中提到的:

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));