Почему обратный вызов не называется?
У меня есть пример сценария из модуля 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
Процедура проверки вызывается, когда узел полностью построен