Class::ISA::self_and_super_path
için yedek mro::get_linear_isa
olduğunu. Bu, mro
'un kendisinden ya da MRO::Compat
aracılığıyla eski perileri desteklemek istiyorsanız kullanılabilir.
Ayrıca @ISA
sihirli bir değişkendir.
$ 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)
Not PERL_MAGIC_isa
. Bu belirli mekanizmayı harekete geçiren şey budur.
o değiştiğinde
, değeri güvenmek herhangi önbelleklere içeriği güncellenmesi gerekiyor.
$ perl -E'say Foo->isa(q[Bar]) || 0; @Foo::ISA = qw(Bar Baz); say Foo->isa(q[Bar]) || 0'
0
1
Görünüşe göre, önbellek geçersiz kılma gerçekleşmediği bir durum buldunuz. Bunu bir hata olarak görüyorum. Şanslar splice
, nedense isa
büyüsünü uygun şekilde çağırmıyor. Sen unshift
kullanarak örneğin ya bir görev için, alternatif bir yolla @ISA
değiştirmeye çalışın, ya da muhtemelen çeşitli @ISA
s bağlanmıştır yöntem çözünürlüğü önbelleklerini, geçersiz olur mro::method_changed_in
, deneyebilirsiniz. Eğer minimal testcase için bu hatayı azaltmak olsaydı
, bu sabit bu hata almakla derece yararlı olurdu.
Güncelleme:
bir asgari testcase kolay olduğu ortaya çıktı:
$ perl -E'say Foo->isa(q[Bar]) || 0; splice @Foo::ISA, 0, 0, q[Bar]; say Foo->isa(q[Bar]) || 0'
0
0
Bu mg_set((SV *)ary)
gibi bir şey yapmıyor pp_splice
kaynaklanır. push
, unshift
ve düzenli ödevler bunu doğru yapar, bu yüzden bunlardan birini kullanarak sorunu düzeltmeniz gerekir.
Başka Güncelleme:
This change, sadece Perl programının kararlı, sorunu giderir. Ancak, splice
'un sihri çağırmamanın tuhaf davranışı, 5.8 ve 5.10'da zaten mevcut olduğundan, bu bir gerileme değildir ve bu nedenle birkaç ay içinde 5.12.3'ün bir parçası olmayacaktır. Önümüzdeki hafta piyasaya sürülecek 5.13.6 ve önümüzdeki ilkbaharda 5.14.0 muhtemelen buna sahip olacak.
Kazanmak için bir yama! Teşekkürler. – Axeman
@Ether: http://rt.perl.org/rt3/Public/Bug/Display.html?id=78400 – Axeman
Yama rafı için teşekkürler! – Ether