2017-02-25 17 views
4

私は修正PL_op_name なぜコールバックが呼び出されないのですか?

padsvから
use B::Generate; 

use B::OPCheck padsv => check => sub { 
    my $op = shift; 
    print "HERE"; 
}; 

my $x; 
1; 

B::OPCheckモジュールからサンプルスクリプトを持っていますが、コールバックが呼び出されません。

このプログラムをデパースとき、私はこの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] 

と呼ばれていないのはなぜか? opが最初に構築され、子OPSが移入された後、それが通過OPのほとんど(すべてではない)タイプの

フィルタリングされます:hereが答えているようだ

UPD
この配列の適切な要素によって参照されるチェック関数

しかし、チェック機能でフィルタリングされるopsのリストはどこにありますか?

答えて

2

私は次のことを見つけました。このタイプのOPはに作成されていないので

wrap_op_checker(OP_PADSV, my_check, &old_checker); 

:私は

wrap_op_checker(OP_PADANY, my_check, &old_checker); 

代わりのを行う必要があります。そのステップでは、OP_PADANYであり、からOP_PADSVPerl_newSVREFに変換されます。これはPerl_yyparse+0x1834のどこかで呼び出されます。

だから、この変換の我々はフックすることはできませんのでOP_PADSV

UPD
ノードが完全に

を構築する際に DOC

チェックルーチンが呼び出されに対応していないこの行動

関連する問題