Commit f697c80d by Paolo Carlini Committed by Paolo Carlini

c_locale.h (__convert_from_v): Only switch to the "C" locale if the current one…

c_locale.h (__convert_from_v): Only switch to the "C" locale if the current one isn't already "C" (for old glibcs).

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
parent cb8b507b
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> 2007-05-22 Paolo Carlini <pcarlini@suse.de>
* testsuite/util/testsuite_allocator.h (check_new): Assign false * testsuite/util/testsuite_allocator.h (check_new): Assign false
......
...@@ -62,17 +62,23 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ...@@ -62,17 +62,23 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
__timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s, __timepunct<_CharT>::__timepunct(__c_locale __cloc, const char* __s,
size_t __refs) size_t __refs)
: facet(__refs), _M_data(NULL) : facet(__refs), _M_data(NULL)
{ {
const size_t __len = __builtin_strlen(__s) + 1; if (__builtin_strcmp(__s, _S_get_c_name()) != 0)
char* __tmp = new char[__len]; {
__builtin_memcpy(__tmp, __s, __len); const size_t __len = __builtin_strlen(__s) + 1;
_M_name_timepunct = __tmp; char* __tmp = new char[__len];
__builtin_memcpy(__tmp, __s, __len);
_M_name_timepunct = __tmp;
}
else
_M_name_timepunct = _S_get_c_name();
try try
{ _M_initialize_timepunct(__cloc); } { _M_initialize_timepunct(__cloc); }
catch(...) catch(...)
{ {
delete [] _M_name_timepunct; if (_M_name_timepunct != _S_get_c_name())
delete [] _M_name_timepunct;
__throw_exception_again; __throw_exception_again;
} }
} }
......
...@@ -76,11 +76,15 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ...@@ -76,11 +76,15 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
__c_locale __old = __gnu_cxx::__uselocale(__cloc); __c_locale __old = __gnu_cxx::__uselocale(__cloc);
#else #else
char* __old = std::setlocale(LC_ALL, NULL); char* __old = std::setlocale(LC_NUMERIC, NULL);
const size_t __len = __builtin_strlen(__old) + 1; char* __sav = NULL;
char* __sav = new char[__len]; if (__builtin_strcmp(__old, "C"))
__builtin_memcpy(__sav, __old, __len); {
std::setlocale(LC_ALL, "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 #endif
__builtin_va_list __args; __builtin_va_list __args;
...@@ -97,8 +101,11 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ...@@ -97,8 +101,11 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
#if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2) #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
__gnu_cxx::__uselocale(__old); __gnu_cxx::__uselocale(__old);
#else #else
std::setlocale(LC_ALL, __sav); if (__sav)
delete [] __sav; {
std::setlocale(LC_NUMERIC, __sav);
delete [] __sav;
}
#endif #endif
return __ret; return __ret;
} }
......
...@@ -55,10 +55,15 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ...@@ -55,10 +55,15 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
size_t __refs) size_t __refs)
: facet(__refs), _M_c_locale_messages(NULL), _M_name_messages(NULL) : facet(__refs), _M_c_locale_messages(NULL), _M_name_messages(NULL)
{ {
const size_t __len = __builtin_strlen(__s) + 1; if (__builtin_strcmp(__s, _S_get_c_name()) != 0)
char* __tmp = new char[__len]; {
__builtin_memcpy(__tmp, __s, __len); const size_t __len = __builtin_strlen(__s) + 1;
_M_name_messages = __tmp; 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. // Last to avoid leaking memory if new throws.
_M_c_locale_messages = _S_clone_c_locale(__cloc); _M_c_locale_messages = _S_clone_c_locale(__cloc);
...@@ -104,11 +109,18 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ...@@ -104,11 +109,18 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
: messages<_CharT>(__refs) : messages<_CharT>(__refs)
{ {
if (this->_M_name_messages != locale::facet::_S_get_c_name()) if (this->_M_name_messages != locale::facet::_S_get_c_name())
delete [] this->_M_name_messages; {
const size_t __len = __builtin_strlen(__s) + 1; delete [] this->_M_name_messages;
char* __tmp = new char[__len]; if (__builtin_strcmp(__s, locale::facet::_S_get_c_name()) != 0)
__builtin_memcpy(__tmp, __s, __len); {
this->_M_name_messages = __tmp; 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 if (__builtin_strcmp(__s, "C") != 0
&& __builtin_strcmp(__s, "POSIX") != 0) && __builtin_strcmp(__s, "POSIX") != 0)
......
...@@ -59,17 +59,23 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ...@@ -59,17 +59,23 @@ _GLIBCXX_BEGIN_NAMESPACE(std)
size_t __refs) size_t __refs)
: facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL), : facet(__refs), _M_data(NULL), _M_c_locale_timepunct(NULL),
_M_name_timepunct(NULL) _M_name_timepunct(NULL)
{ {
const size_t __len = __builtin_strlen(__s) + 1; if (__builtin_strcmp(__s, _S_get_c_name()) != 0)
char* __tmp = new char[__len]; {
__builtin_memcpy(__tmp, __s, __len); const size_t __len = __builtin_strlen(__s) + 1;
_M_name_timepunct = __tmp; char* __tmp = new char[__len];
__builtin_memcpy(__tmp, __s, __len);
_M_name_timepunct = __tmp;
}
else
_M_name_timepunct = _S_get_c_name();
try try
{ _M_initialize_timepunct(__cloc); } { _M_initialize_timepunct(__cloc); }
catch(...) catch(...)
{ {
delete [] _M_name_timepunct; if (_M_name_timepunct != _S_get_c_name())
delete [] _M_name_timepunct;
__throw_exception_again; __throw_exception_again;
} }
} }
......
...@@ -50,17 +50,24 @@ ...@@ -50,17 +50,24 @@
{ {
const ctype_base::mask* __ret; const ctype_base::mask* __ret;
char* __old = setlocale(LC_CTYPE, NULL); char* __old = setlocale(LC_CTYPE, NULL);
const size_t __len = __builtin_strlen(__old) + 1; char* __sav = NULL;
char* __sav = new char[__len]; if (__builtin_strcmp(__old, "C"))
__builtin_memcpy(__sav, __old, __len); {
setlocale(LC_CTYPE, "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) #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
__ret = *__ctype_b_loc(); __ret = *__ctype_b_loc();
#else #else
__ret = __ctype_b; __ret = __ctype_b;
#endif #endif
setlocale(LC_CTYPE, __sav); if (__sav)
delete [] __sav; {
setlocale(LC_CTYPE, __sav);
delete [] __sav;
}
return __ret; return __ret;
} }
#endif #endif
...@@ -85,10 +92,14 @@ ...@@ -85,10 +92,14 @@
_M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0)
{ {
char* __old = setlocale(LC_CTYPE, NULL); char* __old = setlocale(LC_CTYPE, NULL);
const size_t __len = __builtin_strlen(__old) + 1; char* __sav = NULL;
char* __sav = new char[__len]; if (__builtin_strcmp(__old, "C"))
__builtin_memcpy(__sav, __old, __len); {
setlocale(LC_CTYPE, "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) #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
_M_toupper = *__ctype_toupper_loc(); _M_toupper = *__ctype_toupper_loc();
_M_tolower = *__ctype_tolower_loc(); _M_tolower = *__ctype_tolower_loc();
...@@ -98,8 +109,11 @@ ...@@ -98,8 +109,11 @@
_M_tolower = __ctype_tolower; _M_tolower = __ctype_tolower;
_M_table = __table ? __table : __ctype_b; _M_table = __table ? __table : __ctype_b;
#endif #endif
setlocale(LC_CTYPE, __sav); if (__sav)
delete [] __sav; {
setlocale(LC_CTYPE, __sav);
delete [] __sav;
}
__builtin_memset(_M_widen, 0, sizeof(_M_widen)); __builtin_memset(_M_widen, 0, sizeof(_M_widen));
__builtin_memset(_M_narrow, 0, sizeof(_M_narrow)); __builtin_memset(_M_narrow, 0, sizeof(_M_narrow));
} }
...@@ -123,10 +137,14 @@ ...@@ -123,10 +137,14 @@
_M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0) _M_del(__table != 0 && __del), _M_widen_ok(0), _M_narrow_ok(0)
{ {
char* __old = setlocale(LC_CTYPE, NULL); char* __old = setlocale(LC_CTYPE, NULL);
const size_t __len = __builtin_strlen(__old) + 1; char* __sav = NULL;
char* __sav = new char[__len]; if (__builtin_strcmp(__old, "C"))
__builtin_memcpy(__sav, __old, __len); {
setlocale(LC_CTYPE, "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) #if __GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ > 2)
_M_toupper = *__ctype_toupper_loc(); _M_toupper = *__ctype_toupper_loc();
_M_tolower = *__ctype_tolower_loc(); _M_tolower = *__ctype_tolower_loc();
...@@ -136,8 +154,11 @@ ...@@ -136,8 +154,11 @@
_M_tolower = __ctype_tolower; _M_tolower = __ctype_tolower;
_M_table = __table ? __table : __ctype_b; _M_table = __table ? __table : __ctype_b;
#endif #endif
setlocale(LC_CTYPE, __sav); if (__sav)
delete [] __sav; {
setlocale(LC_CTYPE, __sav);
delete [] __sav;
}
__builtin_memset(_M_widen, 0, sizeof(_M_widen)); __builtin_memset(_M_widen, 0, sizeof(_M_widen));
__builtin_memset(_M_narrow, 0, sizeof(_M_narrow)); __builtin_memset(_M_narrow, 0, sizeof(_M_narrow));
} }
......
...@@ -42,8 +42,8 @@ ...@@ -42,8 +42,8 @@
namespace namespace
{ {
bool new_called; bool new_called = false;
bool delete_called; bool delete_called = false;
}; };
namespace __gnu_test namespace __gnu_test
...@@ -189,7 +189,6 @@ namespace __gnu_test ...@@ -189,7 +189,6 @@ namespace __gnu_test
check_new(Alloc a = Alloc()) check_new(Alloc a = Alloc())
{ {
bool test __attribute__((unused)) = true; bool test __attribute__((unused)) = true;
new_called = false;
a.allocate(10); a.allocate(10);
test &= ( new_called == uses_global_new ); test &= ( new_called == uses_global_new );
return test; return test;
...@@ -200,7 +199,6 @@ namespace __gnu_test ...@@ -200,7 +199,6 @@ namespace __gnu_test
check_delete(Alloc a = Alloc()) check_delete(Alloc a = Alloc())
{ {
bool test __attribute__((unused)) = true; bool test __attribute__((unused)) = true;
delete_called = false;
typename Alloc::pointer p = a.allocate(10); typename Alloc::pointer p = a.allocate(10);
a.deallocate(p, 10); a.deallocate(p, 10);
test &= ( delete_called == uses_global_delete ); test &= ( delete_called == uses_global_delete );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment