c_locale.h (__convert_from_v): Only switch to the "C" locale if the current one isn...
authorPaolo Carlini <pcarlini@suse.de>
Thu, 24 May 2007 14:49:45 +0000 (14:49 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Thu, 24 May 2007 14:49:45 +0000 (14:49 +0000)
2007-05-24  Paolo Carlini  <pcarlini@suse.de>

* config/locale/gnu/c_locale.h (__convert_from_v): Only switch to the
"C" locale if the current one isn't already "C" (for old glibcs).
* config/os/gnu-linux/ctype_noninline.h (ctype<char>::classic_table,
ctype<char>::ctype(__c_locale, const mask*, bool, size_t),
ctype<char>::ctype(const mask*, bool, size_t)): Likewise, for generic
locale model.
* config/locale/gnu/messages_members.h
(messages<>::messages(__c_locale, const char*, size_t),
messages_byname<_CharT>::messages_byname(const char*, size_t)):
Only dynamically allocate memory if __s != "C".
* config/locale/gnu/time_members.h
(__timepunct<_CharT>::__timepunct(__c_locale, const char*, size_t)):
Likewise.
* config/locale/generic/time_members.h
(__timepunct<_CharT>::__timepunct(__c_locale, const char*, size_t)):
Likewise.

* testsuite/util/testsuite_allocator.h: Revert last change.

From-SVN: r125028

libstdc++-v3/ChangeLog
libstdc++-v3/config/locale/generic/time_members.h
libstdc++-v3/config/locale/gnu/c_locale.h
libstdc++-v3/config/locale/gnu/messages_members.h
libstdc++-v3/config/locale/gnu/time_members.h
libstdc++-v3/config/os/gnu-linux/ctype_noninline.h
libstdc++-v3/testsuite/util/testsuite_allocator.h

index 0c66fea67a28194e0daa7f2439f8909d53e9a789..02d6697c40afb8d75f3af914b8da45709e136bea 100644 (file)
@@ -1,3 +1,24 @@
+2007-05-24  Paolo Carlini  <pcarlini@suse.de>
+
+       * config/locale/gnu/c_locale.h (__convert_from_v): Only switch to the
+       "C" locale if the current one isn't already "C" (for old glibcs).
+       * config/os/gnu-linux/ctype_noninline.h (ctype<char>::classic_table,
+       ctype<char>::ctype(__c_locale, const mask*, bool, size_t),
+       ctype<char>::ctype(const mask*, bool, size_t)): Likewise, for generic
+       locale model.
+       * config/locale/gnu/messages_members.h
+       (messages<>::messages(__c_locale, const char*, size_t),
+       messages_byname<_CharT>::messages_byname(const char*, size_t)):
+       Only dynamically allocate memory if __s != "C".
+       * config/locale/gnu/time_members.h
+       (__timepunct<_CharT>::__timepunct(__c_locale, const char*, size_t)):
+       Likewise.
+       * config/locale/generic/time_members.h
+       (__timepunct<_CharT>::__timepunct(__c_locale, const char*, size_t)):
+       Likewise.
+
+       * testsuite/util/testsuite_allocator.h: Revert last change.
+
 2007-05-22  Paolo Carlini  <pcarlini@suse.de>
 
        * testsuite/util/testsuite_allocator.h (check_new): Assign false
index dc387691d9a99beca6bbc977fd3e63658f4b2437..20c2b54058d05e0bb25ef40d25d5b4a6e2c2ccbe 100644 (file)
@@ -62,17 +62,23 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
     __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, 
                                     size_t __refs) 
     : facet(__refs), _M_data(NULL)
