为什么不调用回调?

时间:2017-02-25 11:57:17

标签: perl perlapi

我有来自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
似乎here就是答案:

  

对于大多数(但不是全部)类型的op,一旦op最初构建并使用子操作填充,它将通过此​​数组的相应元素引用的检查函数进行过滤

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

1 个答案:

答案 0 :(得分:2)

我已经找到了下一件事。我应该做

wrap_op_checker(OP_PADANY, my_check, &old_checker);

而不是:

wrap_op_checker(OP_PADSV, my_check, &old_checker);

因为未创建此类型的OP 。在该步骤,OP_PADANY转换为OP_PADSV的{​​{1}},Perl_newSVREF位于Perl_yyparse+0x1834的某处。

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

<强> UPD
此行为与DOC

不对应
  

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