Newly-created stashes may need effective names added
authorFather Chrysostomos <sprout@cpan.org>
Mon, 22 Nov 2010 17:25:40 +0000 (09:25 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 22 Nov 2010 17:25:40 +0000 (09:25 -0800)
gv.c
t/mro/package_aliases.t

diff --git a/gv.c b/gv.c
index 9f62066..9a72996 100644 (file)
--- a/gv.c
+++ b/gv.c
@@ -1075,7 +1075,13 @@ Perl_gv_fetchpvn_flags(pTHX_ const char *nambeg, STRLEN full_len, I32 flags,
                    stash = GvHV(gv) = newHV();
 
                if (!HvNAME_get(stash))
+               {
                    hv_name_set(stash, nambeg, name_cursor - nambeg, 0);
+                   /* If the containing stash has multiple effective
+                      names, see that this one gets them, too. */
+                   if (HvAUX(GvSTASH(gv))->xhv_name_count)
+                       mro_package_moved(stash, NULL, gv, 1);
+               }
            }
 
            if (*name_cursor == ':')
index aefca15..bf90429 100644 (file)
@@ -10,7 +10,7 @@ BEGIN {
 
 use strict;
 use warnings;
-plan(tests => 24);
+plan(tests => 27);
 
 {
     package New;
@@ -138,6 +138,8 @@ for(
 #
 # This test assigns outer:: to clone::, making clone::inner an alias to
 # outer::inner.
+#
+# Then we also run the test again, but without outer::inner
 for(
  {
    name => 'assigning a glob to a glob',
@@ -166,6 +168,23 @@ for(
   "ok 1\nok 2\n",
    {},
   "replacing nonexistent nested packages by $$_{name} updates isa caches";
+
+ # Same test but with the subpackage autovivified after the assignment
+ fresh_perl_is
+   q~
+     @left::ISA = 'outer::inner';
+     @right::ISA = 'clone::inner';
+
+    __code__;
+
+     eval q{package outer::inner};
+
+     print "ok 1", "\n" if left->isa("clone::inner");
+     print "ok 2", "\n" if right->isa("outer::inner");
+   ~ =~ s\__code__\$$_{code}\r,
+  "ok 1\nok 2\n",
+   {},
+  "Giving nonexistent packages multiple effective names by $$_{name}";
 }
 
 no warnings; # temporary; there seems to be a scoping bug, as this does not