summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/be/be_typedef.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/TAO_IDL/be/be_typedef.cpp')
-rw-r--r--TAO/TAO_IDL/be/be_typedef.cpp102
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)