Commit 420644ea by Paolo Carlini Committed by Paolo Carlini

locale_facets.tcc (collate<>::do_transform( const _CharT*, const _CharT*)):…

locale_facets.tcc (collate<>::do_transform( const _CharT*, const _CharT*)): Simplify previous fix for libstdc++/28277, always allocate memory dynamically.

2006-07-11  Paolo Carlini  <pcarlini@suse.de>

	* include/bits/locale_facets.tcc (collate<>::do_transform(
	const _CharT*, const _CharT*)): Simplify previous fix for
	libstdc++/28277, always allocate memory dynamically.

From-SVN: r115356
parent ad084e9d
2006-07-11 Paolo Carlini <pcarlini@suse.de> 2006-07-11 Paolo Carlini <pcarlini@suse.de>
* include/bits/locale_facets.tcc (collate<>::do_transform(
const _CharT*, const _CharT*)): Simplify previous fix for
libstdc++/28277, always allocate memory dynamically.
2006-07-11 Paolo Carlini <pcarlini@suse.de>
PR libstdc++/28344 PR libstdc++/28344
* include/tr1/random (gamma_distribution<>:: * include/tr1/random (gamma_distribution<>::
gamma_distribution(const result_type&)): Don't use __alpha as gamma_distribution(const result_type&)): Don't use __alpha as
......
...@@ -2457,28 +2457,18 @@ _GLIBCXX_END_LDBL_NAMESPACE ...@@ -2457,28 +2457,18 @@ _GLIBCXX_END_LDBL_NAMESPACE
{ {
string_type __ret; string_type __ret;
// Use alloca for an _M_transform temporary buffer up to an arbitrary,
// but limited, asize, to avoid abusing the stack. Otherwise fall back
// to dynamic memory allocation. This means splitting the computation
// itself in hunks: a size <= 8k (thus <= 16k asize) appear sufficient
// for optimal performance.
const size_t __size = std::min(size_t(__hi - __lo), size_t(8192));
const size_t __asize = 2 * __size;
size_t __len = __asize;
_CharT* __c =
static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) * __len));
for (size_t __hunk = __size; __lo < __hi;
__lo += __hunk, __hunk = std::min(size_t(__hi - __lo), __hunk))
{
// strxfrm assumes zero-terminated strings so we make a copy // strxfrm assumes zero-terminated strings so we make a copy
const string_type __str(__lo, __lo + __hunk); const string_type __str(__lo, __hi);
const _CharT* __p = __str.c_str(); const _CharT* __p = __str.c_str();
const _CharT* __pend = __str.data() + __hunk; const _CharT* __pend = __str.data() + __str.length();
size_t __len = (__hi - __lo) * 2;
_CharT* __c = new _CharT[__len];
try
{
// strxfrm stops when it sees a nul character so we break // strxfrm stops when it sees a nul character so we break
// the string into zero-terminated substrings and pass those // the string into zero-terminated substrings and pass those
// to strxfrm. // to strxfrm.
...@@ -2490,9 +2480,8 @@ _GLIBCXX_END_LDBL_NAMESPACE ...@@ -2490,9 +2480,8 @@ _GLIBCXX_END_LDBL_NAMESPACE
// correct size. // correct size.
if (__res >= __len) if (__res >= __len)
{ {
if (__len > __asize)
delete [] __c;
__len = __res + 1; __len = __res + 1;
delete [] __c, __c = 0;
__c = new _CharT[__len]; __c = new _CharT[__len];
__res = _M_transform(__c, __p, __len); __res = _M_transform(__c, __p, __len);
} }
...@@ -2506,8 +2495,12 @@ _GLIBCXX_END_LDBL_NAMESPACE ...@@ -2506,8 +2495,12 @@ _GLIBCXX_END_LDBL_NAMESPACE
__ret.push_back(_CharT()); __ret.push_back(_CharT());
} }
} }
catch(...)
{
delete [] __c;
__throw_exception_again;
}
if (__len > __asize)
delete [] __c; delete [] __c;
return __ret; return __ret;
......
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