Why callback is not called?

144 views Asked by At

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?

1

There are 1 answers

0
Eugen Konkov On BEST ANSWER

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