の置き換えはClass::ISA::self_and_super_path
ですmro::get_linear_isa
。これは、mro
それ自体から、または古い perl をサポートしたい場合は、MRO::Compat
.
また、@ISA
マジック変数です。
$ perl -MDevel::Peek -e'Dump \@ISA'
SV = IV(0x1b92e20) at 0x1b92e28
REFCNT = 1
FLAGS = (TEMP,ROK)
RV = 0x1bbcd58
SV = PVAV(0x1b93cf8) at 0x1bbcd58
REFCNT = 2
FLAGS = (SMG,RMG)
MAGIC = 0x1bc0f68
MG_VIRTUAL = &PL_vtbl_isa
MG_TYPE = PERL_MAGIC_isa(I)
MG_OBJ = 0x1bbcd40
ARRAY = 0x0
FILL = -1
MAX = -1
ARYLEN = 0x0
FLAGS = (REAL)
に注意してくださいPERL_MAGIC_isa
。それが、この特定のメカニズムを駆動するものです。
変更されるたびに、その値に依存するすべてのキャッシュの内容が更新されることになっています。
$ perl -E'say Foo->isa(q[Bar]) || 0; @Foo::ISA = qw(Bar Baz); say Foo->isa(q[Bar]) || 0'
0
1
どうやら、キャッシュの無効化が発生しないケースが見つかりました。これはバグだと思います。何らかの理由で、魔法が適切splice
に呼び出されない可能性があります。isa
別の方法で変更@ISA
を試みることもできます。たとえばunshift
、または代入を使用するか、おそらく trymro::method_changed_in
を使用すると、さまざまな にバインドされているメソッド解決キャッシュが無効になり@ISA
ます。
このバグを最小限のテストケースに減らすことができれば、このバグを修正するのに非常に役立ちます。
アップデート:
最小限のテストケースは簡単であることが判明しました。
$ perl -E'say Foo->isa(q[Bar]) || 0; splice @Foo::ISA, 0, 0, q[Bar]; say Foo->isa(q[Bar]) || 0'
0
0
pp_splice
のようなことをしていないことが原因mg_set((SV *)ary)
です。push
、unshift
、および通常の割り当てはそれを正しく行うため、これらのいずれかを使用すると問題が解決するはずです。
別の更新:
perl にコミットしたばかりのこの変更により、問題が修正されます。ただし、splice
魔法を呼び出さないという奇妙な動作は 5.8 と 5.10 に既に存在するため、これは回帰ではなく、したがって数か月以内に 5.12.3 の一部にはなりません。来週リリースされる 5.13.6 と、次の北部の春にリリースされる 5.14.0 には、おそらくそれが含まれるでしょう。