i具有B :: OPCHECK模块的示例脚本,并带有修改的PL_op_name
到padsv
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_PADANY
和在 Perl_newSVREF
处转换为 OP_PADSV
,这是从 Perl_yyparse+0x1834
中调用的。
因此,由于这种转换,我们无法钩OP_PADSV
upd
此行为与DOC
当节点完全构造时,调用了检查例程