From: Paolo Carlini Date: Tue, 2 Dec 2008 15:02:53 +0000 (+0000) Subject: PR libstdc++/38365 (cont) X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=3ecaae52245d4044b089e56ef3f48b43f53a86ec;p=platform%2Fupstream%2Fgcc.git PR libstdc++/38365 (cont) 2008-12-02 Paolo Carlini PR libstdc++/38365 (cont) * src/localename.cc (locale::locale(const locale&, const locale&, category)): Revert last changes. * src/localename.cc (locale::_Impl::_M_replace_categories(const _Impl*, category)): Fix here instead; rework. From-SVN: r142358 --- diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 000430f..25857cb 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,5 +1,13 @@ 2008-12-02 Paolo Carlini + PR libstdc++/38365 (cont) + * src/localename.cc (locale::locale(const locale&, const locale&, + category)): Revert last changes. + * src/localename.cc (locale::_Impl::_M_replace_categories(const + _Impl*, category)): Fix here instead; rework. + +2008-12-02 Paolo Carlini + PR libstdc++/38365 * src/localename.cc (locale::locale(const locale&, const locale&, category)): Fix. diff --git a/libstdc++-v3/src/localename.cc b/libstdc++-v3/src/localename.cc index fe6204b..5f5ec5f 100644 --- a/libstdc++-v3/src/localename.cc +++ b/libstdc++-v3/src/localename.cc @@ -157,14 +157,7 @@ _GLIBCXX_BEGIN_NAMESPACE(std) locale::locale(const locale& __base, const locale& __add, category __cat) : _M_impl(0) - { - _M_coalesce(__base, __add, __cat); - if (!__base._M_impl->_M_names[0] || !__add._M_impl->_M_names[0]) - { - delete [] _M_impl->_M_names[0]; - _M_impl->_M_names[0] = 0; // Unnamed. - } - } + { _M_coalesce(__base, __add, __cat); } void locale::_M_coalesce(const locale& __base, const locale& __add, @@ -274,29 +267,43 @@ _GLIBCXX_BEGIN_NAMESPACE(std) _M_replace_categories(const _Impl* __imp, category __cat) { category __mask = 1; - const bool __have_names = _M_names[0] && __imp->_M_names[0]; - for (size_t __ix = 0; __ix < _S_categories_size; ++__ix, __mask <<= 1) + if (!_M_names[0] || !__imp->_M_names[0]) + { + if (_M_names[0]) + { + delete [] _M_names[0]; + _M_names[0] = 0; // Unnamed. + } + + for (size_t __ix = 0; __ix < _S_categories_size; ++__ix, __mask <<= 1) + { + if (__mask & __cat) + // Need to replace entry in _M_facets with other locale's info. + _M_replace_category(__imp, _S_facet_categories[__ix]); + } + } + else { - if (__mask & __cat) + if (!_M_names[1]) { - // Need to replace entry in _M_facets with other locale's info. - _M_replace_category(__imp, _S_facet_categories[__ix]); - // If both have names, go ahead and mangle. - if (__have_names) + // A full set of _M_names must be prepared, all identical + // to _M_names[0] to begin with. Then, below, a few will + // be replaced by the corresponding __imp->_M_names. I.e., + // not a "simple" locale anymore (see locale::operator==). + const size_t __len = std::strlen(_M_names[0]) + 1; + for (size_t __i = 1; __i < _S_categories_size; ++__i) { - if (!_M_names[1]) - { - // A full set of _M_names must be prepared, all identical - // to _M_names[0] to begin with. Then, below, a few will - // be replaced by the corresponding __imp->_M_names. I.e., - // not a "simple" locale anymore (see locale::operator==). - const size_t __len = std::strlen(_M_names[0]) + 1; - for (size_t __i = 1; __i < _S_categories_size; ++__i) - { - _M_names[__i] = new char[__len]; - std::memcpy(_M_names[__i], _M_names[0], __len); - } - } + _M_names[__i] = new char[__len]; + std::memcpy(_M_names[__i], _M_names[0], __len); + } + } + + for (size_t __ix = 0; __ix < _S_categories_size; ++__ix, __mask <<= 1) + { + if (__mask & __cat) + { + // Need to replace entry in _M_facets with other locale's info. + _M_replace_category(__imp, _S_facet_categories[__ix]); // FIXME: Hack for libstdc++/29217: the numerical encodings // of the time and collate categories are swapped vs the