util.c: Avoid unnecessary setlocale() calls
authorKarl Williamson <public@khwilliamson.com>
Thu, 20 Jun 2013 18:28:12 +0000 (12:28 -0600)
committerKarl Williamson <public@khwilliamson.com>
Sun, 7 Jul 2013 19:29:44 +0000 (13:29 -0600)
This code sets the locale to C around its work.  This is unnecessary if
the locale is already C, and there is an existing global that indicates
this, that can be tested to avoid the sets.

util.c

index 42c4f66..2904500 100644 (file)
--- a/util.c
+++ b/util.c
@@ -4469,8 +4469,11 @@ Perl_upg_version(pTHX_ SV *ver, bool qv)
        SV *sv = SvNVX(ver) > 10e50 ? newSV(64) : 0;
        char *buf;
 #ifdef USE_LOCALE_NUMERIC
-       char *loc = savepv(setlocale(LC_NUMERIC, NULL));
-       setlocale(LC_NUMERIC, "C");
+       char *loc = NULL;
+        if (! PL_numeric_standard) {
+            loc = savepv(setlocale(LC_NUMERIC, NULL));
+            setlocale(LC_NUMERIC, "C");
+        }
 #endif
        if (sv) {
            Perl_sv_setpvf(aTHX_ sv, "%.9"NVff, SvNVX(ver));
@@ -4481,8 +4484,10 @@ Perl_upg_version(pTHX_ SV *ver, bool qv)
            buf = tbuf;
        }
 #ifdef USE_LOCALE_NUMERIC
-       setlocale(LC_NUMERIC, loc);
-       Safefree(loc);
+        if (loc) {
+            setlocale(LC_NUMERIC, loc);
+            Safefree(loc);
+        }
 #endif
        while (buf[len-1] == '0' && len > 0) len--;
        if ( buf[len-1] == '.' ) len--; /* eat the trailing decimal */