This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
perlapi: Remove per-thread section; move to real scns
[perl5.git] / vutil.c
diff --git a/vutil.c b/vutil.c
index 2367489..341eb9b 100644 (file)
--- a/vutil.c
+++ b/vutil.c
@@ -8,6 +8,8 @@
 #define VERSION_MAX 0x7FFFFFFF
 
 /*
+=for apidoc_section Versioning
+
 =for apidoc prescan_version
 
 Validate that a given string can be parsed as a version object, but doesn't
@@ -533,7 +535,7 @@ Perl_new_version(pTHX_ SV *ver)
            under = ninstr(raw, raw+len, underscore, underscore + 1);
            if (under) {
                Move(under + 1, under, raw + len - under - 1, char);
-               SvCUR(rv)--;
+               SvCUR_set(rv, SvCUR(rv) - 1);
                *SvEND(rv) = '\0';
            }
            /* this is for consistency with the pure Perl class */
@@ -571,11 +573,6 @@ Perl_upg_version2(pTHX_ SV *ver, bool qv)
 Perl_upg_version(pTHX_ SV *ver, bool qv)
 #endif
 {
-
-#ifdef dVAR
-    dVAR;
-#endif
-
     const char *version, *s;
 #ifdef SvVOK
     const MAGIC *mg;
@@ -643,6 +640,8 @@ VER_NV:
             if (   strNE(locale_name_on_entry, "C")
                 && strNE(locale_name_on_entry, "POSIX"))
             {
+                /* the setlocale() call might free or overwrite the name */
+                locale_name_on_entry = savepv(locale_name_on_entry);
                 setlocale(LC_NUMERIC, "C");
             }
             else {  /* This value indicates to the restore code that we didn't
@@ -666,6 +665,8 @@ VER_NV:
                 if (   strNE(locale_name_on_entry, "C")
                     && strNE(locale_name_on_entry, "POSIX"))
                 {
+                    /* the setlocale() call might free or overwrite the name */
+                    locale_name_on_entry = savepv(locale_name_on_entry);
                     setlocale(LC_NUMERIC, "C");
                 }
                 else {  /* This value indicates to the restore code that we
@@ -698,7 +699,7 @@ VER_NV:
 #endif
 
        if (sv) {
-                Perl_sv_catpvf(aTHX_ sv, "%.9" NVff, SvNVX(ver));
+                Perl_sv_setpvf(aTHX_ sv, "%.9" NVff, SvNVX(ver));
            len = SvCUR(sv);
            buf = SvPVX(sv);
        }
@@ -715,6 +716,7 @@ VER_NV:
 
             if (locale_name_on_entry) {
                 setlocale(LC_NUMERIC, locale_name_on_entry);
+                Safefree(locale_name_on_entry);
             }
 
             LC_NUMERIC_UNLOCK;  /* End critical section */
@@ -723,6 +725,7 @@ VER_NV:
 
             if (locale_name_on_entry) {
                 setlocale(LC_NUMERIC, locale_name_on_entry);
+                Safefree(locale_name_on_entry);
                 LC_NUMERIC_UNLOCK;
             }
             else if (locale_obj_on_entry == PL_underlying_numeric_obj) {
@@ -758,7 +761,6 @@ VER_PV:
        version = savepvn(SvPV(ver,len), SvCUR(ver));
        SAVEFREEPV(version);
 #ifndef SvVOK
-#  if PERL_VERSION > 5
        /* This will only be executed for 5.6.0 - 5.8.0 inclusive */
        if ( len >= 3 && !instr(version,".") && !instr(version,"_")) {
            /* may be a v-string */
@@ -791,7 +793,6 @@ VER_PV:
                }
            }
        }
-#  endif
 #endif
     }
 #if PERL_VERSION_LT(5,17,2)