diff options
Diffstat (limited to 'TAO/TAO_IDL/be/be_typedef.cpp')
-rw-r--r-- | TAO/TAO_IDL/be/be_typedef.cpp | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/TAO/TAO_IDL/be/be_typedef.cpp b/TAO/TAO_IDL/be/be_typedef.cpp index 5fa56ef674b..f07db98f150 100644 --- a/TAO/TAO_IDL/be/be_typedef.cpp +++ b/TAO/TAO_IDL/be/be_typedef.cpp @@ -54,6 +54,108 @@ be_typedef::primitive_base_type (void) return d; } +int +be_typedef::gen_typecode (void) +{ + TAO_OutStream *cs; // output stream + TAO_NL nl; // end line + TAO_CodeGen *cg = TAO_CODEGEN::instance (); + + cs = cg->client_stubs (); + cs->indent (); // start from whatever indentation level we were at + + *cs << "CORBA::tk_alias, // typecode kind for typedefs" << nl; + *cs << this->tc_encap_len () << ", // encapsulation length\n"; + // now emit the encapsulation + cs->incr_indent (0); + if (this->gen_encapsulation () == -1) + { + return -1; + } + + cs->decr_indent (0); + return 0; +} + +// generate encapsulation. A typedef is an alias to its base type +int +be_typedef::gen_encapsulation (void) +{ + TAO_OutStream *cs; // output stream + TAO_NL nl; // end line + TAO_CodeGen *cg = TAO_CODEGEN::instance (); + long i, arrlen; + ACE_UINT32 *arr; + be_type *bt; // base type + + cs = cg->client_stubs (); + cs->indent (); // start from whatever indentation level we were at + + *cs << "TAO_ENCAP_BYTE_ORDER, // byte order" << nl; + // generate repoID + *cs << (ACE_OS::strlen (this->repoID ())+1) << ", "; + (void)this->tc_name2long (this->repoID (), arr, arrlen); + for (i=0; i < arrlen; i++) + { + cs->print ("ACE_NTOHL (0x%x), ", arr[i]); + } + *cs << " // repository ID = " << this->repoID () << nl; + + // generate 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"; + + // generate typecode for the base type + bt = be_type::narrow_from_decl (this->base_type ()); + if (!bt || (bt->gen_typecode () == -1)) + { + ACE_ERROR_RETURN ((LM_ERROR, + "be_typedef::gen_encapsulation failed for base type\n"), + -1); + } + return 0; +} + +long +be_typedef::tc_size (void) +{ + // 4 bytes for enumeration, 4 bytes for storing encap length val, followed by the + // actual encapsulation length + return 4 + 4 + this->tc_encap_len (); +} + +long +be_typedef::tc_encap_len (void) +{ + if (this->encap_len_ == -1) // not computed yet + { + be_type *bt; // base type + this->encap_len_ = 4; // holds the byte order flag + + this->encap_len_ += this->repoID_encap_len (); // repoID + + // do the same thing for the local name + this->encap_len_ += this->name_encap_len (); + + // add the encapsulation length of our base type + bt = be_type::narrow_from_decl (this->base_type ()); + if (!bt) + { + ACE_ERROR ((LM_ERROR, + "be_typedef::tc_encap_len - bad base type\n")); + return 0; + } + this->encap_len_ += bt->tc_size (); + + } + return this->encap_len_; +} + // compute the size type of the node in question int be_typedef::compute_size_type (void) |