Revert "[perl #80098] Bleadperl breaks Attribute::Lexical"
authorFather Chrysostomos <sprout@cpan.org>
Mon, 3 Jan 2011 07:00:53 +0000 (23:00 -0800)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 3 Jan 2011 07:48:23 +0000 (23:48 -0800)
This reverts commit 1726bc11330f7a943b1e12c6dd5fa5454b90abd6.

ext/mro/mro.xs
t/mro/next_edgecases.t

index acccdd5..63befa9 100644 (file)
@@ -482,7 +482,7 @@ mro__nextcan(...)
     const char *hvname;
     I32 entries;
     struct mro_meta* selfmeta;
-    bool searching_univ = FALSE;
+    bool seen_univ = FALSE;
     HV* nmcache;
     I32 i;
   PPCODE:
@@ -633,7 +633,9 @@ mro__nextcan(...)
 
             assert(curstash);
 
-           if (searching_univ && curstash == selfstash) break;
+           if (!seen_univ && SvCUR(linear_sv) == 9
+            && strnEQ(SvPV_nolen_const(linear_sv), "UNIVERSAL", 9))
+               seen_univ = TRUE;
 
             gvp = (GV**)hv_fetch(curstash, subname, subname_len, 0);
             if (!gvp) continue;
@@ -656,15 +658,12 @@ mro__nextcan(...)
         }
     }
 
-    if (!searching_univ) {
-      HV * const unistash = gv_stashpvn("UNIVERSAL", 9, 0);
-      if (unistash) {
-       linear_av = S_mro_get_linear_isa_c3(aTHX_ unistash, 0);
+    if (!seen_univ && (selfstash = gv_stashpvn("UNIVERSAL", 9, 0))) {
+       linear_av = S_mro_get_linear_isa_c3(aTHX_ selfstash, 0);
        linear_svp = AvARRAY(linear_av);
        entries = AvFILLp(linear_av) + 1;
-       searching_univ = TRUE;
+       seen_univ = TRUE;
        goto retry;
-      }
     }
 
     (void)hv_store_ent(nmcache, sv, &PL_sv_undef, 0);
index 3840a4b..e77ce7b 100644 (file)
@@ -5,7 +5,7 @@ use warnings;
 
 BEGIN { chdir 't'; require q(./test.pl); @INC = qw "../lib lib" }
 
-plan(tests => 17);
+plan(tests => 14);
 
 {
 
@@ -94,15 +94,13 @@ plan(tests => 17);
 
 }
 
-# Test next::method/can with UNIVERSAL methods
+# Test next::method with UNIVERSAL methods
 {
     package UNIVERSAL;
     sub foo { "foo" }
-    sub kan { shift->next::can }
     our @ISA = "a";
     package a;
     sub bar { "bar" }
-    sub baz { shift->next::can }
     package M;
     sub foo { shift->next::method }
     sub bar { shift->next::method }
@@ -110,14 +108,4 @@ plan(tests => 17);
 
     is eval { M->foo }, "foo", 'next::method with implicit UNIVERSAL';
     is eval { M->bar }, "bar", 'n::m w/superclass of implicit UNIVERSAL';
-
-    is baz a, undef,
-     'univ superclasses next::cannot their own methods';
-    is kan UNIVERSAL, undef,
-     'UNIVERSAL next::cannot its own methods';
-
-    @a::ISA = 'b';
-    sub b::cnadd { shift->next::can }
-    is baz b, \&a::baz,
-      'univ supersuperclass noxt::can method in its immediate subclasses';
 }