summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/be/be_state_typedef.cpp
diff options
context:
space:
mode:
authorgokhale <asgokhale@users.noreply.github.com>1997-11-16 02:26:57 +0000
committergokhale <asgokhale@users.noreply.github.com>1997-11-16 02:26:57 +0000
commit6c97890b241922a584c2900689cd5d51c3192abc (patch)
tree0ff814809d5039c47fa119db1b9773f4b0bbbfef /TAO/TAO_IDL/be/be_state_typedef.cpp
parent82dac79f292da6cce442f433c9c9998b5a0c01d7 (diff)
downloadATCD-6c97890b241922a584c2900689cd5d51c3192abc.tar.gz
new files, some changes
CVS: CVS: CVS: CVS:
Diffstat (limited to 'TAO/TAO_IDL/be/be_state_typedef.cpp')
-rw-r--r--TAO/TAO_IDL/be/be_state_typedef.cpp321
1 files changed, 321 insertions, 0 deletions
diff --git a/TAO/TAO_IDL/be/be_state_typedef.cpp b/TAO/TAO_IDL/be/be_state_typedef.cpp
new file mode 100644
index 00000000000..41f633ef0ac
--- /dev/null
+++ b/TAO/TAO_IDL/be/be_state_typedef.cpp
@@ -0,0 +1,321 @@
+// ============================================================================
+//
+// = LIBRARY
+// TAO IDL
+//
+// = FILENAME
+// be_state_typedef.cpp
+//
+// = DESCRIPTION
+// state based code generation for typedefs.
+//
+// = AUTHOR
+// Aniruddha Gokhale
+//
+// ============================================================================
+
+#include "idl.h"
+#include "idl_extern.h"
+#include "be.h"
+
+// return type for typedef
+be_state_typedef::be_state_typedef (void)
+{
+}
+
+// generate code for structure member
+int
+be_state_typedef::gen_code (be_type *bt, be_decl *d, be_type *type)
+{
+ TAO_OutStream *os; // output stream
+ TAO_NL nl; // end line
+ TAO_CodeGen *cg = TAO_CODEGEN::instance ();
+ be_typedef *tdef; // typedef node
+ be_decl *scope; // enclosing scope in which the typedef occurs
+
+ switch (cg->state ())
+ {
+ case TAO_CodeGen::TAO_TYPEDEF_CH:
+ os = cg->client_header (); // set the stream to be the client header
+ break;
+ case TAO_CodeGen::TAO_TYPEDEF_CI:
+ os = cg->client_inline ();
+ break;
+ case TAO_CodeGen::TAO_TYPEDEF_CS:
+ os = cg->client_stubs ();
+ break;
+ default:
+ return -1;
+ } // end of outermost switch
+
+
+ tdef = be_typedef::narrow_from_decl (d); // downcast to typedef node
+ if (!tdef)
+ return -1;
+
+ // pass the typedef node, just in case it is needed
+ cg->node (tdef);
+
+ scope = be_decl::narrow_from_decl (ScopeAsDecl (tdef->defined_in ()));
+
+ if (!type) // not a recursive call
+ type = bt;
+ else // recursively called thru a typedef. "type" will have the most primitive
+ // base class of the typedef
+ ACE_ASSERT (bt->node_type () == AST_Decl::NT_typedef);
+
+ // the typedef node has the same size type as its base type
+ tdef->size_type (bt->size_type ());
+
+ switch (type->node_type ())
+ {
+ case AST_Decl::NT_interface: // type is an obj reference
+ case AST_Decl::NT_interface_fwd: // type is an obj reference
+ {
+ switch (cg->state ())
+ {
+ case TAO_CodeGen::TAO_TYPEDEF_CH:
+ {
+ os->indent (); // start from current indentation
+
+ // typedef of an interface results in 3 typedefs as shown below
+ *os << "typedef " << bt->nested_type_name (scope) << " " <<
+ d->local_name () << ";" << nl;
+ *os << "typedef " << bt->nested_type_name (scope, "_ptr") << " " <<
+ d->local_name () << "_ptr;" << nl;
+ *os << "typedef " << bt->nested_type_name (scope, "_var") << " " <<
+ d->local_name () << "_var;" << nl;
+ *os << "typedef " << bt->nested_type_name (scope, "_out") << " " <<
+ d->local_name () << "_out;\n\n";
+ }
+ break;
+ default: // nothing to do for other cases
+ break;
+ } // end of switch state
+ }
+ break;
+ case AST_Decl::NT_pre_defined: // type is predefined type
+ {
+ switch (cg->state ())
+ {
+ case TAO_CodeGen::TAO_TYPEDEF_CH:
+ {
+ be_predefined_type *pd = be_predefined_type::narrow_from_decl (type);
+
+ if (!pd)
+ return -1;
+ os->indent (); // start from current indentation
+ *os << "typedef " << bt->nested_type_name (scope) << " " <<
+ d->local_name () << ";";
+ // if the predefined type is an ANY, we also define a typedef to _var
+ if (pd->pt () == AST_PredefinedType::PT_any)
+ {
+ *os << nl;
+ *os << "typedef " << bt->name () << "_var " << d->local_name
+ () << "_var;";
+ }
+ else if (pd->pt () == AST_PredefinedType::PT_pseudo)
+ {
+ // pseudo object
+ *os << "typedef " << bt->nested_type_name (scope, "_ptr") <<
+ " " << d->local_name () << "_ptr;" << nl;
+ *os << "typedef " << bt->nested_type_name (scope, "_var") <<
+ " " << d->local_name () << "_var;" << nl;
+ }
+ *os << "typedef " << bt->nested_type_name (scope, "_out") << " "
+ << d->local_name () << "_out;\n\n";
+ } // end of case
+ break;
+ default: // nothing to do for other cases
+ break;
+ } // end switch
+ }
+ break;
+ case AST_Decl::NT_string: // type is a string
+ {
+ switch (cg->state ())
+ {
+ case TAO_CodeGen::TAO_TYPEDEF_CH:
+ {
+ os->indent (); // start from current indentation
+ if (bt->node_type () == AST_Decl::NT_typedef)
+ {
+ *os << "typedef " << bt->nested_type_name (scope) << " " <<
+ d->local_name () << ";" << nl;
+ *os << "typedef " << bt->nested_type_name (scope, "_var") <<
+ " " << d->local_name () << "_var;" << nl;
+ *os << "typedef " << bt->nested_type_name (scope, "_out") <<
+ " " << d->local_name () << "_out;\n\n";
+ }
+ else
+ {
+ *os << "typedef CORBA::String " << d->local_name () << ";" <<
+ nl;
+ *os << "typedef CORBA::String_var " << d->local_name
+ () << "_var;" << nl;
+ *os << "typedef CORBA::String_out " << d->local_name
+ () << "_out;\n\n";
+ }
+ }
+ break;
+ default: // nothing to do for the rest of the cases
+ break;
+ } // end switch state
+ }
+ break;
+ case AST_Decl::NT_enum: // type is an enum
+ {
+ switch (cg->state ())
+ {
+ case TAO_CodeGen::TAO_TYPEDEF_CH:
+ {
+ os->indent (); // start from current indentation
+ // if we are not here recursively, then we need to generate the
+ // definition first
+ if (bt->node_type () != AST_Decl::NT_typedef)
+ {
+ if (bt->gen_client_header () == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "be_state_typedef - enum gen failed\n"), -1);
+ }
+ }
+ *os << "typedef " << bt->nested_type_name (scope) << " " <<
+ d->local_name () << ";" << nl;
+ *os << "typedef " << bt->nested_type_name (scope, "_out") << " "
+ << d->local_name () << "_out;\n\n";
+ }
+ break;
+ default:
+ break;
+ } // end of switch
+ }
+ break;
+ // these are all anonymous types
+ case AST_Decl::NT_array: // type is an array
+ {
+ switch (cg->state ())
+ {
+ case TAO_CodeGen::TAO_TYPEDEF_CH:
+ {
+ // if we are not here recursively, then we need to generate the
+ // definition first
+ if (bt->node_type () != AST_Decl::NT_typedef)
+ {
+ if (bt->gen_client_header () == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "be_state_typedef - array gen failed\n"), -1);
+ }
+ }
+ os->indent ();
+ *os << "typedef " << bt->name () << " " << d->local_name () <<
+ ";" << nl;
+ *os << "typedef " << bt->name () << "_forany " << d->local_name
+ () << "_forany;" << nl;
+ // typedefs for the auxiliary methods. If we are nested inside
+ // some scope, these methods become static to the enclosing scope
+ if (d->is_nested ())
+ *os << "static ";
+ *os << d->name () << "_slice* " << d->local_name () <<
+ "_alloc (void);" << nl;
+ if (d->is_nested ())
+ *os << "static ";
+ *os << d->name () << "_slice* " << d->local_name () << "_dup ("
+ << d->name () << "_slice* " << ");" << nl;
+ if (d->is_nested ())
+ *os << "static ";
+ *os << "void " << d->name () << "_free (" << d->name () <<
+ "_slice *);\n\n";
+ }
+ break;
+ default:
+ break;
+ } // end of switch
+ }
+ break;
+ case AST_Decl::NT_sequence: // type is a sequence
+ case AST_Decl::NT_struct: // type is a struct
+ case AST_Decl::NT_union: // type is a union
+ {
+ switch (cg->state ())
+ {
+ case TAO_CodeGen::TAO_TYPEDEF_CH:
+ {
+ // if we are not here recursively, then we need to generate the
+ // definition first
+ if (bt->node_type () != AST_Decl::NT_typedef)
+ {
+ if (bt->gen_client_header () == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "be_state_typedef - struct/union/seq gen failed\n"),
+ -1);
+ }
+ }
+ os->indent (); // start from current indentation
+ *os << "typedef " << bt->nested_type_name (scope) << " " <<
+ d->local_name () << ";" << nl;
+ *os << "typedef " << bt->nested_type_name (scope, "_var") << " "
+ << d->local_name () << "_var;" << nl;
+ *os << "typedef " << bt->nested_type_name (scope, "_out") << " "
+ << d->local_name () << "_out;\n\n";
+ }
+ break;
+ case TAO_CodeGen::TAO_TYPEDEF_CI:
+ {
+ // if we are not here recursively, then we need to generate the
+ // definition first
+ if (bt->node_type () != AST_Decl::NT_typedef)
+ {
+ if (bt->gen_client_inline () == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "be_state_typedef - struct/union/seq gen failed\n"),
+ -1);
+ }
+ }
+ }
+ break;
+ case TAO_CodeGen::TAO_TYPEDEF_CS:
+ {
+ // if we are not here recursively, then we need to generate the
+ // definition first
+ if (bt->node_type () != AST_Decl::NT_typedef)
+ {
+ if (bt->gen_client_stubs () == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "be_state_typedef - struct/union/seq gen failed\n"),
+ -1);
+ }
+ }
+ }
+ break;
+ default:
+ break;
+ } // end of switch state
+ }
+ break;
+ case AST_Decl::NT_except: // type is an exception
+ {
+ // XXXASG TODO: is this allowed ???
+ }
+ break;
+ case AST_Decl::NT_typedef: // type is a typedef
+ {
+ be_type *temp;
+ be_typedef *t = be_typedef::narrow_from_decl (bt);
+
+ if (!t)
+ return -1;
+
+ temp = t->primitive_base_type ();
+ // make a recursive call
+ return this->gen_code (t, tdef, temp);
+ } // end of case
+ break;
+ } // end of switch
+
+ return 0;
+}