From 03c9b478259814e3fe1cf5ceaca6bd1c0167b23b Mon Sep 17 00:00:00 2001 From: Chris Glover Date: Sat, 20 Feb 2016 20:14:41 -0500 Subject: [PATCH 1/2] Replace try/catch with macros from no_exceptions_support so that property can be used in environments without exceptions. --- .../property_tree/detail/info_parser_read.hpp | 13 ++++++++-- .../boost/property_tree/detail/rapidxml.hpp | 2 +- .../detail/xml_parser_read_rapidxml.hpp | 13 ++++++++-- include/boost/property_tree/info_parser.hpp | 11 +++++--- include/boost/property_tree/ini_parser.hpp | 26 ++++++++++++++++--- 5 files changed, 52 insertions(+), 13 deletions(-) diff --git a/include/boost/property_tree/detail/info_parser_read.hpp b/include/boost/property_tree/detail/info_parser_read.hpp index 87ef2cd489..c3446b4ce3 100644 --- a/include/boost/property_tree/detail/info_parser_read.hpp +++ b/include/boost/property_tree/detail/info_parser_read.hpp @@ -13,6 +13,8 @@ #include "boost/property_tree/ptree.hpp" #include "boost/property_tree/detail/info_parser_error.hpp" #include "boost/property_tree/detail/info_parser_utils.hpp" +#include "boost/core/ignore_unused.hpp" +#include "boost/core/no_exceptions_support.hpp" #include #include #include @@ -210,7 +212,13 @@ namespace boost { namespace property_tree { namespace info_parser std::stack stack; stack.push(&pt); // Push root ptree on stack initially - try { + // When compiling without exception support there is no formal + // parameter "e" in the catch handler. Declaring a local variable + // here does not hurt and will be "used" to make the code in the + // handler compilable although the code will never be executed. + info_parser_error e("", "", 0); ignore_unused(e); + + BOOST_TRY { // While there are characters in the stream while (stream.good()) { // Read one line from stream @@ -372,7 +380,7 @@ namespace boost { namespace property_tree { namespace info_parser BOOST_PROPERTY_TREE_THROW(info_parser_error("unmatched {", "", 0)); } - catch (info_parser_error &e) + BOOST_CATCH (info_parser_error &e) { // If line undefined rethrow error with correct filename and line if (e.line() == 0) @@ -383,6 +391,7 @@ namespace boost { namespace property_tree { namespace info_parser BOOST_PROPERTY_TREE_THROW(e); } + BOOST_CATCH_END } diff --git a/include/boost/property_tree/detail/rapidxml.hpp b/include/boost/property_tree/detail/rapidxml.hpp index 9e3d76af9d..e890feb18a 100644 --- a/include/boost/property_tree/detail/rapidxml.hpp +++ b/include/boost/property_tree/detail/rapidxml.hpp @@ -28,7 +28,7 @@ #include // For std::exception -#define BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR(what, where) throw parse_error(what, where) +#define BOOST_PROPERTY_TREE_RAPIDXML_PARSE_ERROR(what, where) boost::throw_exception(parse_error(what, where)) namespace boost { namespace property_tree { namespace detail {namespace rapidxml { diff --git a/include/boost/property_tree/detail/xml_parser_read_rapidxml.hpp b/include/boost/property_tree/detail/xml_parser_read_rapidxml.hpp index 9c04219189..a6b005a75a 100644 --- a/include/boost/property_tree/detail/xml_parser_read_rapidxml.hpp +++ b/include/boost/property_tree/detail/xml_parser_read_rapidxml.hpp @@ -15,6 +15,8 @@ #include #include #include +#include +#include #include namespace boost { namespace property_tree { namespace xml_parser @@ -101,7 +103,13 @@ namespace boost { namespace property_tree { namespace xml_parser xml_parser_error("read error", filename, 0)); v.push_back(0); // zero-terminate - try { + // When compiling without exception support there is no formal + // parameter "e" in the catch handler. Declaring a local variable + // here does not hurt and will be "used" to make the code in the + // handler compilable although the code will never be executed. + parse_error e(NULL, NULL); ignore_unused(e); + + BOOST_TRY { // Parse using appropriate flags const int f_tws = parse_normalize_whitespace | parse_trim_whitespace; @@ -131,12 +139,13 @@ namespace boost { namespace property_tree { namespace xml_parser // Swap local and result ptrees pt.swap(local); - } catch (parse_error &e) { + } BOOST_CATCH (parse_error &e) { long line = static_cast( std::count(&v.front(), e.where(), Ch('\n')) + 1); BOOST_PROPERTY_TREE_THROW( xml_parser_error(e.what(), filename, line)); } + BOOST_CATCH_END } } } } diff --git a/include/boost/property_tree/info_parser.hpp b/include/boost/property_tree/info_parser.hpp index 683ddad46d..abdc8a3afb 100644 --- a/include/boost/property_tree/info_parser.hpp +++ b/include/boost/property_tree/info_parser.hpp @@ -15,6 +15,7 @@ #include #include #include +#include #include namespace boost { namespace property_tree { namespace info_parser @@ -43,11 +44,12 @@ namespace boost { namespace property_tree { namespace info_parser void read_info(std::basic_istream &stream, Ptree &pt, const Ptree &default_ptree) { - try { + BOOST_TRY { read_info(stream, pt); - } catch(file_parser_error &) { + } BOOST_CATCH(file_parser_error &) { pt = default_ptree; } + BOOST_CATCH_END } /** @@ -87,11 +89,12 @@ namespace boost { namespace property_tree { namespace info_parser const Ptree &default_ptree, const std::locale &loc = std::locale()) { - try { + BOOST_TRY { read_info(filename, pt, loc); - } catch(file_parser_error &) { + } BOOST_CATCH(file_parser_error &) { pt = default_ptree; } + BOOST_CATCH_END } /** diff --git a/include/boost/property_tree/ini_parser.hpp b/include/boost/property_tree/ini_parser.hpp index 50d3c97f6a..5142dbfee7 100644 --- a/include/boost/property_tree/ini_parser.hpp +++ b/include/boost/property_tree/ini_parser.hpp @@ -14,6 +14,8 @@ #include #include #include +#include +#include #include #include #include @@ -165,13 +167,21 @@ namespace boost { namespace property_tree { namespace ini_parser BOOST_PROPERTY_TREE_THROW(ini_parser_error( "cannot open file", filename, 0)); stream.imbue(loc); - try { + + // When compiling without exception support there is no formal + // parameter "e" in the catch handler. Declaring a local variable + // here does not hurt and will be "used" to make the code in the + // handler compilable although the code will never be executed. + ini_parser_error e("", "", 0); ignore_unused(e); + + BOOST_TRY { read_ini(stream, pt); } - catch (ini_parser_error &e) { + BOOST_CATCH (ini_parser_error &e) { BOOST_PROPERTY_TREE_THROW(ini_parser_error( e.message(), filename, e.line())); } + BOOST_CATCH_END } namespace detail @@ -313,13 +323,21 @@ namespace boost { namespace property_tree { namespace ini_parser BOOST_PROPERTY_TREE_THROW(ini_parser_error( "cannot open file", filename, 0)); stream.imbue(loc); - try { + + // When compiling without exception support there is no formal + // parameter "e" in the catch handler. Declaring a local variable + // here does not hurt and will be "used" to make the code in the + // handler compilable although the code will never be executed. + ini_parser_error e("", "", 0); ignore_unused(e); + + BOOST_TRY { write_ini(stream, pt, flags); } - catch (ini_parser_error &e) { + BOOST_CATCH (ini_parser_error &e) { BOOST_PROPERTY_TREE_THROW(ini_parser_error( e.message(), filename, e.line())); } + BOOST_CATCH_END } } } } From 69bfcb050fb5b546e2f055a64db3cbd6f37b2c8d Mon Sep 17 00:00:00 2001 From: Chris Glover Date: Sun, 21 Feb 2016 21:35:01 -0500 Subject: [PATCH 2/2] Remove the unused fake exception variable and use a simple ifdef in the else case instead. --- .../property_tree/detail/info_parser_read.hpp | 10 ++-------- .../detail/xml_parser_read_rapidxml.hpp | 9 ++------- include/boost/property_tree/ini_parser.hpp | 17 ++++------------- 3 files changed, 8 insertions(+), 28 deletions(-) diff --git a/include/boost/property_tree/detail/info_parser_read.hpp b/include/boost/property_tree/detail/info_parser_read.hpp index c3446b4ce3..b46643ab2b 100644 --- a/include/boost/property_tree/detail/info_parser_read.hpp +++ b/include/boost/property_tree/detail/info_parser_read.hpp @@ -13,7 +13,6 @@ #include "boost/property_tree/ptree.hpp" #include "boost/property_tree/detail/info_parser_error.hpp" #include "boost/property_tree/detail/info_parser_utils.hpp" -#include "boost/core/ignore_unused.hpp" #include "boost/core/no_exceptions_support.hpp" #include #include @@ -212,12 +211,6 @@ namespace boost { namespace property_tree { namespace info_parser std::stack stack; stack.push(&pt); // Push root ptree on stack initially - // When compiling without exception support there is no formal - // parameter "e" in the catch handler. Declaring a local variable - // here does not hurt and will be "used" to make the code in the - // handler compilable although the code will never be executed. - info_parser_error e("", "", 0); ignore_unused(e); - BOOST_TRY { // While there are characters in the stream while (stream.good()) { @@ -382,6 +375,7 @@ namespace boost { namespace property_tree { namespace info_parser } BOOST_CATCH (info_parser_error &e) { + #ifndef BOOST_NO_EXCEPTIONS // If line undefined rethrow error with correct filename and line if (e.line() == 0) { @@ -389,7 +383,7 @@ namespace boost { namespace property_tree { namespace info_parser } else BOOST_PROPERTY_TREE_THROW(e); - + #endif } BOOST_CATCH_END diff --git a/include/boost/property_tree/detail/xml_parser_read_rapidxml.hpp b/include/boost/property_tree/detail/xml_parser_read_rapidxml.hpp index a6b005a75a..b6f5820402 100644 --- a/include/boost/property_tree/detail/xml_parser_read_rapidxml.hpp +++ b/include/boost/property_tree/detail/xml_parser_read_rapidxml.hpp @@ -15,7 +15,6 @@ #include #include #include -#include #include #include @@ -103,12 +102,6 @@ namespace boost { namespace property_tree { namespace xml_parser xml_parser_error("read error", filename, 0)); v.push_back(0); // zero-terminate - // When compiling without exception support there is no formal - // parameter "e" in the catch handler. Declaring a local variable - // here does not hurt and will be "used" to make the code in the - // handler compilable although the code will never be executed. - parse_error e(NULL, NULL); ignore_unused(e); - BOOST_TRY { // Parse using appropriate flags const int f_tws = parse_normalize_whitespace @@ -140,10 +133,12 @@ namespace boost { namespace property_tree { namespace xml_parser // Swap local and result ptrees pt.swap(local); } BOOST_CATCH (parse_error &e) { + #ifndef BOOST_NO_EXCEPTIONS long line = static_cast( std::count(&v.front(), e.where(), Ch('\n')) + 1); BOOST_PROPERTY_TREE_THROW( xml_parser_error(e.what(), filename, line)); + #endif } BOOST_CATCH_END } diff --git a/include/boost/property_tree/ini_parser.hpp b/include/boost/property_tree/ini_parser.hpp index 5142dbfee7..cb63fcc5f0 100644 --- a/include/boost/property_tree/ini_parser.hpp +++ b/include/boost/property_tree/ini_parser.hpp @@ -14,7 +14,6 @@ #include #include #include -#include #include #include #include @@ -168,18 +167,14 @@ namespace boost { namespace property_tree { namespace ini_parser "cannot open file", filename, 0)); stream.imbue(loc); - // When compiling without exception support there is no formal - // parameter "e" in the catch handler. Declaring a local variable - // here does not hurt and will be "used" to make the code in the - // handler compilable although the code will never be executed. - ini_parser_error e("", "", 0); ignore_unused(e); - BOOST_TRY { read_ini(stream, pt); } BOOST_CATCH (ini_parser_error &e) { + #ifndef BOOST_NO_EXCEPTIONS BOOST_PROPERTY_TREE_THROW(ini_parser_error( e.message(), filename, e.line())); + #endif } BOOST_CATCH_END } @@ -324,18 +319,14 @@ namespace boost { namespace property_tree { namespace ini_parser "cannot open file", filename, 0)); stream.imbue(loc); - // When compiling without exception support there is no formal - // parameter "e" in the catch handler. Declaring a local variable - // here does not hurt and will be "used" to make the code in the - // handler compilable although the code will never be executed. - ini_parser_error e("", "", 0); ignore_unused(e); - BOOST_TRY { write_ini(stream, pt, flags); } BOOST_CATCH (ini_parser_error &e) { + #ifndef BOOST_NO_EXCEPTIONS BOOST_PROPERTY_TREE_THROW(ini_parser_error( e.message(), filename, e.line())); + #endif } BOOST_CATCH_END }