I have the example script from B::OPCheck module with modified PL_op_name
to padsv
use B::Generate;
use B::OPCheck padsv => check => sub {
my $op = shift;
print "HERE";
};
my $x;
1;
But callback is not called.
When deparsing this program I can see this 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]
Why callback is not called?
UPD
It seems here is the answer:
For most (but not all) types of op, once the op has been initially built and populated with child ops it will be filtered through the check function referenced by the appropriate element of this array
But where to find the list of ops which will be filtered through the check function?
I have find out next thing. I should do
wrap_op_checker(OP_PADANY, my_check, &old_checker);
Instead of:
wrap_op_checker(OP_PADSV, my_check, &old_checker);
Because OP of this type is not created. At that step it is OP_PADANY
and is transformed into OP_PADSV
at Perl_newSVREF
which is called somewhere from Perl_yyparse+0x1834
.
So because of this transformation we can not hook OP_PADSV
UPD
This behavior do not correspond to the DOC
A check routine is called when the node is fully constructed