Почему обратный вызов не называется?

У меня есть пример сценария из модуля 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
Кажется, вот ответ:

Для большинства (но не для всех) типов операций после того, как операция была изначально построена и заполнена дочерними операциями, она будет отфильтрована через функцию проверки, на которую ссылается соответствующий элемент этого массива.

Но где найти список операций, которые будут отфильтрованы через функцию проверки?

1 ответ

Решение

Я должен узнать следующую вещь. я должен делать

wrap_op_checker(OP_PADANY, my_check, &old_checker);

Вместо:

wrap_op_checker(OP_PADSV, my_check, &old_checker);

Потому что ОП этого типа не создается. На этом этапе это OP_PADANY и превращается в OP_PADSV в Perl_newSVREF который называется где-то из Perl_yyparse+0x1834,

Так что из-за этой трансформации мы не можем зацепить OP_PADSV

UPD
Такое поведение не соответствует DOC

Процедура проверки вызывается, когда узел полностью построен

Другие вопросы по тегам