diff options
Diffstat (limited to 'TAO/TAO_IDL/be/be_union_branch.cpp')
-rw-r--r-- | TAO/TAO_IDL/be/be_union_branch.cpp | 101 |
1 files changed, 97 insertions, 4 deletions
diff --git a/TAO/TAO_IDL/be/be_union_branch.cpp b/TAO/TAO_IDL/be/be_union_branch.cpp index 2328d31b26d..3a74fe1a90e 100644 --- a/TAO/TAO_IDL/be/be_union_branch.cpp +++ b/TAO/TAO_IDL/be/be_union_branch.cpp @@ -33,14 +33,107 @@ be_union_branch::be_union_branch (void) { } -be_union_branch::be_union_branch (UTL_LabelList *ll, AST_Type *ft, +be_union_branch::be_union_branch (AST_UnionLabel *lab, AST_Type *ft, UTL_ScopedName *n, UTL_StrList *p) - : AST_UnionBranch (ll, ft, n, p), + : AST_UnionBranch (lab, ft, n, p), AST_Field (AST_Decl::NT_union_branch, ft, n, p), AST_Decl (AST_Decl::NT_union_branch, n, p) { } +int +be_union_branch::gen_encapsulation (void) +{ + TAO_OutStream *cs; // output stream + TAO_NL nl; // end line + TAO_CodeGen *cg = TAO_CODEGEN::instance (); + be_type *bt; // our type node + long i, arrlen; + ACE_UINT32 *arr; + + cs = cg->client_stubs (); + + *cs << be_nl; + + // be_union* the_union = + // be_union::narrow_from_scope (this->defined_in ()); + + ACE_UINT32 buf[1]; + ACE_OS::memset (buf, 0, sizeof (buf)); + + // emit the case label value + AST_Expression *expression = this->label ()->label_val (); + AST_Expression::AST_ExprValue *ev = expression->ev (); + switch (ev->et) // the_union->udisc_type ()) + { + case AST_Expression::EV_char: + case AST_Expression::EV_bool: + cs->print ("ACE_IDL_NCTOHL (0x%02.2x)", (unsigned char)ev->u.cval); + break; + + case AST_Expression::EV_wchar: + case AST_Expression::EV_short: + case AST_Expression::EV_ushort: + cs->print ("ACE_IDL_NSTOHL (0x%04.4x)", (unsigned short)ev->u.sval); + break; + + case AST_Expression::EV_long: + case AST_Expression::EV_ulonglong: + *cs << expression; + break; + + default: + if (expression->ec () == AST_Expression::EC_symbol) + { + *cs << expression; + } + else + { + ACE_ERROR_RETURN ((LM_DEBUG, + "be_union_branch: (%N:%l) Label value " + "type (%d) is invalid\n", ev->et), -1); + } + break; + } + + *cs << ", // union case label (evaluated)" << nl; + // emit name + *cs << (ACE_OS::strlen (this->local_name ()->get_string ())+1) << ", "; + (void)this->tc_name2long(this->local_name ()->get_string (), arr, arrlen); + for (i=0; i < arrlen; i++) + { + cs->print ("ACE_NTOHL (0x%x), ", arr[i]); + } + *cs << " // name = " << this->local_name () << "\n"; + + // hand over code generation to our type node + bt = be_type::narrow_from_decl (this->field_type ()); + if (!bt) + return -1; + return bt->gen_typecode (); +} + +long +be_union_branch::tc_encap_len (void) +{ + if (this->encap_len_ == -1) + { + be_type *bt; + + this->encap_len_ = 4; // case label; + this->encap_len_ += this->name_encap_len (); // for name + bt = be_type::narrow_from_decl (this->field_type ()); + if (!bt) + { + ACE_ERROR ((LM_ERROR, "be_union_branch: bad field type\n")); + return -1; + } + this->encap_len_ += bt->tc_size (); // note that we add the typecode size + // of the type + } + return this->encap_len_; +} + // compute the size type of the node in question int be_union_branch::compute_size_type (void) @@ -60,9 +153,9 @@ be_union_branch::compute_size_type (void) } int -be_union_branch::gen_label_value (TAO_OutStream *os, unsigned long index) +be_union_branch::gen_label_value (TAO_OutStream *os) { - AST_Expression *e = this->label (index)->label_val (); + AST_Expression *e = this->label ()->label_val (); if (e->ec () != AST_Expression::EC_symbol) { // Easy, just a number... |