This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
locale.c: Avoid some more locale changes
authorKarl Williamson <khw@cpan.org>
Tue, 2 Jan 2018 19:25:35 +0000 (12:25 -0700)
committerKarl Williamson <khw@cpan.org>
Wed, 31 Jan 2018 05:35:09 +0000 (22:35 -0700)
In a few places here we can test if we are already in the locale we want
to be in, and not switch unnecessarily if so.

locale.c

index cfc4805..befd750 100644 (file)
--- a/locale.c
+++ b/locale.c
@@ -1127,7 +1127,8 @@ Perl_setlocale(int category, const char * locale)
 
 #  ifdef LC_ALL
 
-        else if (category == LC_ALL) {
+        else if (category == LC_ALL && ! PL_numeric_underlying) {
+
             SET_NUMERIC_UNDERLYING();
         }
 
@@ -1422,7 +1423,9 @@ S_my_nl_langinfo(const int item, bool toggle)
     LOCALE_LOCK;
 
     if (toggle) {
-        if (item == PERL_RADIXCHAR || item == PERL_THOUSEP) {
+        if (  ! PL_numeric_underlying
+            && (item == PERL_RADIXCHAR || item == PERL_THOUSEP))
+        {
             do_setlocale_c(LC_NUMERIC, PL_numeric_name);
         }
         else {
@@ -1448,9 +1451,7 @@ S_my_nl_langinfo(const int item, bool toggle)
         do_free = TRUE;
     }
 
-    if (   toggle
-        && (item == PERL_RADIXCHAR || item == PERL_THOUSEP))
-    {
+    if (toggle) {
         cur = newlocale(LC_NUMERIC_MASK, PL_numeric_name, cur);
         do_free = TRUE;
     }
@@ -1554,7 +1555,12 @@ S_my_nl_langinfo(const int item, bool toggle)
             LOCALE_LOCK;
 
             if (toggle) {
-                do_setlocale_c(LC_NUMERIC, PL_numeric_name);
+                if (! PL_numeric_underlying) {
+                    do_setlocale_c(LC_NUMERIC, PL_numeric_name);
+                }
+                else {
+                    toggle = FALSE;
+                }
             }
 
             lc = localeconv();