Need to free the isa lookup hash before rebuilding it.
Nicholas Clark [Fri, 12 Sep 2008 08:52:50 +0000 (08:52 +0000)]
p4raw-id: //depot/perl@34355

mro.c
t/op/universal.t

diff --git a/mro.c b/mro.c
index da30c4d..4d7ade5 100644 (file)
--- a/mro.c
+++ b/mro.c
@@ -546,6 +546,10 @@ Perl_mro_isa_changed_in(pTHX_ HV* stash)
     SvREFCNT_dec((SV*)meta->mro_linear_c3);
     meta->mro_linear_dfs = NULL;
     meta->mro_linear_c3 = NULL;
+    if (meta->isa) {
+       SvREFCNT_dec(meta->isa);
+       meta->isa = NULL;
+    }
 
     /* Inc the package generation, since our @ISA changed */
     meta->pkg_gen++;
index 83916ee..f1c0323 100755 (executable)
@@ -10,7 +10,7 @@ BEGIN {
     require "./test.pl";
 }
 
-plan tests => 112;
+plan tests => 116;
 
 $a = {};
 bless $a, "Bob";
@@ -234,3 +234,14 @@ like( $@, qr/Can't call method "DOES" on unblessed reference/,
 # http://www.xray.mpe.mpg.de/mailing-lists/perl5-porters/2001-05/msg01710.html
 # but never actually tested.
 is(UNIVERSAL->can("NoSuchPackage::foo"), undef);
+
+@splatt::ISA = 'zlopp';
+ok (splatt->isa('zlopp'));
+ok (!splatt->isa('plop'));
+
+# This should reset the ->isa lookup cache
+@splatt::ISA = 'plop';
+# And here is the new truth.
+ok (!splatt->isa('zlopp'));
+ok (splatt->isa('plop'));
+