Simple hack around assigning return category flags, tests pass in debug, fail on pointer argument passing in release mode
parent
ab7655e5eb
commit
2f44bc0a1a
|
@ -217,21 +217,27 @@ void Module::parseMarkup(const std::string& data) {
|
|||
|
||||
Rule namespace_ret_p = namespace_name_p[push_back_a(namespaces_return)] >> str_p("::");
|
||||
|
||||
// Rule returnType1_p =
|
||||
// (basisType_p[assign_a(retVal.type1)][assign_a(retVal.category1, ReturnValue::BASIS)]) |
|
||||
// ((*namespace_ret_p)[assign_a(retVal.namespaces1, namespaces_return)][clear_a(namespaces_return)]
|
||||
// >> (className_p[assign_a(retVal.type1)][assign_a(retVal.category1, ReturnValue::CLASS)]) >>
|
||||
// !ch_p('*')[assign_a(retVal.isPtr1,true)]) |
|
||||
// (eigenType_p[assign_a(retVal.type1)][assign_a(retVal.category1, ReturnValue::EIGEN)])
|
||||
// | str_p("void")[assign_a(retVal.type1)][assign_a(retVal.category1, ReturnValue::VOID)]; // FIXME: allows for void in a pair
|
||||
// const values
|
||||
static const ReturnValue::return_category RETURN_EIGEN = ReturnValue::EIGEN;
|
||||
static const ReturnValue::return_category RETURN_BASIS = ReturnValue::BASIS;
|
||||
static const ReturnValue::return_category RETURN_CLASS = ReturnValue::CLASS;
|
||||
static const ReturnValue::return_category RETURN_VOID = ReturnValue::VOID;
|
||||
|
||||
// current revision
|
||||
// alternate version 1
|
||||
// Rule returnType1_p =
|
||||
// basisType_p[assign_a(retVal.category1, ReturnValue::BASIS)][assign_a(retVal.type1)] |
|
||||
// eigenType_p[assign_a(retVal.category1, ReturnValue::EIGEN)][assign_a(retVal.type1)] |
|
||||
// ((*namespace_ret_p)[assign_a(retVal.namespaces1, namespaces_return)][clear_a(namespaces_return)]
|
||||
// >> (className_p[assign_a(retVal.category1, ReturnValue::CLASS)][assign_a(retVal.type1)]) >>
|
||||
// !ch_p('*')[assign_a(retVal.isPtr1,true)]);
|
||||
|
||||
// switching to using constants
|
||||
Rule returnType1_p =
|
||||
basisType_p[assign_a(retVal.category1, ReturnValue::BASIS)][assign_a(retVal.type1)] |
|
||||
(basisType_p[assign_a(retVal.type1)][assign_a(retVal.category1, RETURN_BASIS)]) |
|
||||
((*namespace_ret_p)[assign_a(retVal.namespaces1, namespaces_return)][clear_a(namespaces_return)]
|
||||
>> (className_p[assign_a(retVal.category1, ReturnValue::CLASS)][assign_a(retVal.type1)]) >>
|
||||
!ch_p('*')[assign_a(retVal.isPtr1,true)]) |
|
||||
eigenType_p[assign_a(retVal.category1, ReturnValue::EIGEN)][assign_a(retVal.type1)];
|
||||
>> (className_p[assign_a(retVal.type1)][assign_a(retVal.category1, RETURN_CLASS)]) >>
|
||||
!ch_p('*')[assign_a(retVal.isPtr1,true)]) |
|
||||
(eigenType_p[assign_a(retVal.type1)][assign_a(retVal.category1, RETURN_EIGEN)]);
|
||||
|
||||
// Original
|
||||
// Rule returnType1_p =
|
||||
|
@ -240,22 +246,29 @@ void Module::parseMarkup(const std::string& data) {
|
|||
// >> (className_p[assign_a(retVal.type1)][assign_a(retVal.category1, ReturnValue::CLASS)]) >>
|
||||
// !ch_p('*')[assign_a(retVal.isPtr1,true)]) |
|
||||
// (eigenType_p[assign_a(retVal.type1)][assign_a(retVal.category1, ReturnValue::EIGEN)]);
|
||||
|
||||
|
||||
Rule returnType2_p =
|
||||
(basisType_p[assign_a(retVal.type2)][assign_a(retVal.category2, ReturnValue::BASIS)]) |
|
||||
(basisType_p[assign_a(retVal.type2)][assign_a(retVal.category2, RETURN_BASIS)]) |
|
||||
((*namespace_ret_p)[assign_a(retVal.namespaces2, namespaces_return)][clear_a(namespaces_return)]
|
||||
>> (className_p[assign_a(retVal.type2)][assign_a(retVal.category2, ReturnValue::CLASS)]) >>
|
||||
>> (className_p[assign_a(retVal.type2)][assign_a(retVal.category2, RETURN_CLASS)]) >>
|
||||
!ch_p('*') [assign_a(retVal.isPtr2,true)]) |
|
||||
(eigenType_p[assign_a(retVal.type2)][assign_a(retVal.category2, ReturnValue::EIGEN)]);
|
||||
(eigenType_p[assign_a(retVal.type2)][assign_a(retVal.category2, RETURN_EIGEN)]);
|
||||
|
||||
// Original
|
||||
// Rule returnType2_p =
|
||||
// (basisType_p[assign_a(retVal.type2)][assign_a(retVal.category2, ReturnValue::BASIS)]) |
|
||||
// ((*namespace_ret_p)[assign_a(retVal.namespaces2, namespaces_return)][clear_a(namespaces_return)]
|
||||
// >> (className_p[assign_a(retVal.type2)][assign_a(retVal.category2, ReturnValue::CLASS)]) >>
|
||||
// !ch_p('*') [assign_a(retVal.isPtr2,true)]) |
|
||||
// (eigenType_p[assign_a(retVal.type2)][assign_a(retVal.category2, ReturnValue::EIGEN)]);
|
||||
|
||||
Rule pair_p =
|
||||
(str_p("pair") >> '<' >> returnType1_p >> ',' >> returnType2_p >> '>')
|
||||
[assign_a(retVal.isPair,true)];
|
||||
|
||||
Rule void_p = str_p("void")[assign_a(retVal.type1)][assign_a(retVal.category1, ReturnValue::VOID)];
|
||||
Rule void_p = str_p("void")[assign_a(retVal.type1)][assign_a(retVal.category1, RETURN_VOID)];
|
||||
|
||||
Rule returnType_p = void_p | returnType1_p | pair_p; // original
|
||||
// Rule returnType_p = returnType1_p | pair_p;
|
||||
Rule returnType_p = void_p | returnType1_p | pair_p;
|
||||
|
||||
Rule methodName_p = lexeme_d[lower_p >> *(alnum_p | '_')];
|
||||
|
||||
|
|
|
@ -55,12 +55,6 @@ void ReturnValue::wrap_result(const string& result, FileWriter& file, const Type
|
|||
// For a pair, store the returned pair so we do not evaluate the function twice
|
||||
file.oss << " " << return_type(false, pair) << " pairResult = " << result << ";\n";
|
||||
|
||||
// sanity check values
|
||||
if ((category1 != ReturnValue::CLASS) || (category1 != ReturnValue::EIGEN) || (category1 != ReturnValue::BASIS))
|
||||
throw invalid_argument("ReturnValue::wrap_result() FAILURE: invalid first member of pair ");
|
||||
if ((category2 != ReturnValue::CLASS) || (category2 != ReturnValue::EIGEN) || (category2 != ReturnValue::BASIS))
|
||||
throw invalid_argument("ReturnValue::wrap_result() FAILURE: invalid second member of pair ");
|
||||
|
||||
// first return value in pair
|
||||
if (category1 == ReturnValue::CLASS) { // if we are going to make one
|
||||
string objCopy, ptrType;
|
||||
|
@ -107,9 +101,6 @@ void ReturnValue::wrap_result(const string& result, FileWriter& file, const Type
|
|||
} else
|
||||
file.oss << " out[1] = wrap< " << return_type(true,arg2) << " >(pairResult.second);\n";
|
||||
} else { // Not a pair
|
||||
// sanity check values
|
||||
if ((category1 != ReturnValue::CLASS) || (category1 != ReturnValue::EIGEN) || (category1 != ReturnValue::BASIS))
|
||||
throw invalid_argument("ReturnValue::wrap_result() FAILURE: return non-void flag ");
|
||||
|
||||
if (category1 == ReturnValue::CLASS) {
|
||||
string objCopy, ptrType;
|
||||
|
|
|
@ -24,13 +24,12 @@ struct ReturnValue {
|
|||
CLASS = 1,
|
||||
EIGEN = 2,
|
||||
BASIS = 3,
|
||||
VOID = 4,
|
||||
DUMMY_CATEGORY = 5
|
||||
VOID = 4
|
||||
} return_category;
|
||||
|
||||
ReturnValue(bool enable_verbosity = true)
|
||||
: verbose(enable_verbosity), isPtr1(false), isPtr2(false),
|
||||
isPair(false), category1(DUMMY_CATEGORY), category2(DUMMY_CATEGORY)
|
||||
isPair(false), category1(CLASS), category2(CLASS)
|
||||
{}
|
||||
|
||||
bool verbose;
|
||||
|
|
Loading…
Reference in New Issue