为什么未调用回调



i具有B :: OPCHECK模块的示例脚本,并带有修改的PL_op_namepadsv

use B::Generate;
use B::OPCheck padsv => check => sub {
    my $op = shift;
    print "HERE";
};
my $x;
1;

但是未调用回调。

升级此程序时,我可以看到此OP

$perl -Ilib -Iblib/arch -MO=Terse ~/tmp/xs.pl
LISTOP (0x19828f0) leave [1] 
    OP (0x1c27ef0) enter 
    COP (0x1982938) nextstate 
    OP (0x1982998) padsv [1]           <<<< HERE IT IS
    COP (0x1c27f38) nextstate 
    OP (0x1c27f98) null [5] 

为什么不调用回调?

upd
看来这是答案:

对于大多数(但不是全部)OP的类型,一旦OP最初用子OP构建和填充了OPS,它将通过此数组的适当元素引用的检查功能

引用的检查功能

但是在哪里可以找到将通过检查功能过滤的操作列表?

我发现了下一件事。我应该做

wrap_op_checker(OP_PADANY, my_check, &old_checker);

而不是:

wrap_op_checker(OP_PADSV, my_check, &old_checker);

因为这种类型的op 不是创建的。在此步骤中,它是 OP_PADANYPerl_newSVREF处转换为 OP_PADSV,这是从 Perl_yyparse+0x1834中调用的。

因此,由于这种转换,我们无法钩OP_PADSV

upd
此行为与DOC

不符

当节点完全构造时,调用了检查例程

相关内容

  • 没有找到相关文章

最新更新