特定環境の Perl の挙動について
*注:追記あり
今日テストを走らせていて、おかしな挙動を発見したので記録します。
use strict; use Test::More tests => 4; use Class::MOP (); { package Foo; sub bar { 1 } } my $code = Foo->can('bar'); my ($pkg_name,$code_name) = Class::MOP::get_code_info($code); is $pkg_name, 'Foo'; is $code_name, 'bar'; { no strict 'refs'; delete ${'Foo::'}{'bar'}; } ($pkg_name, $code_name) = Class::MOP::get_code_info($code); is $pkg_name, '__UNKNOWN__'; is $code_name, '__ANON__'; __END__
上記のテストコードを手元の環境で試したところ、
is $pkg_name, '__UNKNOWN__';
で $pkg_name に 'Foo' が格納されて失敗する環境がありました。
手元の環境で試した限りでは以下のようになりました。
バージョン | 結果 |
---|---|
5.8.9 | ○ |
5.10.1 | ○ |
5.11.0 | × |
5.11.5 | × |
5.12.0 | × |
5.12.2 | × |
予想としては
delete ${'Foo::'}{'bar'};
の段階でPerlの内部データ(CV/GV?)が正しく更新されていないのではないかと考えています。その結果 Class::MOP::get_code_info() の実体である mop_get_code_info() 内で isGV_with_GP(CvGV(coderef)) の結果が正しく帰らない状態となっているのではないでしょうか?
これって known issue なんでしょうか?