From a64bf6e4d55970dbc7b92e9fcbdd596cdbc32564 Mon Sep 17 00:00:00 2001 From: Robert Ramey Date: Thu, 22 Oct 2015 04:42:22 -0700 Subject: [PATCH] isolated one problem with codecvt facets --- build/Jamfile.v2 | 14 ++++++------- .../boost/archive/basic_binary_iprimitive.hpp | 9 +++++++++ .../boost/archive/basic_binary_oprimitive.hpp | 9 +++++++++ .../archive/basic_streambuf_locale_saver.hpp | 9 --------- .../boost/archive/basic_text_iprimitive.hpp | 15 ++++++++++---- .../boost/archive/basic_text_oprimitive.hpp | 13 +++++++++--- .../boost/archive/detail/basic_oarchive.hpp | 20 +++++++++---------- .../archive/detail/utf8_codecvt_facet.hpp | 9 ++++++++- .../archive/impl/basic_binary_iprimitive.ipp | 3 ++- .../archive/impl/basic_binary_oprimitive.ipp | 16 +++++---------- .../archive/impl/basic_text_iprimitive.ipp | 4 ++-- .../boost/archive/impl/xml_wiarchive_impl.ipp | 2 +- .../boost/archive/impl/xml_woarchive_impl.ipp | 8 +------- .../boost/archive/iterators/mb_from_wchar.hpp | 10 +--------- .../boost/archive/iterators/wchar_from_mb.hpp | 16 ++++----------- include/boost/archive/xml_wiarchive.hpp | 10 +--------- include/boost/archive/xml_woarchive.hpp | 11 +--------- src/utf8_codecvt_facet.cpp | 3 +++ test/Jamfile.v2 | 4 ++-- test/test_utf8_codecvt.cpp | 11 ++-------- 20 files changed, 89 insertions(+), 107 deletions(-) diff --git a/build/Jamfile.v2 b/build/Jamfile.v2 index 2db025e4..85288fc0 100644 --- a/build/Jamfile.v2 +++ b/build/Jamfile.v2 @@ -81,6 +81,7 @@ SOURCES = xml_oarchive xml_archive_exception utf8_codecvt_facet + codecvt_null ; WSOURCES = @@ -91,7 +92,6 @@ WSOURCES = xml_wgrammar xml_wiarchive xml_woarchive - codecvt_null ; lib boost_serialization @@ -99,9 +99,9 @@ lib boost_serialization : msvc:/Gy msvc:_SCL_SECURE_NO_WARNINGS - clang:"-fvisibility=hidden -fvisibility-inlines-hidden" - gcc:"-fvisibility=hidden -fvisibility-inlines-hidden" - darwin:"-fvisibility=hidden -fvisibility-inlines-hidden" + # clang:"-fvisibility=hidden -fvisibility-inlines-hidden" + # gcc:"-fvisibility=hidden -fvisibility-inlines-hidden" + # darwin:"-fvisibility=hidden -fvisibility-inlines-hidden" gcc:"-ftemplate-depth-255" clang:"-ftemplate-depth-255" darwin:"-ftemplate-depth-255" @@ -113,9 +113,9 @@ lib boost_wserialization : msvc:/Gy msvc:_SCL_SECURE_NO_WARNINGS - clang:"-fvisibility=hidden -fvisibility-inlines-hidden" - gcc:"-fvisibility=hidden -fvisibility-inlines-hidden" - darwin:"-fvisibility=hidden -fvisibility-inlines-hidden" + # clang:"-fvisibility=hidden -fvisibility-inlines-hidden" + # gcc:"-fvisibility=hidden -fvisibility-inlines-hidden" + # darwin:"-fvisibility=hidden -fvisibility-inlines-hidden" gcc:"-ftemplate-depth-255" clang:"-ftemplate-depth-255" darwin:"-ftemplate-depth-255" diff --git a/include/boost/archive/basic_binary_iprimitive.hpp b/include/boost/archive/basic_binary_iprimitive.hpp index 2285e077..5cab9916 100644 --- a/include/boost/archive/basic_binary_iprimitive.hpp +++ b/include/boost/archive/basic_binary_iprimitive.hpp @@ -52,6 +52,7 @@ namespace std{ #include #include +#include #include #include #include @@ -77,7 +78,15 @@ public: } #ifndef BOOST_NO_STD_LOCALE + // note order! - if you change this, libstd++ will fail! + // a) create new locale with new codecvt facet + // b) save current locale + // c) change locale to new one + // d) use stream buffer + // e) change locale back to original + // f) destroy new codecvt facet boost::archive::codecvt_null codecvt_null_facet; + basic_streambuf_locale_saver locale_saver; std::locale archive_locale; #endif diff --git a/include/boost/archive/basic_binary_oprimitive.hpp b/include/boost/archive/basic_binary_oprimitive.hpp index 8aa131a2..8c7691dd 100644 --- a/include/boost/archive/basic_binary_oprimitive.hpp +++ b/include/boost/archive/basic_binary_oprimitive.hpp @@ -47,6 +47,7 @@ namespace std{ #include #include +#include #include #include #include @@ -72,7 +73,15 @@ public: return static_cast(this); } #ifndef BOOST_NO_STD_LOCALE + // note order! - if you change this, libstd++ will fail! + // a) create new locale with new codecvt facet + // b) save current locale + // c) change locale to new one + // d) use stream buffer + // e) change locale back to original + // f) destroy new codecvt facet boost::archive::codecvt_null codecvt_null_facet; + basic_streambuf_locale_saver locale_saver; std::locale archive_locale; #endif // default saving of primitives. diff --git a/include/boost/archive/basic_streambuf_locale_saver.hpp b/include/boost/archive/basic_streambuf_locale_saver.hpp index 09cbdde1..f187673b 100644 --- a/include/boost/archive/basic_streambuf_locale_saver.hpp +++ b/include/boost/archive/basic_streambuf_locale_saver.hpp @@ -45,19 +45,10 @@ class basic_streambuf_locale_saver : private boost::noncopyable { public: - typedef ::std::basic_streambuf state_type; - typedef ::std::locale aspect_type; explicit basic_streambuf_locale_saver(std::basic_streambuf &s) : m_streambuf(s), m_locale(s.getloc()) {} - explicit basic_streambuf_locale_saver( - std::basic_streambuf &s, - std::locale const &l - ) : - m_streambuf(s), - m_locale(s.pubimbue(l)) - {} ~basic_streambuf_locale_saver(){ m_streambuf.pubsync(); m_streambuf.pubimbue(m_locale); diff --git a/include/boost/archive/basic_text_iprimitive.hpp b/include/boost/archive/basic_text_iprimitive.hpp index 7e5404bf..94c02c50 100644 --- a/include/boost/archive/basic_text_iprimitive.hpp +++ b/include/boost/archive/basic_text_iprimitive.hpp @@ -68,12 +68,19 @@ protected: io::ios_precision_saver precision_saver; #ifndef BOOST_NO_STD_LOCALE - basic_streambuf_locale_saver< - typename IStream::char_type, - typename IStream::traits_type - > locale_saver; + // note order! - if you change this, libstd++ will fail! + // a) create new locale with new codecvt facet + // b) save current locale + // c) change locale to new one + // d) use stream buffer + // e) change locale back to original + // f) destroy new codecvt facet boost::archive::codecvt_null codecvt_null_facet; std::locale archive_locale; + basic_streambuf_locale_saver< + typename IStream::char_type, + typename IStream::traits_type + > locale_saver; #endif template diff --git a/include/boost/archive/basic_text_oprimitive.hpp b/include/boost/archive/basic_text_oprimitive.hpp index 74942bfd..e45002b1 100644 --- a/include/boost/archive/basic_text_oprimitive.hpp +++ b/include/boost/archive/basic_text_oprimitive.hpp @@ -52,9 +52,9 @@ namespace std{ #include #include #include +#include #include #include -#include #include // must be the last header namespace boost { @@ -71,12 +71,19 @@ protected: io::ios_precision_saver precision_saver; #ifndef BOOST_NO_STD_LOCALE + // note order! - if you change this, libstd++ will fail! + // a) create new locale with new codecvt facet + // b) save current locale + // c) change locale to new one + // d) use stream buffer + // e) change locale back to original + // f) destroy new codecvt facet + boost::archive::codecvt_null codecvt_null_facet; + std::locale archive_locale; basic_streambuf_locale_saver< typename OStream::char_type, typename OStream::traits_type > locale_saver; - boost::archive::codecvt_null codecvt_null_facet; - std::locale archive_locale; #endif ///////////////////////////////////////////////////////// diff --git a/include/boost/archive/detail/basic_oarchive.hpp b/include/boost/archive/detail/basic_oarchive.hpp index c379108d..2ec92702 100644 --- a/include/boost/archive/detail/basic_oarchive.hpp +++ b/include/boost/archive/detail/basic_oarchive.hpp @@ -40,7 +40,7 @@ class basic_pointer_oserializer; ////////////////////////////////////////////////////////////////////// // class basic_oarchive - write serialized objects to an output stream -class BOOST_SYMBOL_VISIBLE basic_oarchive : +class BOOST_ARCHIVE_OR_WARCHIVE_DECL basic_oarchive : private boost::noncopyable, public boost::archive::detail::helper_collection { @@ -59,20 +59,20 @@ class BOOST_SYMBOL_VISIBLE basic_oarchive : virtual void vsave(const class_name_type & t) = 0; virtual void vsave(const tracking_type t) = 0; protected: - BOOST_ARCHIVE_DECL basic_oarchive(unsigned int flags = 0); - BOOST_ARCHIVE_DECL boost::archive::detail::helper_collection & + BOOST_ARCHIVE_OR_WARCHIVE_DECL basic_oarchive(unsigned int flags = 0); + BOOST_ARCHIVE_OR_WARCHIVE_DECL boost::archive::detail::helper_collection & get_helper_collection(); - virtual BOOST_ARCHIVE_DECL ~basic_oarchive(); + virtual BOOST_ARCHIVE_OR_WARCHIVE_DECL ~basic_oarchive(); public: // note: NOT part of the public interface - BOOST_ARCHIVE_DECL void register_basic_serializer( + BOOST_ARCHIVE_OR_WARCHIVE_DECL void register_basic_serializer( const basic_oserializer & bos ); - BOOST_ARCHIVE_DECL void save_object( + BOOST_ARCHIVE_OR_WARCHIVE_DECL void save_object( const void *x, const basic_oserializer & bos ); - BOOST_ARCHIVE_DECL void save_pointer( + BOOST_ARCHIVE_OR_WARCHIVE_DECL void save_pointer( const void * t, const basic_pointer_oserializer * bpos_ptr ); @@ -80,9 +80,9 @@ public: vsave(NULL_POINTER_TAG); } // real public interface starts here - BOOST_ARCHIVE_DECL void end_preamble(); // default implementation does nothing - BOOST_ARCHIVE_DECL library_version_type get_library_version() const; - BOOST_ARCHIVE_DECL unsigned int get_flags() const; + BOOST_ARCHIVE_OR_WARCHIVE_DECL void end_preamble(); // default implementation does nothing + BOOST_ARCHIVE_OR_WARCHIVE_DECL library_version_type get_library_version() const; + BOOST_ARCHIVE_OR_WARCHIVE_DECL unsigned int get_flags() const; }; } // namespace detail diff --git a/include/boost/archive/detail/utf8_codecvt_facet.hpp b/include/boost/archive/detail/utf8_codecvt_facet.hpp index b2430d5a..c72402c5 100644 --- a/include/boost/archive/detail/utf8_codecvt_facet.hpp +++ b/include/boost/archive/detail/utf8_codecvt_facet.hpp @@ -7,6 +7,8 @@ #ifndef BOOST_ARCHIVE_DETAIL_UTF8_CODECVT_FACET_HPP #define BOOST_ARCHIVE_DETAIL_UTF8_CODECVT_FACET_HPP +#include + #ifdef BOOST_NO_CXX11_HDR_CODECVT #define BOOST_UTF8_BEGIN_NAMESPACE \ namespace boost { namespace archive { namespace detail { @@ -18,6 +20,11 @@ #undef BOOST_UTF8_END_NAMESPACE #undef BOOST_UTF8_DECL #undef BOOST_UTF8_BEGIN_NAMESPACE +#else + #include + namespace boost { namespace archive { namespace detail { + typedef std::codecvt_utf8 utf8_codecvt_facet; + } } } #endif // BOOST_NO_CXX11_HDR_CODECVT -#endif // BOOST_ARCHIVE_DETAIL_UTF8_CODECVT_FACET_HPP +#endif // BOOST_ARCHIVE_DETAIL_UTF8_CODECVT_FACET_HPP diff --git a/include/boost/archive/impl/basic_binary_iprimitive.ipp b/include/boost/archive/impl/basic_binary_iprimitive.ipp index 43b0146a..6d38c41f 100644 --- a/include/boost/archive/impl/basic_binary_iprimitive.ipp +++ b/include/boost/archive/impl/basic_binary_iprimitive.ipp @@ -148,7 +148,8 @@ basic_binary_iprimitive::basic_binary_iprimitive( #ifndef BOOST_NO_STD_LOCALE m_sb(sb), codecvt_null_facet(1), - archive_locale(sb.getloc(), & codecvt_null_facet) + archive_locale(sb.getloc(), & codecvt_null_facet), + locale_saver(m_sb) { if(! no_codecvt){ m_sb.pubimbue(archive_locale); diff --git a/include/boost/archive/impl/basic_binary_oprimitive.ipp b/include/boost/archive/impl/basic_binary_oprimitive.ipp index 7478d18c..6b574b0d 100644 --- a/include/boost/archive/impl/basic_binary_oprimitive.ipp +++ b/include/boost/archive/impl/basic_binary_oprimitive.ipp @@ -101,7 +101,8 @@ basic_binary_oprimitive::basic_binary_oprimitive( #ifndef BOOST_NO_STD_LOCALE m_sb(sb), codecvt_null_facet(1), - archive_locale(sb.getloc(), & codecvt_null_facet) + archive_locale(sb.getloc(), & codecvt_null_facet), + locale_saver(m_sb) { if(! no_codecvt){ m_sb.pubimbue(archive_locale); @@ -112,6 +113,7 @@ basic_binary_oprimitive::basic_binary_oprimitive( {} #endif +/* // some libraries including stl and libcomo fail if the // buffer isn't flushed before the code_cvt facet is changed. // I think this is a bug. We explicity invoke sync to when @@ -133,21 +135,13 @@ class output_streambuf_access : public std::basic_streambuf { } }; } // detail +*/ // scoped_ptr requires that g be a complete type at time of // destruction so define destructor here rather than in the header template BOOST_ARCHIVE_OR_WARCHIVE_DECL -basic_binary_oprimitive::~basic_binary_oprimitive(){ - // flush buffer - //destructor can't throw - BOOST_TRY{ - static_cast &>(m_sb).sync(); - } - BOOST_CATCH(...){ - } - BOOST_CATCH_END -} +basic_binary_oprimitive::~basic_binary_oprimitive(){} } // namespace archive } // namespace boost diff --git a/include/boost/archive/impl/basic_text_iprimitive.ipp b/include/boost/archive/impl/basic_text_iprimitive.ipp index 69f2e388..a2387f46 100644 --- a/include/boost/archive/impl/basic_text_iprimitive.ipp +++ b/include/boost/archive/impl/basic_text_iprimitive.ipp @@ -8,8 +8,8 @@ // See http://www.boost.org for updates, documentation, and revision history. -#include // size_t -#include // NULL +#include // size_t, NULL +#include // NULL #include #if defined(BOOST_NO_STDC_NAMESPACE) diff --git a/include/boost/archive/impl/xml_wiarchive_impl.ipp b/include/boost/archive/impl/xml_wiarchive_impl.ipp index b808a8ac..1f6fc560 100644 --- a/include/boost/archive/impl/xml_wiarchive_impl.ipp +++ b/include/boost/archive/impl/xml_wiarchive_impl.ipp @@ -157,7 +157,7 @@ xml_wiarchive_impl::xml_wiarchive_impl( ), basic_xml_iarchive(flags), codecvt_utf8_facet(1), - archive_locale(is_.getloc(), & codecvt_utf8_facet), + archive_locale(is_.rdbuf()->getloc(), & codecvt_utf8_facet), gimpl(new xml_wgrammar()) { if(0 == (flags & no_codecvt)){ diff --git a/include/boost/archive/impl/xml_woarchive_impl.ipp b/include/boost/archive/impl/xml_woarchive_impl.ipp index 15e50c83..666defe1 100644 --- a/include/boost/archive/impl/xml_woarchive_impl.ipp +++ b/include/boost/archive/impl/xml_woarchive_impl.ipp @@ -120,13 +120,7 @@ xml_woarchive_impl::xml_woarchive_impl( ), basic_xml_oarchive(flags), codecvt_utf8_facet(1), - archive_locale(os_.getloc(), & codecvt_utf8_facet) -{ - // Standard behavior is that imbue can be called - // a) before output is invoked or - // b) after flush has been called. This prevents one-to-many - // transforms (such as one to many transforms from getting - // mixed up. + archive_locale(os_.rdbuf()->getloc(), & codecvt_utf8_facet){ if(0 == (flags & no_codecvt)){ os.rdbuf()->pubimbue(archive_locale); } diff --git a/include/boost/archive/iterators/mb_from_wchar.hpp b/include/boost/archive/iterators/mb_from_wchar.hpp index 8f5dd7c8..52979565 100644 --- a/include/boost/archive/iterators/mb_from_wchar.hpp +++ b/include/boost/archive/iterators/mb_from_wchar.hpp @@ -26,15 +26,7 @@ namespace std{ using ::mbstate_t; } // namespace std #endif -#ifdef BOOST_NO_CXX11_HDR_CODECVT - #include -#else - #include - namespace boost { namespace archive { namespace detail { - typedef std::codecvt_utf8 utf8_codecvt_facet; - } } } -#endif - +#include #include namespace boost { diff --git a/include/boost/archive/iterators/wchar_from_mb.hpp b/include/boost/archive/iterators/wchar_from_mb.hpp index 526983ce..029e96be 100644 --- a/include/boost/archive/iterators/wchar_from_mb.hpp +++ b/include/boost/archive/iterators/wchar_from_mb.hpp @@ -21,7 +21,6 @@ #include // size_t #include // mbstate_t #include // copy -#include #include #if defined(BOOST_NO_STDC_NAMESPACE) @@ -29,18 +28,11 @@ namespace std{ using ::mbstate_t; } // namespace std #endif -#ifdef BOOST_NO_CXX11_HDR_CODECVT - #include -#else - #include - namespace boost { namespace archive { namespace detail { - typedef std::codecvt_utf8 utf8_codecvt_facet; - } } } -#endif - -#include -#include +#include #include +#include +#include +#include #include diff --git a/include/boost/archive/xml_wiarchive.hpp b/include/boost/archive/xml_wiarchive.hpp index 98fc261c..c576edcb 100644 --- a/include/boost/archive/xml_wiarchive.hpp +++ b/include/boost/archive/xml_wiarchive.hpp @@ -29,15 +29,7 @@ #include #include #include - -#ifdef BOOST_NO_CXX11_HDR_CODECVT - #include -#else - #include - namespace boost { namespace archive { namespace detail { - typedef std::codecvt_utf8 utf8_codecvt_facet; - } } } -#endif +#include #include // must be the last header diff --git a/include/boost/archive/xml_woarchive.hpp b/include/boost/archive/xml_woarchive.hpp index ec4d0816..7cf38dd7 100644 --- a/include/boost/archive/xml_woarchive.hpp +++ b/include/boost/archive/xml_woarchive.hpp @@ -20,7 +20,6 @@ #ifdef BOOST_NO_STD_WSTREAMBUF #error "wide char i/o not supported on this platform" #else - #include // size_t #if defined(BOOST_NO_STDC_NAMESPACE) namespace std{ @@ -36,15 +35,7 @@ namespace std{ #include #include #include - -#ifdef BOOST_NO_CXX11_HDR_CODECVT - #include -#else - #include - namespace boost { namespace archive { namespace detail { - typedef std::codecvt_utf8 utf8_codecvt_facet; - } } } -#endif +#include #include // must be the last header diff --git a/src/utf8_codecvt_facet.cpp b/src/utf8_codecvt_facet.cpp index 9384a02f..c55c7e97 100644 --- a/src/utf8_codecvt_facet.cpp +++ b/src/utf8_codecvt_facet.cpp @@ -5,7 +5,10 @@ #define BOOST_ARCHIVE_SOURCE #include + #include +#include + #ifdef BOOST_NO_STD_WSTREAMBUF #error "wide char i/o not supported on this platform" #else diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index e0cafdea..d92672dc 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -61,8 +61,8 @@ lib dll_polymorphic_derived2_lib test-suite "serialization" : [ test-bsl-run_files test_array : A ] [ test-bsl-run_files test_binary ] - [ test-bsl-run_files test_class_info_load ] [ test-bsl-run_files test_class_info_save ] + [ test-bsl-run_files test_class_info_load ] [ test-bsl-run_files test_bitset ] [ test-bsl-run_files test_complex ] [ test-bsl-run_files test_contained_class : A ] @@ -133,7 +133,7 @@ if ! $(BOOST_ARCHIVE_LIST) { [ test-bsl-run test_reset_object_address : A ] [ test-bsl-run test_void_cast ] [ test-bsl-run test_mult_archive_types ] - [ test-bsl-run test_iterators : : ../build//boost_wserialization ] + [ test-bsl-run test_iterators : : ../build//boost_serialization ] [ test-bsl-run-no-lib test_iterators_base64 ] [ test-bsl-run-no-lib test_inclusion ] diff --git a/test/test_utf8_codecvt.cpp b/test/test_utf8_codecvt.cpp index c06aea02..41d7bbd9 100644 --- a/test/test_utf8_codecvt.cpp +++ b/test/test_utf8_codecvt.cpp @@ -18,6 +18,8 @@ #include #include +#include + #if defined(BOOST_NO_STDC_NAMESPACE) namespace std{ using ::size_t; @@ -41,15 +43,6 @@ namespace std{ #include "test_tools.hpp" -#ifndef BOOST_NO_CXX11_HDR_CODECVT - #include - namespace boost { namespace archive { namespace detail { - typedef std::codecvt_utf8 utf8_codecvt_facet; - } } } -#else - #include -#endif - template struct test_data {