La sustitución de Class::ISA::self_and_super_path
es mro::get_linear_isa
. Está disponible en el propio mro
o, si desea admitir perls antiguos, a través del MRO::Compat
.
Además, @ISA
es una variable mágica.
$ 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)
Tenga en cuenta que PERL_MAGIC_isa
. Eso es lo que impulsa este mecanismo en particular.
Cada vez que se cambia, se supone que el contenido de las cachés que dependen de su valor se debe actualizar.
$ perl -E'say Foo->isa(q[Bar]) || 0; @Foo::ISA = qw(Bar Baz); say Foo->isa(q[Bar]) || 0'
0
1
Al parecer, usted ha encontrado un caso en el que la invalidación de caché no sucede. Considero esto un error. Las posibilidades son splice
, por alguna razón, no invoca la magia isa
apropiadamente. Puede intentar modificar @ISA
de forma alternativa, por ejemplo usando unshift
o una asignación, o posiblemente intente con mro::method_changed_in
, lo que invalidaría las cachés de resolución del método, que están asociadas a las diversas @ISA
s.
Si pudieras reducir este error a un caso de prueba mínimo, eso sería de gran ayuda para solucionar este error.
Actualización:
Un caso de prueba mínima resultó ser fácil:
$ perl -E'say Foo->isa(q[Bar]) || 0; splice @Foo::ISA, 0, 0, q[Bar]; say Foo->isa(q[Bar]) || 0'
0
0
Esto es causado por pp_splice
no hacer algo como mg_set((SV *)ary)
. push
, unshift
, y las asignaciones regulares lo hacen correctamente, por lo que usar uno de estos debería solucionar su problema.
Otro Actualización:
This change, que Acabo de enviar a perl, corrige el problema. Sin embargo, como el comportamiento extraño de splice
que no invoca magia ya está presente en 5.8 y 5.10, no es una regresión y, por lo tanto, no va a ser parte de 5.12.3 en unos pocos meses. 5.13.6, que se lanzará la próxima semana, y 5.14.0, próxima primavera del norte, probablemente lo tendrá.
¡Un parche para la victoria! Gracias. – Axeman
@Ether: http://rt.perl.org/rt3/Public/Bug/Display.html?id=78400 – Axeman
Gracias por el parche rafl !! – Ether