This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
mro.(c|xs): Make warnings utf8-clean
authorBrian Fraser <fraserbn@gmail.com>
Thu, 7 Jul 2011 07:35:35 +0000 (04:35 -0300)
committerFather Chrysostomos <sprout@cpan.org>
Thu, 6 Oct 2011 20:01:15 +0000 (13:01 -0700)
ext/mro/mro.xs
mro.c
t/mro/next_skip_utf8.t

index 618260e..1f099cb 100644 (file)
@@ -45,8 +45,8 @@ S_mro_get_linear_isa_c3(pTHX_ HV* stash, U32 level)
       Perl_croak(aTHX_ "Can't linearize anonymous symbol table");
 
     if (level > 100)
-        Perl_croak(aTHX_ "Recursive inheritance detected in package '%s'",
-                  HEK_KEY(stashhek));
+        Perl_croak(aTHX_ "Recursive inheritance detected in package '%"SVf"'",
+                  SVfARG(sv_2mortal(newSVhek(stashhek))));
 
     meta = HvMROMETA(stash);
 
@@ -253,8 +253,10 @@ S_mro_get_linear_isa_c3(pTHX_ HV* stash, U32 level)
                 SV *errmsg;
                 I32 i;
 
-                errmsg = newSVpvf("Inconsistent hierarchy during C3 merge of class '%s':\n\t"
-                                  "current merge results [\n", HEK_KEY(stashhek));
+                errmsg = newSVpvf(
+                            "Inconsistent hierarchy during C3 merge of class '%"SVf"':\n\t"
+                            "current merge results [\n",
+                                            SVfARG(sv_2mortal(newSVhek(stashhek))));
                 for (i = 0; i <= av_len(retval); i++) {
                     SV **elem = av_fetch(retval, i, 0);
                     sv_catpvf(errmsg, "\t\t%"SVf",\n", SVfARG(*elem));
@@ -585,7 +587,10 @@ mro__nextcan(...)
            SV* const val = HeVAL(cache_entry);
            if(val == &PL_sv_undef) {
                if(throw_nomethod)
-                   Perl_croak(aTHX_ "No next::method '%s' found for %s", subname, hvname);
+                   Perl_croak(aTHX_ "No next::method '%"SVf"' found for %"SVf,
+                        SVfARG(newSVpvn_flags(subname, subname_len,
+                                SVs_TEMP | ( subname_utf8 ? SVf_UTF8 : 0 ) )),
+                        SVfARG(sv_2mortal(newSVhek( HvNAME_HEK(selfstash) ))));
                 XSRETURN_EMPTY;
            }
            mXPUSHs(newRV_inc(val));
@@ -629,8 +634,9 @@ mro__nextcan(...)
 
             if (!curstash) {
                 if (ckWARN(WARN_SYNTAX))
-                    Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Can't locate package %"SVf" for @%s::ISA",
-                        (void*)linear_sv, hvname);
+                    Perl_warner(aTHX_ packWARN(WARN_SYNTAX), "Can't locate package %"SVf" for @%"SVf"::ISA",
+                        (void*)linear_sv,
+                        SVfARG(sv_2mortal(newSVhek( HvNAME_HEK(selfstash) ))));
                 continue;
             }
 
@@ -661,7 +667,10 @@ mro__nextcan(...)
 
     (void)hv_store_ent(nmcache, sv, &PL_sv_undef, 0);
     if(throw_nomethod)
-        Perl_croak(aTHX_ "No next::method '%s' found for %s", subname, hvname);
+        Perl_croak(aTHX_ "No next::method '%"SVf"' found for %"SVf,
+                         SVfARG(newSVpvn_flags(subname, subname_len,
+                                SVs_TEMP | ( subname_utf8 ? SVf_UTF8 : 0 ) )),
+                        SVfARG(sv_2mortal(newSVhek( HvNAME_HEK(selfstash) ))));
     XSRETURN_EMPTY;
 
 BOOT:
diff --git a/mro.c b/mro.c
index c7f7538..d22b3ca 100644 (file)
--- a/mro.c
+++ b/mro.c
@@ -224,8 +224,8 @@ S_mro_get_linear_isa_dfs(pTHX_ HV *stash, U32 level)
       Perl_croak(aTHX_ "Can't linearize anonymous symbol table");
 
     if (level > 100)
-        Perl_croak(aTHX_ "Recursive inheritance detected in package '%s'",
-                  HEK_KEY(stashhek));
+        Perl_croak(aTHX_ "Recursive inheritance detected in package '%"SVf"'",
+                  SVfARG(sv_2mortal(newSVhek(stashhek))));
 
     meta = HvMROMETA(stash);
 
index 9dd4659..64e7745 100644 (file)
@@ -68,11 +68,8 @@ is(Diᚪၚd_D->ᕘ, 'Diᚪၚd_D::ᕘ => Diᚪၚd_C::ᕘ', '... skipped
 is(Diᚪၚd_D->ᴮaȐ, 'Diᚪၚd_D::ᴮaȐ => Diᚪၚd_A::ᴮaȐ', '... skipped B & C and went to A correctly');
 is(Diᚪၚd_D->바ź, 'Diᚪၚd_B::바ź => Diᚪၚd_A::바ź', '... called B method, skipped C and went to A correctly');
 is(Diᚪၚd_D->buƵ, 'Diᚪၚd_D::buƵ => Diᚪၚd_B::바ź => Diᚪၚd_A::바ź', '... called D method dispatched to , different method correctly');
-TODO: {
-    local our $TODO = "Warnings aren't clean yet";
-    eval { Diᚪၚd_D->fuz };
-    like($@, qr/^No next::method 'fuz' found for Diᚪၚd_D/u, '... cannot re-dispatch to a method which is not there');
-}
+eval { Diᚪၚd_D->fuz };
+like($@, qr/^No next::method 'fuz' found for Diᚪၚd_D/u, '... cannot re-dispatch to a method which is not there');
 is(Diᚪၚd_D->woz, 'Diᚪၚd_D::woz can => 1', '... can re-dispatch figured out correctly');
 is(Diᚪၚd_D->noz, 'Diᚪၚd_D::noz can => 0', '... cannot re-dispatch figured out correctly');