diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index e0d5c0e83ae..aceb26e7d27 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,14 @@ +2006-10-09 Paolo Carlini + + PR libstdc++/28277 (partial: money_put bits) + * include/bits/locale_facets.tcc (money_put<>::_M_insert(iter_type, + ios_base&, char_type, const string_type&)): Avoid __builtin_alloca + with no limit, do the work in place. + + * include/bits/locale_facets.tcc (money_put<>::do_put(iter_type, + bool, ios_base&, char_type, long double)): Avoid unnecessary + __builtin_alloca, do the work in place. + 2006-10-09 Benjamin Kosnik * src/globals_io.cc (_GLIBCXX_once): Remove, unused. diff --git a/libstdc++-v3/include/bits/locale_facets.tcc b/libstdc++-v3/include/bits/locale_facets.tcc index 789df493c5c..43051a1a71a 100644 --- a/libstdc++-v3/include/bits/locale_facets.tcc +++ b/libstdc++-v3/include/bits/locale_facets.tcc @@ -1640,22 +1640,20 @@ _GLIBCXX_BEGIN_LDBL_NAMESPACE // Add thousands separators to non-decimal digits, per // grouping rules. - int __paddec = __len - __lc->_M_frac_digits; + long __paddec = __len - __lc->_M_frac_digits; if (__paddec > 0) { if (__lc->_M_frac_digits < 0) __paddec = __len; if (__lc->_M_grouping_size) { - _CharT* __ws = - static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) - * 2 * __len)); - _CharT* __ws_end = - std::__add_grouping(__ws, __lc->_M_thousands_sep, + __value.assign(2 * __paddec, char_type()); + _CharT* __vend = + std::__add_grouping(&__value[0], __lc->_M_thousands_sep, __lc->_M_grouping, __lc->_M_grouping_size, __beg, __beg + __paddec); - __value.assign(__ws, __ws_end - __ws); + __value.erase(__vend - &__value[0]); } else __value.assign(__beg, __paddec); @@ -1755,9 +1753,7 @@ _GLIBCXX_BEGIN_LDBL_NAMESPACE money_put<_CharT, _OutIter>:: __do_put(iter_type __s, bool __intl, ios_base& __io, char_type __fill, double __units) const - { - return this->do_put(__s, __intl, __io, __fill, (long double) __units); - } + { return this->do_put(__s, __intl, __io, __fill, (long double) __units); } #endif template @@ -1791,10 +1787,8 @@ _GLIBCXX_BEGIN_LDBL_NAMESPACE int __len = std::__convert_from_v(_S_get_c_locale(), __cs, 0, "%.*Lf", 0, __units); #endif - _CharT* __ws = static_cast<_CharT*>(__builtin_alloca(sizeof(_CharT) - * __cs_size)); - __ctype.widen(__cs, __cs + __len, __ws); - const string_type __digits(__ws, __len); + string_type __digits(__len, char_type()); + __ctype.widen(__cs, __cs + __len, &__digits[0]); return __intl ? _M_insert(__s, __io, __fill, __digits) : _M_insert(__s, __io, __fill, __digits); }