我有来自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
似乎here就是答案:
对于大多数(但不是全部)类型的op,一旦op最初构建并使用子操作填充,它将通过此数组的相应元素引用的检查函数进行过滤
但是在哪里可以找到将通过检查功能过滤的操作列表?
答案 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
当节点完全构造时调用检查例程