This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
undef *glob should update isa(rev)
authorFather Chrysostomos <sprout@cpan.org>
Thu, 11 Nov 2010 05:57:15 +0000 (21:57 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Thu, 11 Nov 2010 12:14:56 +0000 (04:14 -0800)
pp.c
t/mro/isarev.t

diff --git a/pp.c b/pp.c
index 757048c..4ae130b 100644 (file)
--- a/pp.c
+++ b/pp.c
@@ -872,13 +872,16 @@ PP(pp_undef)
            GP *gp;
             HV *stash;
 
-            /* undef *Foo:: */
-            if((stash = GvHV((const GV *)sv)) && HvENAME_get(stash))
-                mro_isa_changed_in(stash);
             /* undef *Pkg::meth_name ... */
-            else if(GvCVu((const GV *)sv) && (stash = GvSTASH((const GV *)sv))
-                   && HvENAME_get(stash))
-                mro_method_changed_in(stash);
+            bool method_changed
+             =   GvCVu((const GV *)sv) && (stash = GvSTASH((const GV *)sv))
+             && HvENAME_get(stash);
+            /* undef *Foo:: */
+            if((stash = GvHV((const GV *)sv))) {
+                if(HvENAME_get(stash))
+                    SvREFCNT_inc_simple_void_NN(sv_2mortal((SV *)stash));
+                else stash = NULL;
+            }
 
            gp_free(MUTABLE_GV(sv));
            Newxz(gp, 1, GP);
@@ -887,6 +890,20 @@ PP(pp_undef)
            GvLINE(sv) = CopLINE(PL_curcop);
            GvEGV(sv) = MUTABLE_GV(sv);
            GvMULTI_on(sv);
+
+            if(stash)
+                mro_package_moved(NULL, stash, (const GV *)sv, NULL, 0);
+            stash = NULL;
+            /* undef *Foo::ISA */
+            if( strEQ(GvNAME((const GV *)sv), "ISA")
+             && (stash = GvSTASH((const GV *)sv))
+             && (method_changed || HvENAME(stash)) )
+                mro_isa_changed_in(stash);
+            else if(method_changed)
+                mro_method_changed_in(
+                 stash ? stash : GvSTASH((const GV *)sv)
+                );
+
            break;
        }
        /* FALL THROUGH */
index c76cf9e..05312cc 100644 (file)
@@ -10,7 +10,7 @@ BEGIN {
 
 use strict;
 use warnings;
-plan(tests => 20);
+plan(tests => 22);
 
 use mro;
 
@@ -122,3 +122,13 @@ my $A = \%A::;     # keep a ref
 i"A::B" => qw [], 'assigning to two superclasses at the same time';
 ok !foo->isa("A::B"),
  "A class must not inherit from its superclass’s former name";
+
+# undeffing globs
+@alpha::ISA = 'beta';
+$_ = \*alpha::ISA;    # hang on to the glob
+undef *alpha::ISA;
+i beta => qw [], "undeffing an ISA glob deletes isarev entries";
+@az::ISA = 'buki';
+$_ = \*az::ISA;
+undef *az::;
+i buki => qw [], "undeffing a package glob deletes isarev entries";