特定環境の 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 なんでしょうか?

[追記]

id:gfxからブコメ及びTwitterで情報をいただきました。id:gfx++

これはバグではなく、むしろ5.11.0でGV-CV relationのバグが修正された結果です。つまり、CVがパッケージを参照している限り「名前」が消えなくなったのです。むしろ「名前」が消えることがバグだったのです。

ということで、5.10.1 以前の挙動のほうがおかしいということでテストの方を修正しました。