-    { 
-      const size_t __len = __builtin_strlen(__s) + 1;
-      char* __tmp = new char[__len];
-      __builtin_memcpy(__tmp, __s, __len);
-      _M_name_timepunct = __tmp;
+    {
+      if (__builtin_strcmp(__s, _S_get_c_name()) != 0)
+       {
+         const size_t __len = __builtin_strlen(__s) + 1;
+         char* __tmp = new char[__len];
+         __builtin_memcpy(__tmp, __s, __len);
+         _M_name_timepunct = __tmp;
+       }
+      else
+       _M_name_timepunct = _S_get_c_name();
 
       try
        { _M_initialize_timepunct(__cloc); }
       catch(...)
-       { 
-         delete [] _M_name_timepunct;
+       {
+         if (_M_name_timepunct != _S_get_c_name())
+           delete [] _M_name_timepunct;
          __throw_exception_again;
        }
     }
index 33a2c07d8ac1f88c9a29792027991fe03790a5a8..67ecb7d13c74d1181e3ba4ffb7fc0ac6492f3a57 100644 (file)
@@ -76,11 +76,15 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
 #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
     __c_locale __old = __gnu_cxx::__uselocale(__cloc);
 #else
-    char* __old = std::setlocale(LC_ALL, NULL);
-    const size_t __len = __builtin_strlen(__old) + 1;
-    char* __sav = new char[__len];
-    __builtin_memcpy(__sav, __old, __len);
-    std::setlocale(LC_ALL, "C");
+    char* __old = std::setlocale(LC_NUMERIC, NULL);
+    char* __sav = NULL;
+    if (__builtin_strcmp(__old, "C"))
+      {
+       const size_t __len = __builtin_strlen(__old) + 1;
+       char* __sav = new char[__len];
+       __builtin_memcpy(__sav, __old, __len);
+       std::setlocale(LC_NUMERIC, "C");
+      }
 #endif
 
     __builtin_va_list __args;
@@ -97,8 +101,11 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
 #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
     __gnu_cxx::__uselocale(__old);
 #else
-    std::setlocale(LC_ALL, __sav);
-    delete [] __sav;
+    if (__sav)
+      {
+       std::setlocale(LC_NUMERIC, __sav);
+       delete [] __sav;
+      }
 #endif
     return __ret;
   }
index bfe2533369797b06cbd2a06e82672e865a0b9d5c..28d783c136fdc0315b2af17330ba48c281885551 100644 (file)
@@ -55,10 +55,15 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
                                size_t __refs) 
      : facet(__refs), _M_c_locale_messages(NULL), _M_name_messages(NULL)
      {
-       const size_t __len = __builtin_strlen(__s) + 1;
-       char* __tmp = new char[__len];
-       __builtin_memcpy(__tmp, __s, __len);
-       _M_name_messages = __tmp;
+       if (__builtin_strcmp(__s, _S_get_c_name()) != 0)
+        {
+          const size_t __len = __builtin_strlen(__s) + 1;
+          char* __tmp = new char[__len];
+          __builtin_memcpy(__tmp, __s, __len);
+          _M_name_messages = __tmp;
+        }
+       else
+        _M_name_messages = _S_get_c_name();
 
        // Last to avoid leaking memory if new throws.
        _M_c_locale_messages = _S_clone_c_locale(__cloc);
@@ -104,11 +109,18 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
      : messages<_CharT>(__refs) 
      { 
        if (this->_M_name_messages != locale::facet::_S_get_c_name())
-        delete [] this->_M_name_messages;
-       const size_t __len = __builtin_strlen(__s) + 1;
-       char* __tmp = new char[__len];
-       __builtin_memcpy(__tmp, __s, __len);
-       this->_M_name_messages = __tmp;
+        {
+          delete [] this->_M_name_messages;
+          if (__builtin_strcmp(__s, locale::facet::_S_get_c_name()) != 0)
+            {
+              const size_t __len = __builtin_strlen(__s) + 1;
+              char* __tmp = new char[__len];
+              __builtin_memcpy(__tmp, __s, __len);
+              this->_M_name_messages = __tmp;
+            }
+          else
+            this->_M_name_messages = locale::facet::_S_get_c_name();
+        }
 
        if (__builtin_strcmp(__s, "C") != 0
           && __builtin_strcmp(__s, "POSIX") != 0)
index 7f97bcbbd7b45433d01e8c3b5945d1e52309b72b..3e5e0c3ed2064610d81fe2fb04baa288b6bea052 100644 (file)
@@ -59,17 +59,23 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
                                     size_t __refs) 
     : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), 
       _M_name_timepunct(NULL)
