diff options
Diffstat (limited to 'TAO/TAO_IDL')
-rw-r--r-- | TAO/TAO_IDL/ast/ast_union.cpp | 62 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_helper.cpp | 2 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_union_branch.cpp | 9 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_union/discriminant_ci.cpp | 7 | ||||
-rw-r--r-- | TAO/TAO_IDL/be_include/be_helper.h | 2 | ||||
-rw-r--r-- | TAO/TAO_IDL/include/ast_union.h | 3 |
6 files changed, 60 insertions, 25 deletions
diff --git a/TAO/TAO_IDL/ast/ast_union.cpp b/TAO/TAO_IDL/ast/ast_union.cpp index 3aec9e1b973..cdb1bb87de7 100644 --- a/TAO/TAO_IDL/ast/ast_union.cpp +++ b/TAO/TAO_IDL/ast/ast_union.cpp @@ -157,6 +157,12 @@ AST_Union::AST_Union (AST_ConcreteType *dt, case AST_PredefinedType::PT_ulong: this->pd_udisc_type = AST_Expression::EV_ulong; break; + case AST_PredefinedType::PT_longlong: + this->pd_udisc_type = AST_Expression::EV_longlong; + break; + case AST_PredefinedType::PT_ulonglong: + this->pd_udisc_type = AST_Expression::EV_ulonglong; + break; case AST_PredefinedType::PT_short: this->pd_udisc_type = AST_Expression::EV_short; break; @@ -523,7 +529,12 @@ AST_Union::compute_default_value (void) // values of the discriminant type are covered by the cases. // Compute the total true "case" labels i.e., exclude the "default" case. - int total_case_members = 0; + ACE_UINT64 total_case_members = 0; + + // In the case of a (unsigned) long long discriminant being fully used + // the total case count would actually overflow back to zero. + // This is 'end of days' programming but what the heck. We're here now. + bool first_case_found = false; // Instantiate a scope iterator. for (UTL_ScopeActiveIterator si (this, UTL_Scope::IK_decls); @@ -542,6 +553,7 @@ AST_Union::compute_default_value (void) if (ub->label (i)->label_kind () == AST_UnionLabel::UL_label) { ++total_case_members; + first_case_found = true; } } } @@ -566,7 +578,7 @@ AST_Union::compute_default_value (void) break; case AST_Expression::EV_long: case AST_Expression::EV_ulong: - if ((unsigned int) total_case_members > ACE_UINT32_MAX) + if (total_case_members > ACE_UINT32_MAX) { this->default_value_.computed_ = 0; } @@ -574,17 +586,13 @@ AST_Union::compute_default_value (void) break; case AST_Expression::EV_longlong: case AST_Expression::EV_ulonglong: - // Error for now. - this->default_value_.computed_ = -1; - ACE_ERROR_RETURN (( - LM_ERROR, - ACE_TEXT ("(%N:%l) AST_Union::compute_default_value ") - ACE_TEXT ("- unimplemented discriminant type ") - ACE_TEXT ("(longlong or ulonglong)\n") - ), - -1 - ); - ACE_NOTREACHED (break;) + // We would wrap to 0 here - we are using a 64 bit count + if (first_case_found && total_case_members == 0) + { + // If anyone ever produces a "default clause is invalid here" error + // after passing through here I will buy them a a house. + this->default_value_.computed_ = 0; + } case AST_Expression::EV_char: if (total_case_members == ACE_OCTET_MAX + 1) { @@ -621,7 +629,7 @@ AST_Union::compute_default_value (void) if (en != 0) { - if (total_case_members == en->member_count ()) + if (total_case_members == (ACE_UINT64) en->member_count ()) { this->default_value_.computed_ = 0; } @@ -706,8 +714,11 @@ AST_Union::compute_default_value (void) this->default_value_.u.enum_val = 0; break; case AST_Expression::EV_longlong: + this->default_value_.u.longlong_val = 0; + break; case AST_Expression::EV_ulonglong: - // Unimplemented. + this->default_value_.u.ulonglong_val = 0; + break; default: // Error caught earlier. break; @@ -833,8 +844,27 @@ AST_Union::compute_default_value (void) break; case AST_Expression::EV_longlong: +#if ! defined (ACE_LACKS_LONGLONG_T) + if (this->default_value_.u.longlong_val + == expr->ev ()->u.llval) + { + this->default_value_.u.longlong_val++; + break_loop = 1; + } + + break; +#endif case AST_Expression::EV_ulonglong: - // Unimplemented. right now - flag as error. +#if ! defined (ACE_LACKS_LONGLONG_T) + if (this->default_value_.u.ulonglong_val + == expr->ev ()->u.ullval) + { + this->default_value_.u.ulonglong_val++; + break_loop = 1; + } + + break; +#endif default: // Error. break; diff --git a/TAO/TAO_IDL/be/be_helper.cpp b/TAO/TAO_IDL/be/be_helper.cpp index 6b6518a7d38..a4aa5c1b5aa 100644 --- a/TAO/TAO_IDL/be/be_helper.cpp +++ b/TAO/TAO_IDL/be/be_helper.cpp @@ -361,7 +361,6 @@ TAO_OutStream::operator<< (const ACE_CDR::Long num) return *this; } -#if defined (ACE_WIN64) TAO_OutStream & TAO_OutStream::operator<< (const ACE_CDR::ULongLong num) { @@ -381,7 +380,6 @@ TAO_OutStream::operator<< (const ACE_CDR::LongLong num) return *this; } -#endif /* ACE_WIN64 */ TAO_OutStream & TAO_OutStream::operator<< (const unsigned long num) diff --git a/TAO/TAO_IDL/be/be_union_branch.cpp b/TAO/TAO_IDL/be/be_union_branch.cpp index 61f8e53f79d..aab57f0735c 100644 --- a/TAO/TAO_IDL/be/be_union_branch.cpp +++ b/TAO/TAO_IDL/be/be_union_branch.cpp @@ -28,8 +28,8 @@ #include "ast_union_label.h" #include "ace/Log_Msg.h" -ACE_RCSID (be, - be_union_branch, +ACE_RCSID (be, + be_union_branch, "$Id$") be_union_branch::be_union_branch (void) @@ -171,8 +171,11 @@ be_union_branch::gen_default_label_value (TAO_OutStream *os, break; } case AST_Expression::EV_longlong: + *os << dv.u.longlong_val; + break; case AST_Expression::EV_ulonglong: - // Unimplemented. + *os << dv.u.ulonglong_val; + break; default: // Error caught earlier. ACE_ERROR_RETURN ((LM_ERROR, diff --git a/TAO/TAO_IDL/be/be_visitor_union/discriminant_ci.cpp b/TAO/TAO_IDL/be/be_visitor_union/discriminant_ci.cpp index 2d3c9e0f119..1b5c70a3a50 100644 --- a/TAO/TAO_IDL/be/be_visitor_union/discriminant_ci.cpp +++ b/TAO/TAO_IDL/be/be_visitor_union/discriminant_ci.cpp @@ -205,8 +205,13 @@ be_visitor_union_discriminant_ci::visit_predefined_type ( break; case AST_Expression::EV_longlong: + *os << dv.u.longlong_val; + + break; case AST_Expression::EV_ulonglong: - // Unimplemented. + *os << dv.u.ulonglong_val; + + break; default: // Error caught earlier. ACE_ERROR_RETURN ((LM_ERROR, diff --git a/TAO/TAO_IDL/be_include/be_helper.h b/TAO/TAO_IDL/be_include/be_helper.h index 5e1084712e2..458380ad543 100644 --- a/TAO/TAO_IDL/be_include/be_helper.h +++ b/TAO/TAO_IDL/be_include/be_helper.h @@ -175,13 +175,11 @@ public: TAO_OutStream &operator<< (const ACE_CDR::Long num); // output the integer and return a reference to ourselves -#if defined (ACE_WIN64) TAO_OutStream &operator<< (const ACE_CDR::ULongLong num); // output the integer and return a reference to ourselves TAO_OutStream &operator<< (const ACE_CDR::LongLong num); // output the integer and return a reference to ourselves -#endif /* ACE_WIN64 */ TAO_OutStream &operator<< (const unsigned long num); // output the integer and return a reference to ourselves diff --git a/TAO/TAO_IDL/include/ast_union.h b/TAO/TAO_IDL/include/ast_union.h index 40678e24f23..0db54351bd7 100644 --- a/TAO/TAO_IDL/include/ast_union.h +++ b/TAO/TAO_IDL/include/ast_union.h @@ -122,7 +122,8 @@ public: ACE_INT32 long_val; ACE_UINT32 ulong_val; ACE_UINT32 enum_val; - // TO-DO - handle (u)longlong types. + ACE_INT64 longlong_val; + ACE_UINT64 ulonglong_val; } u; long computed_; // computed == -1 => error condition |