From 21d62f0a96b7c01fb1c19fc49ca38bafbf665a29 Mon Sep 17 00:00:00 2001 From: theoreticalbts Date: Fri, 26 Aug 2016 16:27:16 -0400 Subject: [PATCH] Throw when deserializing an integer into a value not in enum --- include/fc/reflect/reflect.hpp | 21 ++++++++++++--------- include/fc/reflect/variant.hpp | 4 ++-- 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/include/fc/reflect/reflect.hpp b/include/fc/reflect/reflect.hpp index daab9c5..075ce80 100644 --- a/include/fc/reflect/reflect.hpp +++ b/include/fc/reflect/reflect.hpp @@ -148,6 +148,17 @@ template<> struct reflector { \ static fc::string to_fc_string(int64_t i) { \ return to_fc_string(ENUM(i)); \ } \ + static ENUM from_int(int64_t i) { \ + ENUM e = ENUM(i); \ + switch( e ) \ + { \ + BOOST_PP_SEQ_FOR_EACH( FC_REFLECT_ENUM_FROM_STRING_CASE, ENUM, FIELDS ) \ + break; \ + default: \ + fc::throw_bad_enum_cast( i, BOOST_PP_STRINGIZE(ENUM) ); \ + } \ + return e;\ + } \ static ENUM from_string( const char* s ) { \ BOOST_PP_SEQ_FOR_EACH( FC_REFLECT_ENUM_FROM_STRING, ENUM, FIELDS ) \ int64_t i; \ @@ -159,15 +170,7 @@ template<> struct reflector { \ { \ fc::throw_bad_enum_cast( s, BOOST_PP_STRINGIZE(ENUM) ); \ } \ - ENUM e = ENUM(i); \ - switch( e ) \ - { \ - BOOST_PP_SEQ_FOR_EACH( FC_REFLECT_ENUM_FROM_STRING_CASE, ENUM, FIELDS ) \ - break; \ - default: \ - fc::throw_bad_enum_cast( s, BOOST_PP_STRINGIZE(ENUM) ); \ - } \ - return e;\ + return from_int(i); \ } \ }; \ } diff --git a/include/fc/reflect/variant.hpp b/include/fc/reflect/variant.hpp index f48fe9a..31bbbdf 100644 --- a/include/fc/reflect/variant.hpp +++ b/include/fc/reflect/variant.hpp @@ -88,8 +88,8 @@ namespace fc { if( v.is_string() ) o = fc::reflector::from_string( v.get_string().c_str() ); - else - o = static_cast(v.as_int64()); + else + o = fc::reflector::from_int( v.as_int64() ); } };