Re: [PATCH] perlfaq6.pod -- case-aware s///
[p5sagit/p5-mst-13.2.git] / sv.c
diff --git a/sv.c b/sv.c
index 7b53a43..4fa39e9 100644 (file)
--- a/sv.c
+++ b/sv.c
@@ -2306,7 +2306,10 @@ Perl_sv_2nv(pTHX_ register SV *sv)
     }
     else if (SvTYPE(sv) < SVt_PVNV)
        sv_upgrade(sv, SVt_PVNV);
-    if (SvIOKp(sv) &&
+    if (SvNOKp(sv) && !(SvIOK(sv) || SvPOK(sv))) {
+       SvNOK_on(sv);
+    }
+    else if (SvIOKp(sv) &&
            (!SvPOKp(sv) || !strchr(SvPVX(sv),'.') || !looks_like_number(sv)))
     {
        SvNVX(sv) = SvIsUV(sv) ? (NV)SvUVX(sv) : (NV)SvIVX(sv);
@@ -2643,7 +2646,7 @@ uiv_2buf(char *buf, IV iv, UV uv, int is_uv, char **peob)
 char *
 Perl_sv_2pv(pTHX_ register SV *sv, STRLEN *lp)
 {
-    sv_2pv_flags(sv, lp, SV_GMAGIC);
+    return sv_2pv_flags(sv, lp, SV_GMAGIC);
 }
 
 char *
@@ -2972,7 +2975,7 @@ if all the bytes have hibit clear.
 STRLEN
 Perl_sv_utf8_upgrade(pTHX_ register SV *sv)
 {
-    sv_utf8_upgrade_flags(sv, SV_GMAGIC);
+    return sv_utf8_upgrade_flags(sv, SV_GMAGIC);
 }
 
 /*
@@ -6253,7 +6256,7 @@ Get a sensible string out of the SV somehow.
 char *
 Perl_sv_pvn_force(pTHX_ SV *sv, STRLEN *lp)
 {
-    sv_pvn_force_flags(sv, lp, SV_GMAGIC);
+    return sv_pvn_force_flags(sv, lp, SV_GMAGIC);
 }
 
 /*
@@ -8082,9 +8085,9 @@ Perl_sv_dup(pTHX_ SV *sstr)
        break;
     case SVt_RV:
        SvANY(dstr)     = new_XRV();
-       SvRV(dstr)      = SvWEAKREF(SvRV(sstr))
-                       ? sv_dup_inc(SvRV(sstr))
-                       : sv_dup(SvRV(sstr));
+       SvRV(dstr)      = SvRV(sstr) && SvWEAKREF(SvRV(sstr))
+                       ? sv_dup(SvRV(sstr))
+                       : sv_dup_inc(SvRV(sstr));
        break;
     case SVt_PV:
        SvANY(dstr)     = new_XPV();
@@ -8092,8 +8095,8 @@ Perl_sv_dup(pTHX_ SV *sstr)
        SvLEN(dstr)     = SvLEN(sstr);
        if (SvROK(sstr))
            SvRV(dstr)  = SvWEAKREF(SvRV(sstr))
-                       ? sv_dup_inc(SvRV(sstr))
-                       : sv_dup(SvRV(sstr));
+                       ? sv_dup(SvRV(sstr))
+                       : sv_dup_inc(SvRV(sstr));
        else if (SvPVX(sstr) && SvLEN(sstr))
            SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
        else
@@ -8106,8 +8109,8 @@ Perl_sv_dup(pTHX_ SV *sstr)
        SvIVX(dstr)     = SvIVX(sstr);
        if (SvROK(sstr))
            SvRV(dstr)  = SvWEAKREF(SvRV(sstr))
-                       ? sv_dup_inc(SvRV(sstr))
-                       : sv_dup(SvRV(sstr));
+                       ? sv_dup(SvRV(sstr))
+                       : sv_dup_inc(SvRV(sstr));
        else if (SvPVX(sstr) && SvLEN(sstr))
            SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
        else
@@ -8121,8 +8124,8 @@ Perl_sv_dup(pTHX_ SV *sstr)
        SvNVX(dstr)     = SvNVX(sstr);
        if (SvROK(sstr))
            SvRV(dstr)  = SvWEAKREF(SvRV(sstr))
-                       ? sv_dup_inc(SvRV(sstr))
-                       : sv_dup(SvRV(sstr));
+                       ? sv_dup(SvRV(sstr))
+                       : sv_dup_inc(SvRV(sstr));
        else if (SvPVX(sstr) && SvLEN(sstr))
            SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
        else
@@ -8138,8 +8141,8 @@ Perl_sv_dup(pTHX_ SV *sstr)
        SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr));
        if (SvROK(sstr))
            SvRV(dstr)  = SvWEAKREF(SvRV(sstr))
-                       ? sv_dup_inc(SvRV(sstr))
-                       : sv_dup(SvRV(sstr));
+                       ? sv_dup(SvRV(sstr))
+                       : sv_dup_inc(SvRV(sstr));
        else if (SvPVX(sstr) && SvLEN(sstr))
            SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
        else
@@ -8155,8 +8158,8 @@ Perl_sv_dup(pTHX_ SV *sstr)
        SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr));
        if (SvROK(sstr))
            SvRV(dstr)  = SvWEAKREF(SvRV(sstr))
-                       ? sv_dup_inc(SvRV(sstr))
-                       : sv_dup(SvRV(sstr));
+                       ? sv_dup(SvRV(sstr))
+                       : sv_dup_inc(SvRV(sstr));
        else if (SvPVX(sstr) && SvLEN(sstr))
            SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
        else
@@ -8175,8 +8178,8 @@ Perl_sv_dup(pTHX_ SV *sstr)
        SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr));
        if (SvROK(sstr))
            SvRV(dstr)  = SvWEAKREF(SvRV(sstr))
-                       ? sv_dup_inc(SvRV(sstr))
-                       : sv_dup(SvRV(sstr));
+                       ? sv_dup(SvRV(sstr))
+                       : sv_dup_inc(SvRV(sstr));
        else if (SvPVX(sstr) && SvLEN(sstr))
            SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
        else
@@ -8208,8 +8211,8 @@ Perl_sv_dup(pTHX_ SV *sstr)
        SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr));
        if (SvROK(sstr))
            SvRV(dstr)  = SvWEAKREF(SvRV(sstr))
-                       ? sv_dup_inc(SvRV(sstr))
-                       : sv_dup(SvRV(sstr));
+                       ? sv_dup(SvRV(sstr))
+                       : sv_dup_inc(SvRV(sstr));
        else if (SvPVX(sstr) && SvLEN(sstr))
            SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
        else
@@ -8231,8 +8234,8 @@ Perl_sv_dup(pTHX_ SV *sstr)
        SvSTASH(dstr)   = hv_dup_inc(SvSTASH(sstr));
        if (SvROK(sstr))
            SvRV(dstr)  = SvWEAKREF(SvRV(sstr))
-                       ? sv_dup_inc(SvRV(sstr))
-                       : sv_dup(SvRV(sstr));
+                       ? sv_dup(SvRV(sstr))
+                       : sv_dup_inc(SvRV(sstr));
        else if (SvPVX(sstr) && SvLEN(sstr))
            SvPVX(dstr) = SAVEPVN(SvPVX(sstr), SvLEN(sstr)-1);
        else