-    { 
-      const size_t __len = __builtin_strlen(__s) + 1;
-      char* __tmp = new char[__len];
-      __builtin_memcpy(__tmp, __s, __len);
-      _M_name_timepunct = __tmp;
+    {
+      if (__builtin_strcmp(__s, _S_get_c_name()) != 0)
+       {
+         const size_t __len = __builtin_strlen(__s) + 1;
+         char* __tmp = new char[__len];
+         __builtin_memcpy(__tmp, __s, __len);
+         _M_name_timepunct = __tmp;
+       }
+      else
+       _M_name_timepunct = _S_get_c_name();
 
       try
        { _M_initialize_timepunct(__cloc); }
       catch(...)
        {
-         delete [] _M_name_timepunct;
+         if (_M_name_timepunct != _S_get_c_name())
+           delete [] _M_name_timepunct;
          __throw_exception_again;
        }
     }
index 779b26a0d492e368559781513798cc0fcd43e1dd..808b25c9328f1b22b6ea72d41dc9d80d4fe392c2 100644 (file)
   {
     const ctype_base::mask* __ret;
     char* __old = setlocale(LC_CTYPE, NULL);
-    const size_t __len = __builtin_strlen(__old) + 1;
-    char* __sav = new char[__len];
-    __builtin_memcpy(__sav, __old, __len);
-    setlocale(LC_CTYPE, "C");
+    char* __sav = NULL;
+    if (__builtin_strcmp(__old, "C"))
+      {
+       const size_t __len = __builtin_strlen(__old) + 1;
+       __sav = new char[__len];
+       __builtin_memcpy(__sav, __old, __len);
+       setlocale(LC_CTYPE, "C");
+      }
 #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
     __ret = *__ctype_b_loc();
 #else
     __ret = __ctype_b;
 #endif
-    setlocale(LC_CTYPE, __sav);
-    delete [] __sav;
+    if (__sav)
+      {
+       setlocale(LC_CTYPE, __sav);
+       delete [] __sav;
+      }
     return __ret;
   }
 #endif
   _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0)
   {
     char* __old = setlocale(LC_CTYPE, NULL);
-    const size_t __len = __builtin_strlen(__old) + 1;
-    char* __sav = new char[__len];
-    __builtin_memcpy(__sav, __old, __len);    
-    setlocale(LC_CTYPE, "C");
+    char* __sav = NULL;
+    if (__builtin_strcmp(__old, "C"))
+      {    
+       const size_t __len = __builtin_strlen(__old) + 1;
+       __sav = new char[__len];
+       __builtin_memcpy(__sav, __old, __len);    
+       setlocale(LC_CTYPE, "C");
+      }
 #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
     _M_toupper = *__ctype_toupper_loc();
     _M_tolower = *__ctype_tolower_loc();
     _M_tolower = __ctype_tolower;
     _M_table = __table ? __table : __ctype_b;
 #endif
-    setlocale(LC_CTYPE, __sav);
-    delete [] __sav;
+    if (__sav)
+      {
+       setlocale(LC_CTYPE, __sav);
+       delete [] __sav;
+      }
     __builtin_memset(_M_widen, 0, sizeof(_M_widen));
     __builtin_memset(_M_narrow, 0, sizeof(_M_narrow));
   }
   _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0)
   {
     char* __old = setlocale(LC_CTYPE, NULL);
-    const size_t __len = __builtin_strlen(__old) + 1;
-    char* __sav = new char[__len];
-    __builtin_memcpy(__sav, __old, __len);
-    setlocale(LC_CTYPE, "C");
+    char* __sav = NULL;
+    if (__builtin_strcmp(__old, "C"))
+      {
+       const size_t __len = __builtin_strlen(__old) + 1;
+       __sav = new char[__len];
+       __builtin_memcpy(__sav, __old, __len);
+       setlocale(LC_CTYPE, "C");
+      }
 #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
     _M_toupper = *__ctype_toupper_loc();
     _M_tolower = *__ctype_tolower_loc();
     _M_tolower = __ctype_tolower;
     _M_table = __table ? __table : __ctype_b;
 #endif
-    setlocale(LC_CTYPE, __sav);
-    delete [] __sav;
+    if (__sav)
+      {
+       setlocale(LC_CTYPE, __sav);
+       delete [] __sav;
+      }
     __builtin_memset(_M_widen, 0, sizeof(_M_widen));
     __builtin_memset(_M_narrow, 0, sizeof(_M_narrow));
   }
index aaed7311f68ed598c7569cf88ab3d099b93d6b99..d6108cc60648f3ba6e42bf31a30f1d8b91718147 100644 (file)
@@ -42,8 +42,8 @@
 
 namespace 
 {
-  bool new_called;
-  bool delete_called;
+  bool new_called = false;
+  bool delete_called = false;
 };
 
 namespace __gnu_test
@@ -189,7 +189,6 @@ namespace __gnu_test
     check_new(Alloc a = Alloc())
     {
       bool test __attribute__((unused)) = true;
-      new_called = false;
       a.allocate(10);
       test &= ( new_called == uses_global_new );
       return test;
@@ -200,7 +199,6 @@ namespace __gnu_test
     check_delete(Alloc a = Alloc())
     {
       bool test __attribute__((unused)) = true;
-      delete_called = false;
       typename Alloc::pointer p = a.allocate(10);
       a.deallocate(p, 10);
       test &= ( delete_called == uses_global_delete );