summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorparsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2003-03-27 00:25:48 +0000
committerparsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2003-03-27 00:25:48 +0000
commitd7e0d09feca5365d662845bd703c0558dd8f91d2 (patch)
tree932a1e6f2ce1b7199a8b59c1b56eaba834a2c9c0
parentd484bdaac984617a1835c7a749cd721cb4a8a648 (diff)
downloadATCD-d7e0d09feca5365d662845bd703c0558dd8f91d2.tar.gz
ChangeLogTag: Wed Mar 26 18:23:46 2003 Jeff Parsons <j.parsons@vanderbilt.edu>
-rw-r--r--TAO/ChangeLog46
-rw-r--r--TAO/TAO_IDL/be/be_component.cpp8
-rw-r--r--TAO/TAO_IDL/be/be_helper.cpp9
-rw-r--r--TAO/TAO_IDL/be/be_interface.cpp33
-rw-r--r--TAO/TAO_IDL/be/be_structure.cpp556
-rw-r--r--TAO/TAO_IDL/be/be_type.cpp103
-rw-r--r--TAO/TAO_IDL/be/be_union.cpp577
-rw-r--r--TAO/TAO_IDL/be/be_valuetype.cpp23
-rw-r--r--TAO/TAO_IDL/be/be_visitor_array/any_op_cs.cpp6
-rw-r--r--TAO/TAO_IDL/be/be_visitor_array/array_ch.cpp28
-rw-r--r--TAO/TAO_IDL/be/be_visitor_component/component_ch.cpp8
-rw-r--r--TAO/TAO_IDL/be/be_visitor_enum/any_op_cs.cpp3
-rw-r--r--TAO/TAO_IDL/be/be_visitor_exception/any_op_cs.cpp3
-rw-r--r--TAO/TAO_IDL/be/be_visitor_interface/amh_ch.cpp8
-rw-r--r--TAO/TAO_IDL/be/be_visitor_interface/interface_ch.cpp8
-rw-r--r--TAO/TAO_IDL/be/be_visitor_interface_fwd/interface_fwd_ch.cpp7
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp124
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp452
-rw-r--r--TAO/TAO_IDL/be/be_visitor_structure/structure_ch.cpp42
-rw-r--r--TAO/TAO_IDL/be/be_visitor_structure/structure_ci.cpp42
-rw-r--r--TAO/TAO_IDL/be/be_visitor_structure/structure_cs.cpp4
-rw-r--r--TAO/TAO_IDL/be/be_visitor_structure_fwd.cpp1
-rw-r--r--TAO/TAO_IDL/be/be_visitor_structure_fwd/structure_fwd_ch.cpp14
-rw-r--r--TAO/TAO_IDL/be/be_visitor_union/union_ch.cpp47
-rw-r--r--TAO/TAO_IDL/be/be_visitor_union/union_ci.cpp30
-rw-r--r--TAO/TAO_IDL/be/be_visitor_union/union_cs.cpp4
-rw-r--r--TAO/TAO_IDL/be/be_visitor_union_fwd.cpp1
-rw-r--r--TAO/TAO_IDL/be/be_visitor_union_fwd/union_fwd_ch.cpp9
-rw-r--r--TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_ch.cpp8
-rw-r--r--TAO/TAO_IDL/be/be_visitor_valuetype_fwd/valuetype_fwd_ch.cpp7
-rw-r--r--TAO/TAO_IDL/be_include/be_component.h3
-rw-r--r--TAO/TAO_IDL/be_include/be_helper.h4
-rw-r--r--TAO/TAO_IDL/be_include/be_interface.h16
-rw-r--r--TAO/TAO_IDL/be_include/be_structure.h16
-rw-r--r--TAO/TAO_IDL/be_include/be_type.h11
-rw-r--r--TAO/TAO_IDL/be_include/be_union.h15
-rw-r--r--TAO/TAO_IDL/be_include/be_valuetype.h4
-rw-r--r--TAO/tao/Sequence_T.cpp24
-rw-r--r--TAO/tao/Sequence_T.h4
-rw-r--r--TAO/tao/VarOut_T.h15
-rw-r--r--TAO/tao/VarOut_T.inl63
41 files changed, 802 insertions, 1584 deletions
diff --git a/TAO/ChangeLog b/TAO/ChangeLog
index 7f1629e5944..ad7c41d2d31 100644
--- a/TAO/ChangeLog
+++ b/TAO/ChangeLog
@@ -1,3 +1,49 @@
+Wed Mar 26 18:23:46 2003 Jeff Parsons <j.parsons@vanderbilt.edu>
+
+ * TAO_IDL/be/be_component.cpp:
+ * TAO_IDL/be/be_helper.cpp:
+ * TAO_IDL/be/be_interface.cpp:
+ * TAO_IDL/be/be_structure.cpp:
+ * TAO_IDL/be/be_type.cpp:
+ * TAO_IDL/be/be_union.cpp:
+ * TAO_IDL/be/be_valuetype.cpp:
+ * TAO_IDL/be/be_visitor_structure_fwd.cpp:
+ * TAO_IDL/be/be_visitor_union_fwd.cpp:
+ * TAO_IDL/be/be_visitor_array/any_op_cs.cpp:
+ * TAO_IDL/be/be_visitor_array/array_ch.cpp:
+ * TAO_IDL/be/be_visitor_component/component_ch.cpp:
+ * TAO_IDL/be/be_visitor_enum/any_op_cs.cpp:
+ * TAO_IDL/be/be_visitor_exception/any_op_cs.cpp:
+ * TAO_IDL/be/be_visitor_interface/amh_ch.cpp:
+ * TAO_IDL/be/be_visitor_interface/interface_ch.cpp:
+ * TAO_IDL/be/be_visitor_interface_fwd/interface_fwd_ch.cpp:
+ * TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp:
+ * TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp:
+ * TAO_IDL/be/be_visitor_structure/structure_ch.cpp:
+ * TAO_IDL/be/be_visitor_structure/structure_ci.cpp:
+ * TAO_IDL/be/be_visitor_structure/structure_cs.cpp:
+ * TAO_IDL/be/be_visitor_structure_fwd/structure_fwd_ch.cpp:
+ * TAO_IDL/be/be_visitor_union/union_ch.cpp:
+ * TAO_IDL/be/be_visitor_union/union_ci.cpp:
+ * TAO_IDL/be/be_visitor_union/union_cs.cpp:
+ * TAO_IDL/be/be_visitor_union_fwd/union_fwd_ch.cpp:
+ * TAO_IDL/be/be_visitor_valuetype/valuetype_ch.cpp:
+ * TAO_IDL/be/be_visitor_valuetype_fwd/valuetype_fwd_ch.cpp:
+ * TAO_IDL/be_include/be_component.h:
+ * TAO_IDL/be_include/be_helper.h:
+ * TAO_IDL/be_include/be_interface.h:
+ * TAO_IDL/be_include/be_structure.h:
+ * TAO_IDL/be_include/be_type.h:
+ * TAO_IDL/be_include/be_union.h:
+ * TAO_IDL/be_include/be_valuetype.h:
+ * tao/Sequence_T.cpp:
+ * tao/Sequence_T.h:
+ * tao/VarOut_T.h:
+ * tao/VarOut_T.inl:
+
+ More changes toward code generation for _var, _out and sequence
+ template typedef, and conditional explicit template instantiation.
+
Wed Mar 26 01:06:24 2003 Jeff Parsons <j.parsons@vanderbilt.edu>
* TAO_IDL/be/be_interface.cpp:
diff --git a/TAO/TAO_IDL/be/be_component.cpp b/TAO/TAO_IDL/be/be_component.cpp
index 164238db621..8afe77aca4b 100644
--- a/TAO/TAO_IDL/be/be_component.cpp
+++ b/TAO/TAO_IDL/be/be_component.cpp
@@ -73,6 +73,14 @@ be_component::~be_component (void)
}
void
+be_component::redefine (AST_Interface *from)
+{
+ be_component *bc = be_component::narrow_from_decl (from);
+ this->var_out_seq_decls_gen_ = bc->var_out_seq_decls_gen_;
+ AST_Component::redefine (from);
+}
+
+void
be_component::destroy ()
{
this->be_interface::destroy ();
diff --git a/TAO/TAO_IDL/be/be_helper.cpp b/TAO/TAO_IDL/be/be_helper.cpp
index 047b4d7b9e8..01c12e393b8 100644
--- a/TAO/TAO_IDL/be/be_helper.cpp
+++ b/TAO/TAO_IDL/be/be_helper.cpp
@@ -291,16 +291,15 @@ TAO_OutStream::gen_endif (void)
int
TAO_OutStream::gen_ifdef_AHETI (void)
{
- *this << "\n\n#if !defined (TAO_USE_SEQUENCE_TEMPLATES)";
+ *this << "\n\n#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)";
return 0;
}
int
-TAO_OutStream::gen_else_AHETI (void)
+TAO_OutStream::gen_elif_AHETI (void)
{
- *this << "\n#else /* TAO_USE_SEQUENCE_TEMPLATES */"
- << be_nl;
+ *this << "\n\n#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)";
return 0;
}
@@ -308,7 +307,7 @@ TAO_OutStream::gen_else_AHETI (void)
int
TAO_OutStream::gen_endif_AHETI (void)
{
- *this << "\n\n#endif /* !TAO_USE_SEQUENCE_TEMPLATES */ ";
+ *this << "\n\n#endif /* !ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ ";
return 0;
}
diff --git a/TAO/TAO_IDL/be/be_interface.cpp b/TAO/TAO_IDL/be/be_interface.cpp
index e76bf4f69b9..a3ef97c7a71 100644
--- a/TAO/TAO_IDL/be/be_interface.cpp
+++ b/TAO/TAO_IDL/be/be_interface.cpp
@@ -365,7 +365,8 @@ be_interface::relative_name (const char *localname,
// Am I in some kind of a multiple inheritance?
-int be_interface::in_mult_inheritance (void)
+int
+be_interface::in_mult_inheritance (void)
{
if (this->in_mult_inheritance_ == -1)
{
@@ -386,7 +387,8 @@ int be_interface::in_mult_inheritance (void)
return this->in_mult_inheritance_;
}
-void be_interface::in_mult_inheritance (int mi)
+void
+be_interface::in_mult_inheritance (int mi)
{
if (this->in_mult_inheritance_ == -1)
{
@@ -394,6 +396,14 @@ void be_interface::in_mult_inheritance (int mi)
}
}
+void
+be_interface::redefine (AST_Interface *from)
+{
+ be_interface *bi = be_interface::narrow_from_decl (from);
+ this->var_out_seq_decls_gen_ = bi->var_out_seq_decls_gen_;
+ AST_Interface::redefine (from);
+}
+
// Gen copy constructors,
void
be_interface::gen_copy_ctors (TAO_OutStream *os)
@@ -545,6 +555,11 @@ be_interface::gen_stub_ctor (TAO_OutStream *os)
void
be_interface:: gen_var_out_seq_decls (void)
{
+ if (this->var_out_seq_decls_gen_ == 1)
+ {
+ return;
+ }
+
TAO_OutStream *os = tao_cg->client_header ();
*os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
@@ -585,6 +600,8 @@ be_interface:: gen_var_out_seq_decls (void)
<< "static CORBA::Object_ptr tao_upcast (void *);" << be_uidt_nl
<< "};";
}
+
+ this->var_out_seq_decls_gen_ = 1;
}
// ****************************************************************
@@ -1995,18 +2012,6 @@ be_interface::has_mixed_parentage (void)
return this->has_mixed_parentage_;
}
-int
-be_interface::var_out_seq_decls_gen (void) const
-{
- return this->var_out_seq_decls_gen_;
-}
-
-void
-be_interface::var_out_seq_decls_gen (int val)
-{
- this->var_out_seq_decls_gen_ = val;
-}
-
const char *
be_interface::base_proxy_impl_name (void)
{
diff --git a/TAO/TAO_IDL/be/be_structure.cpp b/TAO/TAO_IDL/be/be_structure.cpp
index c266c13a18b..2704496dfc9 100644
--- a/TAO/TAO_IDL/be/be_structure.cpp
+++ b/TAO/TAO_IDL/be/be_structure.cpp
@@ -47,558 +47,12 @@ be_structure::be_structure (UTL_ScopedName *n,
{
}
-// Generate the _var definition for ourself.
-int
-be_structure::gen_var_defn (char *)
-{
- char namebuf [NAMEBUFSIZE];
-
- ACE_OS::memset (namebuf,
- '\0',
- NAMEBUFSIZE);
-
- ACE_OS::sprintf (namebuf,
- "%s_var",
- this->local_name ()->get_string ());
-
- TAO_OutStream *ch = tao_cg->client_header ();
-
- // Generate the var definition (always in the client header).
- // Depending upon the data type, there are some differences which
- // we account for here.
-
- *ch << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
- << "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
-
- // Start with whatever was our current indent level.
- *ch << "class " << be_global->stub_export_macro ()
- << " " << namebuf << be_nl;
- *ch << "{" << be_nl;
- *ch << "public:" << be_idt_nl;
-
- // Default constructor.
- *ch << namebuf << " (void);" << be_nl;
-
- // Constructor.
- *ch << namebuf << " (" << this->local_name () << " *);" << be_nl;
-
- // Copy constructor.
- *ch << namebuf << " (const " << namebuf << " &);" << be_nl;
-
- // Fixed-size types only.
- if (this->size_type () == AST_Type::FIXED)
- {
- *ch << "// Fixed-size types only." << be_nl;
- *ch << namebuf << " (const " << this->local_name ()
- << " &);" << be_nl;
- }
-
- // Destructor.
- *ch << "~" << namebuf << " (void);" << be_nl;
- *ch << be_nl;
-
- // Assignment operator from a pointer.
- *ch << namebuf << " &operator= (" << this->local_name ()
- << " *);" << be_nl;
-
- // Assignment from _var.
- *ch << namebuf << " &operator= (const " << namebuf << " &);";
-
- // Fixed-size types only.
- if (this->size_type () == AST_Type::FIXED)
- {
- *ch << be_nl << be_nl << "// Fixed-size types only." << be_nl;
- *ch << namebuf << " &operator= (const " << this->local_name ()
- << " &);" << be_nl;
- }
-
- // Arrow operator.
- *ch << be_nl << this->local_name () << " *operator-> (void);" << be_nl;
- *ch << "const " << this->local_name ()
- << " *operator-> (void) const;" << be_nl << be_nl;
-
- // Other extra types (cast operators, [] operator, and others).
- *ch << "operator const " << this->local_name () << " &() const;" << be_nl;
- *ch << "operator " << this->local_name () << " &();" << be_nl;
- *ch << "operator " << this->local_name () << " &() const;";
-
- if (this->size_type () == AST_Type::VARIABLE)
- {
- *ch << be_nl << be_nl
- << "// Variable-size types only." << be_nl;
- *ch << "operator " << this->local_name ()
- << " *&();";
- }
-
- *ch << be_nl << be_nl;
- *ch << "// in, inout, out, _retn " << be_nl;
-
- // The return types of in, out, inout, and _retn are based on the
- // parameter passing rules and the base type.
- if (this->size_type () == AST_Type::FIXED)
- {
- *ch << "const " << this->local_name () << " &in (void) const;" << be_nl;
- *ch << this->local_name () << " &inout (void);" << be_nl;
- *ch << this->local_name () << " &out (void);" << be_nl;
- *ch << this->local_name () << " _retn (void);" << be_nl;
- }
- else
- {
- *ch << "const " << this->local_name () << " &in (void) const;" << be_nl;
- *ch << this->local_name () << " &inout (void);" << be_nl;
- *ch << this->local_name () << " *&out (void);" << be_nl;
- *ch << this->local_name () << " *_retn (void);" << be_nl;
- }
-
- // Generate an additional member function
- // that returns the underlying pointer.
- *ch << this->local_name () << " *ptr (void) const;" << be_uidt_nl << be_nl;
-
- // Generate the private section.
- *ch << "private:" << be_idt_nl;
- *ch << this->local_name () << " *ptr_;" << be_uidt_nl;
- *ch << "};";
-
- return 0;
-}
-
-// Implementation of the _var class, generated in the inline file.
-int
-be_structure::gen_var_impl (char *,
- char *)
-{
- TAO_OutStream *ci = 0;
- TAO_NL be_nl; // end line
- char fname [NAMEBUFSIZE];
- char lname [NAMEBUFSIZE];
-
- ACE_OS::memset (fname,
- '\0',
- NAMEBUFSIZE);
-
- ACE_OS::sprintf (fname,
- "%s_var",
- this->full_name ());
-
- ACE_OS::memset (lname,
- '\0',
- NAMEBUFSIZE);
-
- ACE_OS::sprintf (lname,
- "%s_var",
- this->local_name ()->get_string ());
-
- ci = tao_cg->client_inline ();
-
- *ci << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
- << "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
-
- *ci << "// *************************************************************"
- << be_nl;
- *ci << "// Inline operations for class " << fname << be_nl;
- *ci << "// *************************************************************"
- << be_nl << be_nl;
-
- // Default constructor.
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::" << lname
- << " (void)" << be_nl;
- *ci << " " << ": ptr_ (0)" << be_nl;
- *ci << "{}" << be_nl << be_nl;
-
- // Constructor from a pointer.
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::" << lname << " (" << this->local_name ()
- << " *p)" << be_nl;
- *ci << " : ptr_ (p)" << be_nl;
- *ci << "{}" << be_nl << be_nl;
-
- // Copy constructor.
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::" << lname << " (const ::" << fname
- << " &p)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "if (p.ptr_)" << be_idt_nl
- << "{" << be_idt_nl;
- *ci << "ACE_NEW (this->ptr_, " << "::" << this->name ()
- << " (*p.ptr_));" << be_uidt_nl
- << "}" << be_uidt_nl;
- *ci << "else" << be_idt_nl
- << "{" << be_idt_nl;
- *ci << "this->ptr_ = 0;" << be_uidt_nl
- << "}" << be_uidt << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // Fixed-size types only.
- if (this->size_type () == AST_Type::FIXED)
- {
- *ci << "// Fixed-size types only." << be_nl;
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::" << lname << " (const "
- << "::" << this->name () << " &p)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "ACE_NEW (this->ptr_, " << "::" << this->name ()
- << " (p));" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
- }
-
- // Destructor.
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::~" << lname << " (void)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "delete this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // Assignment operator from a pointer.
- *ci << "ACE_INLINE" << be_nl
- << fname << " &" << be_nl;
- *ci << fname << "::operator= (" << this->local_name ()
- << " *_tao_struct_var)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "delete this->ptr_;" << be_nl;
- *ci << "this->ptr_ = _tao_struct_var;" << be_nl;
- *ci << "return *this;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // Assignment operator from _var.
- *ci << "ACE_INLINE" << be_nl
- << "::" << fname << " &" << be_nl
- << fname << "::operator= (const ::" << fname
- << " &_tao_struct_var)" << be_nl
- << "{" << be_idt_nl
- << "if (this != &_tao_struct_var)" << be_idt_nl
- << "{" << be_idt_nl
- << "if (_tao_struct_var.ptr_ == 0)" << be_idt_nl
- << "{" << be_idt_nl
- << "delete this->ptr_;" << be_nl
- << "this->ptr_ = 0;" << be_uidt_nl
- << "}" << be_uidt_nl
- << "else" << be_idt_nl
- << "{" << be_idt_nl
- << this->local_name () << " *deep_copy = 0;" << be_nl
- << "ACE_NEW_RETURN (" << be_idt << be_idt_nl
- << "deep_copy," << be_nl
- << this->local_name () << " (*_tao_struct_var.ptr_)," << be_nl
- << "*this" << be_uidt_nl
- << ");" << be_uidt_nl << be_nl
- << "if (deep_copy != 0)" << be_idt_nl
- << "{" << be_idt_nl
- << this->local_name () << " *tmp = deep_copy;" << be_nl
- << "deep_copy = this->ptr_;" << be_nl
- << "this->ptr_ = tmp;" << be_nl
- << "delete deep_copy;" << be_uidt_nl
- << "}" << be_uidt << be_uidt_nl
- << "}" << be_uidt << be_uidt_nl
- << "}" << be_uidt_nl << be_nl
- << "return *this;" << be_uidt_nl
- << "}" << be_nl << be_nl;
-
- // Fixed-size types only.
- if (this->size_type () == AST_Type::FIXED)
- {
- *ci << "// fixed-size types only" << be_nl;
- *ci << "ACE_INLINE " << fname << " &" << be_nl;
- *ci << fname << "::operator= (const " << "::" << this->name ()
- << " &p)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "if (this->ptr_ != &p)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "delete this->ptr_;" << be_nl;
- *ci << "ACE_NEW_RETURN (" << be_idt << be_idt_nl
- << "this->ptr_," << be_nl
- << "::" << this->name () << " (p)," << be_nl
- << "*this" << be_uidt_nl
- << ");" << be_uidt << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
- *ci << "return *this;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
- }
-
- // Two arrow operators.
- *ci << "ACE_INLINE const " << "::" << this->name () << " *" << be_nl;
- *ci << fname << "::operator-> (void) const" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- *ci << "ACE_INLINE " << "::" << this->name () << " *" << be_nl;
- *ci << fname << "::operator-> (void)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // Other extra methods - 3 cast operator ().
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::operator const " << "::" << this->name ()
- << " &() const // cast" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return *this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::operator " << "::" << this->name ()
- << " &() // cast " << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return *this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::operator " << "::" << this->name ()
- << " &() const // cast " << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return *this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // Variable-size types only.
- if (this->size_type () == AST_Type::VARIABLE)
- {
- *ci << "// Variable-size types only." << be_nl;
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::operator " << "::" << this->name ()
- << " *&() // cast " << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
- }
-
- // in, inout, out, and _retn
- *ci << "ACE_INLINE const " << "::" << this->name () << " &" << be_nl;
- *ci << fname << "::in (void) const" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return *this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- *ci << "ACE_INLINE " << "::" << this->name () << " &" << be_nl;
- *ci << fname << "::inout (void)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return *this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // The out is handled differently based on our size type.
- if (this->size_type () == AST_Type::VARIABLE)
- {
- *ci << "// Mapping for variable size." << be_nl;
- *ci << "ACE_INLINE " << "::" << this->name () << " *&" << be_nl;
- *ci << fname << "::out (void)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "delete this->ptr_;" << be_nl;
- *ci << "this->ptr_ = 0;" << be_nl;
- *ci << "return this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- *ci << "ACE_INLINE " << "::" << this->name () << " *" << be_nl;
- *ci << fname << "::_retn (void)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "::" << this->name () << " *tmp = this->ptr_;" << be_nl;
- *ci << "this->ptr_ = 0;" << be_nl;
- *ci << "return tmp;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
- }
- else
- {
- *ci << "// mapping for fixed size " << be_nl;
- *ci << "ACE_INLINE " << "::" << this->name () << " &" << be_nl;
- *ci << fname << "::out (void)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return *this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- *ci << "ACE_INLINE " << "::" << this->name () << be_nl;
- *ci << fname << "::_retn (void)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return *this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- }
-
- // The additional ptr () member function.
- *ci << "ACE_INLINE " << "::" << this->name () << " *" << be_nl;
- *ci << fname << "::ptr (void) const" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return this->ptr_;" << be_uidt_nl;
- *ci << "}";
-
- return 0;
-}
-
-// Generate the _out definition.
-int
-be_structure::gen_out_defn (char *)
-{
- TAO_OutStream *ch = 0;
- TAO_NL be_nl;
- char namebuf [NAMEBUFSIZE];
-
- ACE_OS::memset (namebuf,
- '\0',
- NAMEBUFSIZE);
-
- ACE_OS::sprintf (namebuf,
- "%s_out",
- this->local_name ()->get_string ());
-
- ch = tao_cg->client_header ();
-
- // Generate the out definition (always in the client header).
-
- *ch << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
- << "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
-
- *ch << "class " << be_global->stub_export_macro ()
- << " " << namebuf << be_nl;
- *ch << "{" << be_nl;
- *ch << "public:" << be_idt_nl;
-
- // No default constructor
-
- // Constructor from a pointer.
- *ch << namebuf << " (" << this->local_name () << " *&);" << be_nl;
-
- // Constructor from a _var &.
- *ch << namebuf << " (" << this->local_name () << "_var &);" << be_nl;
-
- // Constructor from a _out &.
- *ch << namebuf << " (const " << namebuf << " &);" << be_nl;
-
- // Assignment operator from a _out &.
- *ch << namebuf << " &operator= (const " << namebuf << " &);" << be_nl;
-
- // Assignment operator from a pointer &, cast operator, ptr fn, operator
- // -> and any other extra operators.
-
- // Assignment.
- *ch << namebuf << " &operator= ("
- << this->local_name () << " *);" << be_nl;
-
- // Operator ().
- *ch << "operator " << this->local_name () << " *&();" << be_nl;
-
- // ptr fn
- *ch << this->local_name () << " *&ptr (void);" << be_nl;
-
- // operator ->
- *ch << this->local_name () << " *operator-> (void);" << be_nl;
-
- *ch << be_uidt_nl;
- *ch << "private:" << be_idt_nl;
- *ch << local_name () << " *&ptr_;" << be_nl;
- *ch << "// Assignment from T_var not allowed." << be_nl;
- *ch << "void operator= (const " << this->local_name ()
- << "_var &);" << be_uidt_nl;
- *ch << "};";
-
- return 0;
-}
-
-int
-be_structure::gen_out_impl (char *,
- char *)
+void
+be_structure::redefine (AST_Structure *from)
{
- TAO_OutStream *ci = 0;
- TAO_NL be_nl;
- char fname [NAMEBUFSIZE];
- char lname [NAMEBUFSIZE];
-
- ACE_OS::memset (fname,
- '\0',
- NAMEBUFSIZE);
-
- ACE_OS::sprintf (fname,
- "%s_out",
- this->full_name ());
-
- ACE_OS::memset (lname,
- '\0',
- NAMEBUFSIZE);
-
- ACE_OS::sprintf (lname,
- "%s_out",
- this->local_name ()->get_string ());
-
- ci = tao_cg->client_inline ();
-
- // Generate the var implementation in the inline file.
-
- *ci << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
- << "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
-
- *ci << "// *************************************************************"
- << be_nl;
- *ci << "// Inline operations for class " << fname << be_nl;
- *ci << "// *************************************************************"
- << be_nl << be_nl;
-
- // Constructor from a pointer.
- ci->indent ();
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::" << lname << " (" << "::"
- << this->name () << " *&p)" << be_nl;
- *ci << " : ptr_ (p)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "this->ptr_ = 0;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // Constructor from _var &.
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::" << lname << " (" << this->local_name ()
- << "_var &p)" << be_nl;
- *ci << " : ptr_ (p.out ())" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "delete this->ptr_;" << be_nl;
- *ci << "this->ptr_ = 0;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // Copy constructor.
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::" << lname << " (const ::" << fname
- << " &p)" << be_nl;
- *ci << " : ptr_ (ACE_const_cast (" << lname << "&, p).ptr_)" << be_nl;
- *ci << "{}" << be_nl << be_nl;
-
- // assignment operator from _out &.
- *ci << "ACE_INLINE" << be_nl
- << fname << " &" << be_nl;
- *ci << fname << "::operator= (const ::" << fname <<
- " &p)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "this->ptr_ = ACE_const_cast (" << lname << "&, p).ptr_;" << be_nl;
- *ci << "return *this;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // Assignment from _var is not allowed by a private declaration.
-
- // Assignment operator from pointer.
- *ci << "ACE_INLINE" << be_nl
- << fname << " &" << be_nl;
- *ci << fname << "::operator= (" << this->local_name () << " *_tao_struct_out)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "this->ptr_ = _tao_struct_out;" << be_nl;
- *ci << "return *this;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // Other extra methods - cast operator ().
- *ci << "ACE_INLINE " << be_nl;
- *ci << fname << "::operator " << "::" << this->name ()
- << " *&() // cast" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // ptr function
- *ci << "ACE_INLINE " << "::" << this->name () << " *&" << be_nl;
- *ci << fname << "::ptr (void) // ptr" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // operator ->
- *ci << "ACE_INLINE " << "::" << this->name () << " *" << be_nl;
- *ci << fname << "::operator-> (void)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return this->ptr_;" << be_uidt_nl;
- *ci << "}";
-
- return 0;
+ be_structure *bs = be_structure::narrow_from_decl (from);
+ this->common_varout_gen_ = bs->common_varout_gen_;
+ AST_Structure::redefine (from);
}
void
diff --git a/TAO/TAO_IDL/be/be_type.cpp b/TAO/TAO_IDL/be/be_type.cpp
index 46cca0cd831..d46d7af7cd5 100644
--- a/TAO/TAO_IDL/be/be_type.cpp
+++ b/TAO/TAO_IDL/be/be_type.cpp
@@ -33,7 +33,8 @@ ACE_RCSID (be,
"$Id$")
be_type::be_type (void)
- : tc_name_ (0)
+ : tc_name_ (0),
+ common_varout_gen_ (0)
{
}
@@ -45,7 +46,8 @@ be_type::be_type (AST_Decl::NodeType nt,
n),
AST_Decl (nt,
n),
- tc_name_ (0)
+ tc_name_ (0),
+ common_varout_gen_ (0)
{
AST_Decl *parent = ScopeAsDecl (this->defined_in ());
Identifier *segment = 0;
@@ -217,6 +219,103 @@ be_type::fwd_helper_name (void) const
return this->fwd_helper_name_.fast_rep ();
}
+void
+be_type::gen_common_varout (TAO_OutStream *os)
+{
+ if (this->common_varout_gen_ == 1)
+ {
+ return;
+ }
+
+ *os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
+ << "// " << __FILE__ << ":" << __LINE__;
+
+ AST_Type::SIZE_TYPE st = this->size_type ();
+
+ *os << be_nl << be_nl
+ << (this->node_type () == AST_Decl::NT_struct ? "struct "
+ : "class ")
+ << this->local_name () << ";";
+
+ *os << be_nl << be_nl
+ << "typedef" << be_idt_nl
+ << (st == AST_Type::FIXED ? "TAO_Fixed_Var_T<"
+ : "TAO_Var_Var_T<")
+ << be_idt << be_idt_nl
+ << this->local_name () << be_uidt_nl
+ << ">" << be_uidt_nl
+ << this->local_name () << "_var;" << be_uidt_nl << be_nl;
+
+ if (st == AST_Type::FIXED)
+ {
+ *os << "typedef" << be_idt_nl
+ << this->local_name () << " &" << be_nl
+ << this->local_name () << "_out;" << be_uidt;
+ }
+ else
+ {
+ *os << "typedef" << be_idt_nl
+ << "TAO_Out_T<" << be_idt << be_idt_nl
+ << this->local_name () << "," << be_nl
+ << this->local_name () << "_var" << be_uidt_nl
+ << ">" << be_uidt_nl
+ << this->local_name () << "_out;" << be_uidt;
+ }
+
+ this->common_varout_gen_ = 1;
+}
+
+void
+be_type::gen_common_tmplinst (TAO_OutStream *os)
+{
+ AST_Type::SIZE_TYPE st = this->size_type ();
+
+ *os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
+ << "// " << __FILE__ << ":" << __LINE__;
+
+ os->gen_ifdef_AHETI ();
+
+ *os << be_nl << be_nl
+ << "template class" << be_idt_nl
+ << (st == AST_Type::FIXED ? "TAO_Fixed_Var_T<"
+ : "TAO_Var_Var_T<")
+ << be_idt << be_idt_nl
+ << this->local_name () << be_uidt_nl
+ << ">;" << be_uidt << be_uidt;
+
+ if (st == AST_Type::VARIABLE)
+ {
+ *os << be_nl<< be_nl
+ << "template class" << be_idt_nl
+ << "TAO_Out_T<" << be_idt << be_idt_nl
+ << this->local_name () << "," << be_nl
+ << this->local_name () << "_var" << be_uidt_nl
+ << ">;" << be_uidt << be_uidt;
+ }
+
+ os->gen_elif_AHETI ();
+
+ *os << be_nl << be_nl
+ << "# pragma instantiate \\" << be_idt_nl
+ << (st == AST_Type::FIXED ? "TAO_Fixed_Var_T< \\"
+ : "TAO_Var_Var_T< \\")
+ << be_idt << be_idt_nl
+ << this->local_name () << " \\" << be_uidt_nl
+ << ">" << be_uidt << be_uidt;
+
+ if (st == AST_Type::VARIABLE)
+ {
+ *os << be_nl << be_nl
+ << "# pragma instantiate \\" << be_idt_nl
+ << "TAO_Out_T< \\" << be_idt << be_idt_nl
+ << this->local_name () << ", \\" << be_nl
+ << this->local_name () << "_var \\" << be_uidt_nl
+ << ">" << be_uidt << be_uidt;
+ }
+
+ os->gen_endif_AHETI ();
+}
+
AST_Decl::NodeType
be_type::base_node_type (void) const
{
diff --git a/TAO/TAO_IDL/be/be_union.cpp b/TAO/TAO_IDL/be/be_union.cpp
index 24e76c21aae..13ec5d12652 100644
--- a/TAO/TAO_IDL/be/be_union.cpp
+++ b/TAO/TAO_IDL/be/be_union.cpp
@@ -61,579 +61,12 @@ be_union::be_union (AST_ConcreteType *dt,
this->has_constructor (I_TRUE);
}
-// Generate the _var definition for ourself.
-int
-be_union::gen_var_defn (char *)
-{
- char namebuf [NAMEBUFSIZE];
-
- ACE_OS::memset (namebuf,
- '\0',
- NAMEBUFSIZE);
-
- ACE_OS::sprintf (namebuf,
- "%s_var",
- this->local_name ()->get_string ());
-
- TAO_OutStream *ch = tao_cg->client_header ();
-
- // Generate the var definition (always in the client header).
- // Depending upon the data type, there are some differences which we account
- // for over here.
-
- *ch << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
- << "// " << __FILE__ << ":" << __LINE__;
-
- *ch << be_nl << be_nl
- << "class " << be_global->stub_export_macro ()
- << " " << namebuf << be_nl;
- *ch << "{" << be_nl;
- *ch << "public:" << be_idt_nl;
-
- // Default constructor.
- *ch << namebuf << " (void);" << be_nl;
-
- // Constructor.
- *ch << namebuf << " (" << this->local_name () << " *);" << be_nl;
-
- // Copy constructor.
- *ch << namebuf << " (const " << namebuf
- << " &);" << be_nl;
-
- // Fixed-size types only.
- if (this->size_type () == AST_Type::FIXED)
- {
- *ch << namebuf << " (const " << this->local_name ()
- << " &); // fixed-size types only" << be_nl;
- }
-
- // Destructor.
- *ch << "~" << namebuf << " (void);" << be_nl;
- *ch << be_nl;
-
- // Assignment operator from a pointer.
- *ch << namebuf << " &operator= ("
- << this->local_name () << " *);" << be_nl;
-
- // Assignment from _var.
- *ch << namebuf << " &operator= (const " << namebuf << " &);" << be_nl;
-
- // Fixed-size types only.
- if (this->size_type () == AST_Type::FIXED)
- {
- *ch << namebuf << " &operator= (const " << this->local_name ()
- << " &); // fixed-size types only" << be_nl;
- }
-
- // Arrow operator.
- *ch << local_name () << " *operator-> (void);" << be_nl;
- *ch << "const " << this->local_name ()
- << " *operator-> (void) const;" << be_nl;
- *ch << be_nl;
-
- // Other extra types (cast operators, [] operator, and others).
- *ch << "operator const " << this->local_name () << " &() const;" << be_nl;
- *ch << "operator " << this->local_name () << " &();" << be_nl;
- *ch << "operator " << this->local_name () << " &() const;" << be_nl;
-
- if (this->size_type () == AST_Type::VARIABLE)
- {
- *ch << " // Variable size types only." << be_nl;
- *ch << "operator " << this->local_name ()
- << " *&();" << be_nl;
- }
-
- *ch << be_nl;
- *ch << "// in, inout, out, _retn " << be_nl;
-
- // The return types of in, out, inout, and _retn are based on the parameter
- // passing rules and the base type.
- if (this->size_type () == AST_Type::FIXED)
- {
- *ch << "const " << local_name () << " &in (void) const;" << be_nl;
- *ch << this->local_name () << " &inout (void);" << be_nl;
- *ch << this->local_name () << " &out (void);" << be_nl;
- *ch << this->local_name () << " _retn (void);" << be_nl;
- }
- else
- {
- *ch << "const " << this->local_name () << " &in (void) const;" << be_nl;
- *ch << this->local_name () << " &inout (void);" << be_nl;
- *ch << this->local_name () << " *&out (void);" << be_nl;
- *ch << this->local_name () << " *_retn (void);" << be_nl;
- }
-
- // Generate an additional member function that
- // returns the underlying pointer.
- *ch << this->local_name () << " *ptr (void) const;"
- << be_uidt_nl << be_nl;
-
- // Generate the private section
- *ch << "private:" << be_idt_nl;
- *ch << this->local_name () << " *ptr_;" << be_uidt_nl;
- *ch << "};";
-
- return 0;
-}
-
-// Implementation of the _var class. All of these get generated in the inline
-// file.
-int
-be_union::gen_var_impl (char *,
- char *)
-{
- TAO_OutStream *ci = 0;
- TAO_NL be_nl;
-
- // To hold the full and local _var names.
- char fname [NAMEBUFSIZE];
- char lname [NAMEBUFSIZE];
-
- ACE_OS::memset (fname,
- '\0',
- NAMEBUFSIZE);
-
- ACE_OS::sprintf (fname,
- "%s_var",
- this->full_name ());
-
- ACE_OS::memset (lname,
- '\0',
- NAMEBUFSIZE);
-
- ACE_OS::sprintf (lname,
- "%s_var",
- this->local_name ()->get_string ());
-
- ci = tao_cg->client_inline ();
-
- *ci << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
- << "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
-
- *ci << "// *************************************************************"
- << be_nl;
- *ci << "// Inline operations for class " << fname << be_nl;
- *ci << "// *************************************************************"
- << be_nl << be_nl;
-
- // Default constructor.
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::" << lname <<
- " (void)" << be_nl;
- *ci << " " << ": ptr_ (0)" << be_nl;
- *ci << "{}" << be_nl << be_nl;
-
- // Constructor from a pointer.
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::" << lname << " (" << this->local_name ()
- << " *p)" << be_nl;
- *ci << " : ptr_ (p)" << be_nl;
- *ci << "{}" << be_nl << be_nl;
-
- // Copy constructor.
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::" << lname << " (const ::" << fname
- << " &p)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "if (p.ptr_)" << be_idt_nl
- << "{" << be_idt_nl;
- *ci << "ACE_NEW (this->ptr_, ::" << this->name ()
- << " (*p.ptr_));" << be_uidt_nl
- << "}" << be_uidt_nl;
- *ci << "else" << be_idt_nl
- << "{" << be_idt_nl;
- *ci << "this->ptr_ = 0;" << be_uidt_nl
- << "}" << be_uidt << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // Fixed-size types only.
- if (this->size_type () == AST_Type::FIXED)
- {
- *ci << "// Fixed-size types only." << be_nl;
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::" << lname << " (const ::"
- << this->name () << " &p)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "ACE_NEW (this->ptr_, ::" << this->name ()
- << " (p));" << be_uidt_nl;
- *ci << "}\n\n";
- }
-
- // Destructor.
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::~" << lname << " (void)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "delete this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // Assignment operator from a pointer.
- *ci << "ACE_INLINE" << be_nl
- << "::" << fname << " &" << be_nl;
- *ci << fname << "::operator= (" << this->local_name ()
- << " *_tao_union_var)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "delete this->ptr_;" << be_nl;
- *ci << "this->ptr_ = _tao_union_var;" << be_nl;
- *ci << "return *this;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // Assignment operator from _var.
- *ci << "ACE_INLINE" << be_nl
- << "::" << fname << " &" << be_nl
- << fname << "::operator= (const ::" << fname
- << " &_tao_union_var)" << be_nl
- << "{" << be_idt_nl
- << "if (this != &_tao_union_var)" << be_idt_nl
- << "{" << be_idt_nl
- << "if (_tao_union_var.ptr_ == 0)" << be_idt_nl
- << "{" << be_idt_nl
- << "delete this->ptr_;" << be_nl
- << "this->ptr_ = 0;" << be_uidt_nl
- << "}" << be_uidt_nl
- << "else" << be_idt_nl
- << "{" << be_idt_nl
- << this->local_name () << " *deep_copy = 0;" << be_nl
- << "ACE_NEW_RETURN (" << be_idt << be_idt_nl
- << "deep_copy," << be_nl
- << this->local_name () << " (*_tao_union_var.ptr_)," << be_nl
- << "*this" << be_uidt_nl
- << ");" << be_uidt_nl << be_nl
- << "if (deep_copy != 0)" << be_idt_nl
- << "{" << be_idt_nl
- << this->local_name () << " *tmp = deep_copy;" << be_nl
- << "deep_copy = this->ptr_;" << be_nl
- << "this->ptr_ = tmp;" << be_nl
- << "delete deep_copy;" << be_uidt_nl
- << "}" << be_uidt << be_uidt_nl
- << "}" << be_uidt << be_uidt_nl
- << "}" << be_uidt_nl << be_nl
- << "return *this;" << be_uidt_nl
- << "}" << be_nl << be_nl;
-
- // Fixed-size types only.
- if (this->size_type () == AST_Type::FIXED)
- {
- *ci << "// Fixed-size types only." << be_nl;
- *ci << "ACE_INLINE" << be_nl
- << "::" << fname << " &" << be_nl;
- *ci << fname << "::operator= (const ::" << this->name ()
- << " &_tao_union_var)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "if (this->ptr_ != &_tao_union_var)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "delete this->ptr_;" << be_nl;
- *ci << "ACE_NEW_RETURN (" << be_idt << be_idt_nl
- << "this->ptr_," << be_nl
- << "::" << this->name () << " (_tao_union_var)," << be_nl
- << "*this" << be_uidt_nl
- << ");" << be_uidt << be_uidt_nl;
- *ci << "}" << be_nl;
- *ci << "return *this;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
- }
-
- // Two arrow operators.
- *ci << "ACE_INLINE" << be_nl
- << "const ::" << this->name () << " *" << be_nl;
- *ci << fname << "::operator-> (void) const" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- *ci << "ACE_INLINE" << be_nl
- << "::" << this->name () << " *" << be_nl;
- *ci << fname << "::operator-> (void)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // Other extra methods - 3 cast operator ().
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::operator const ::" << this->name ()
- << " &() const // cast" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return *this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::operator ::" << this->name ()
- << " &() // cast " << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return *this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::operator ::" << this->name ()
- << " &() const// cast " << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return *this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // Variable-size types only.
- if (this->size_type () == AST_Type::VARIABLE)
- {
- *ci << "// Variable-size types only." << be_nl;
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::operator ::" << this->name ()
- << " *&() // cast " << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
- }
-
- // in, inout, out, _retn, and ptr.
- *ci << "ACE_INLINE" << be_nl
- << "const ::" << this->name () << " &" << be_nl;
- *ci << fname << "::in (void) const" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return *this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- *ci << "ACE_INLINE" << be_nl
- << "::" << this->name () << " &" << be_nl;
- *ci << fname << "::inout (void)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return *this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // The out and _retn are handled differently based on our size type.
- if (this->size_type () == AST_Type::VARIABLE)
- {
- *ci << "// Mapping for variable size." << be_nl;
- *ci << "ACE_INLINE" << be_nl
- << "::" << this->name () << " *&" << be_nl;
- *ci << fname << "::out (void)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "delete this->ptr_;" << be_nl;
- *ci << "this->ptr_ = 0;" << be_nl;
- *ci << "return this->ptr_;" << be_uidt_nl;
- *ci << "}\n\n";
-
- ci->indent ();
- *ci << "ACE_INLINE" << be_nl
- << "::" << this->name () << " *" << be_nl;
- *ci << fname << "::_retn (void)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "::" << this->name () << " *tmp = this->ptr_;" << be_nl;
- *ci << "this->ptr_ = 0;" << be_nl;
- *ci << "return tmp;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- }
- else
- {
- *ci << "// Mapping for fixed size. " << be_nl;
- *ci << "ACE_INLINE" << be_nl
- << "::" << this->name () << " &" << be_nl;
- *ci << fname << "::out (void)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return *this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- *ci << "ACE_INLINE" << be_nl
- << "::" << this->name () << be_nl;
- *ci << fname << "::_retn (void)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return *this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
- }
-
- // The additional ptr () member function.
- *ci << "ACE_INLINE" << be_nl
- << "::" << this->name () << " *" << be_nl;
- *ci << fname << "::ptr (void) const" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return this->ptr_;" << be_uidt_nl;
- *ci << "}";
-
- return 0;
-}
-
-// Generate the _out definition
-int
-be_union::gen_out_defn (char *)
-{
- TAO_OutStream *ch = 0;
- TAO_NL be_nl;
-
- // To hold the _out name.
- char namebuf [NAMEBUFSIZE];
-
- ACE_OS::memset (namebuf,
- '\0',
- NAMEBUFSIZE);
-
- ACE_OS::sprintf (namebuf,
- "%s_out",
- this->local_name ()->get_string ());
-
- ch = tao_cg->client_header ();
-
- // Generate the out definition (always in the client header).
-
- *ch << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
- << "// " << __FILE__ << ":" << __LINE__;
-
- *ch << be_nl << be_nl
- << "class " << be_global->stub_export_macro ()
- << " " << namebuf << be_nl;
- *ch << "{" << be_nl;
- *ch << "public:" << be_idt_nl;
-
- // No default constructor.
-
- // Constructor from a pointer.
- *ch << namebuf << " (" << this->local_name () << " *&);" << be_nl;
-
- // Constructor from a _var &.
- *ch << namebuf << " (" << this->local_name () << "_var &);" << be_nl;
-
- // Constructor from a _out &.
- *ch << namebuf << " (const " << namebuf << " &);" << be_nl;
-
- // Assignment operator from a _out &.
- *ch << namebuf << " &operator= (const " << namebuf << " &);" << be_nl;
-
- // Assignment operator from a pointer &, cast operator, ptr fn, operator
- // -> and any other extra operators.
-
- // Assignment.
- *ch << namebuf << " &operator= (" << this->local_name ()
- << " *);" << be_nl;
-
- // operator ().
- *ch << "operator " << local_name () << " *&();" << be_nl;
-
- // ptr function.
- *ch << this->local_name () << " *&ptr (void);" << be_nl;
-
- // operator ->
- *ch << this->local_name () << " *operator-> (void);" << be_nl;
-
- *ch << be_uidt_nl;
- *ch << "private:" << be_idt_nl;
- *ch << this->local_name () << " *&ptr_;" << be_nl;
- *ch << "// assignment from T_var not allowed." << be_nl;
- *ch << "void operator= (const " << this->local_name ()
- << "_var &);" << be_uidt_nl;
- *ch << "};";
-
- return 0;
-}
-
-int
-be_union::gen_out_impl (char *,
- char *)
+void
+be_union::redefine (AST_Structure *from)
{
- TAO_OutStream *ci = 0;
- TAO_NL be_nl;
-
- // To hold the full and local _out names.
- char fname [NAMEBUFSIZE];
- char lname [NAMEBUFSIZE];
-
- ACE_OS::memset (fname,
- '\0',
- NAMEBUFSIZE);
-
- ACE_OS::sprintf (fname,
- "%s_out",
- this->full_name ());
-
- ACE_OS::memset (lname,
- '\0',
- NAMEBUFSIZE);
-
- ACE_OS::sprintf (lname,
- "%s_out",
- this->local_name ()->get_string ());
-
- ci = tao_cg->client_inline ();
-
- // Generate the var implementation in the inline file.
-
- *ci << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
- << "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
-
- *ci << "// *************************************************************"
- << be_nl;
- *ci << "// Inline operations for class " << fname << be_nl;
- *ci << "// *************************************************************"
- << be_nl << be_nl;
-
- // Constructor from a pointer.
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::" << lname << " (" << this->local_name ()
- << " *&p)" << be_nl;
- *ci << " : ptr_ (p)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "this->ptr_ = 0;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // Constructor from _var &.
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::" << lname << " (" << this->local_name ()
- << "_var &p)" << be_nl;
- *ci << " : ptr_ (p.out ())" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "delete this->ptr_;" << be_nl;
- *ci << "this->ptr_ = 0;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // Copy constructor.
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::" << lname << " (const ::" << fname
- << " &p)" << be_nl;
- *ci << " : ptr_ (ACE_const_cast (" << lname << "&, p).ptr_)" << be_nl;
- *ci << "{}" << be_nl << be_nl;
-
- // Assignment operator from _out &.
- *ci << "ACE_INLINE" << be_nl
- << "::" << fname << " &" << be_nl;
- *ci << fname << "::operator= (const ::" << fname
- << " &p)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "this->ptr_ = ACE_const_cast (" << lname << "&, p).ptr_;" << be_nl;
- *ci << "return *this;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // Assignment from _var is not allowed by a private declaration.
-
- // Assignment operator from pointer.
- *ci << "ACE_INLINE" << be_nl
- << "::" << fname << " &" << be_nl;
- *ci << fname << "::operator= (" << this->local_name ()
- << " *_tao_union_out)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "this->ptr_ = _tao_union_out;" << be_nl;
- *ci << "return *this;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // Other extra methods - cast operator ().
- *ci << "ACE_INLINE" << be_nl;
- *ci << fname << "::operator ::" << this->name ()
- << " *&() // cast" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // ptr function.
- *ci << "ACE_INLINE" << be_nl
- << "::" << this->name () << " *&" << be_nl;
- *ci << fname << "::ptr (void) // ptr" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return this->ptr_;" << be_uidt_nl;
- *ci << "}" << be_nl << be_nl;
-
- // operator ->
- *ci << "ACE_INLINE" << be_nl
- << "::" << this->name () << " *" << be_nl;
- *ci << fname << "::operator-> (void)" << be_nl;
- *ci << "{" << be_idt_nl;
- *ci << "return this->ptr_;" << be_uidt_nl;
- *ci << "}";
-
- return 0;
+ be_union *bu = be_union::narrow_from_decl (from);
+ this->common_varout_gen_ = bu->common_varout_gen_;
+ AST_Union::redefine (from);
}
idl_bool
diff --git a/TAO/TAO_IDL/be/be_valuetype.cpp b/TAO/TAO_IDL/be/be_valuetype.cpp
index c438ea9c48b..2d088f94bba 100644
--- a/TAO/TAO_IDL/be/be_valuetype.cpp
+++ b/TAO/TAO_IDL/be/be_valuetype.cpp
@@ -69,6 +69,8 @@ be_valuetype::be_valuetype (UTL_ScopedName *n,
n_inherits_flat,
0,
abstract),
+ be_type (AST_Decl::NT_valuetype,
+ n),
AST_ValueType (n,
inherits,
n_inherits,
@@ -158,6 +160,8 @@ be_valuetype::~be_valuetype (void)
void
be_valuetype::redefine (AST_Interface *from)
{
+ be_valuetype *bv = be_valuetype::narrow_from_decl (from);
+ bv->var_out_seq_decls_gen_ = bv->var_out_seq_decls_gen_;
this->AST_ValueType::redefine (from);
}
@@ -189,18 +193,6 @@ be_valuetype::full_obv_skel_name (void)
return this->full_obv_skel_name_;
}
-int
-be_valuetype::var_out_seq_decls_gen (void) const
-{
- return this->var_out_seq_decls_gen_;
-}
-
-void
-be_valuetype::var_out_seq_decls_gen (int val)
-{
- this->var_out_seq_decls_gen_ = val;
-}
-
const char *
be_valuetype::fwd_helper_name (void) const
{
@@ -304,6 +296,11 @@ be_valuetype::gen_helper_stubs (char* ,
void
be_valuetype:: gen_var_out_seq_decls (void)
{
+ if (this->var_out_seq_decls_gen_ == 1)
+ {
+ return;
+ }
+
TAO_OutStream *os = tao_cg->client_header ();
*os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
@@ -325,6 +322,8 @@ be_valuetype:: gen_var_out_seq_decls (void)
<< lname << " *);" << be_nl
<< "static void tao_remove_ref (" << lname << " *);" << be_uidt_nl
<< "};";
+
+ this->var_out_seq_decls_gen_ = 1;
}
// For building the pre and postfix of private data fields.
diff --git a/TAO/TAO_IDL/be/be_visitor_array/any_op_cs.cpp b/TAO/TAO_IDL/be/be_visitor_array/any_op_cs.cpp
index 50cb462f6cd..5875fe37b66 100644
--- a/TAO/TAO_IDL/be/be_visitor_array/any_op_cs.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_array/any_op_cs.cpp
@@ -140,9 +140,9 @@ be_visitor_array_any_op_cs::visit_array (be_array *node)
<< node->name () << "_forany" << be_uidt_nl
<< ">;" << be_uidt << be_uidt_nl
<< "#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)" << be_nl
- << "# pragma instantiate TAO::Any_Array_Impl_T<" << be_idt << be_idt_nl
- << node->name () << "_slice," << be_nl
- << node->name () << "_forany" << be_uidt_nl
+ << "# pragma instantiate TAO::Any_Array_Impl_T< \\" << be_idt << be_idt_nl
+ << node->name () << "_slice, \\" << be_nl
+ << node->name () << "_forany \\" << be_uidt_nl
<< ">" << be_uidt_nl
<< "#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */";
diff --git a/TAO/TAO_IDL/be/be_visitor_array/array_ch.cpp b/TAO/TAO_IDL/be/be_visitor_array/array_ch.cpp
index f6ca9c7c101..bf84852b1d3 100644
--- a/TAO/TAO_IDL/be/be_visitor_array/array_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_array/array_ch.cpp
@@ -230,44 +230,46 @@ int be_visitor_array_ch::visit_array (be_array *node)
if (node->size_type () == AST_Type::VARIABLE)
{
*os << be_nl << be_nl
- << "typedef TAO_VarArray_Var_T<" << be_idt << be_idt_nl
+ << "typedef" << be_idt_nl
+ << "TAO_VarArray_Var_T<" << be_idt << be_idt_nl
<< node->local_name () << "_slice," << be_nl
<< "tao_" << node->local_name () << "_life" << be_uidt_nl
- << ">" << be_nl
+ << ">" << be_uidt_nl
<< node->local_name () << "_var;" << be_uidt_nl;
- *os << "typedef TAO_Array_Out_T<" << be_idt << be_idt_nl
+ *os << "typedef" << be_idt_nl
+ << "TAO_Array_Out_T<" << be_idt << be_idt_nl
<< node->local_name () << "_var," << be_nl
<< node->local_name () << "_slice," << be_nl
<< "tao_" << node->local_name () << "_life" << be_uidt_nl
- << ">" << be_nl
+ << ">" << be_uidt_nl
<< node->local_name () << "_out;" << be_uidt;
}
else
{
*os << be_nl << be_nl
- << "typedef TAO_FixedArray_Var_T<" << be_idt << be_idt_nl
+ << "typedef" << be_idt_nl
+ << "TAO_FixedArray_Var_T<" << be_idt << be_idt_nl
<< node->local_name () << "_slice," << be_nl
<< "tao_" << node->local_name () << "_life" << be_uidt_nl
- << ">" << be_nl
- << node->local_name () << "_var;" << be_uidt_nl;
+ << ">" << be_uidt_nl
+ << node->local_name () << "_var;" << be_uidt;
- *os << "typedef " << node->local_name () << " "
+ *os << be_nl << be_nl
+ << "typedef" << be_idt_nl << node->local_name () << be_nl
<< node->local_name () << "_out;" << be_uidt;
}
}
// Generate _forany decl.
*os << be_nl << be_nl
- << "typedef TAO_Array_Forany_T<" << be_idt << be_idt_nl
+ << "typedef" << be_idt_nl
+ << "TAO_Array_Forany_T<" << be_idt << be_idt_nl
<< anon_p << node->local_name () << "_slice," << be_nl
<< "tao_" << node->local_name () << "_life" << be_uidt_nl
- << ">" << be_nl
+ << ">" << be_uidt_nl
<< anon_p << node->local_name () << "_forany;" << be_uidt;
- *os << be_nl << be_nl << "// TAO_IDL - Generated from " << be_nl
- << "// " __FILE__ << ":" << __LINE__;
-
*os << be_nl << be_nl;
// The _alloc, _dup, copy, and free methods. If the node is nested, the
diff --git a/TAO/TAO_IDL/be/be_visitor_component/component_ch.cpp b/TAO/TAO_IDL/be/be_visitor_component/component_ch.cpp
index 00e54c68f37..9eebab57ad0 100644
--- a/TAO/TAO_IDL/be/be_visitor_component/component_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_component/component_ch.cpp
@@ -43,11 +43,9 @@ be_visitor_component_ch::visit_component (be_component *node)
return 0;
}
- if (node->var_out_seq_decls_gen () == 0)
- {
- node->gen_var_out_seq_decls ();
- node->var_out_seq_decls_gen (1);
- }
+ // This will be a no-op if it has already been done by a forward
+ // declaration.
+ node->gen_var_out_seq_decls ();
TAO_OutStream *os = this->ctx_->stream ();
diff --git a/TAO/TAO_IDL/be/be_visitor_enum/any_op_cs.cpp b/TAO/TAO_IDL/be/be_visitor_enum/any_op_cs.cpp
index 87048b92cb1..486d84ba535 100644
--- a/TAO/TAO_IDL/be/be_visitor_enum/any_op_cs.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_enum/any_op_cs.cpp
@@ -87,7 +87,8 @@ be_visitor_enum_any_op_cs::visit_enum (be_enum *node)
<< "template class TAO::Any_Basic_Impl_T<" << node->name () << ">;"
<< be_uidt_nl
<< "#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)" << be_nl
- << "# pragma instantiate TAO::Any_Basic_Impl_T<" << node->name ()
+ << "# pragma instantiate TAO::Any_Basic_Impl_T<"
+ << node->name () << " \\"
<< ">" << be_nl
<< "#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */";
diff --git a/TAO/TAO_IDL/be/be_visitor_exception/any_op_cs.cpp b/TAO/TAO_IDL/be/be_visitor_exception/any_op_cs.cpp
index b87ce45d599..c0c7a323eb8 100644
--- a/TAO/TAO_IDL/be/be_visitor_exception/any_op_cs.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_exception/any_op_cs.cpp
@@ -152,7 +152,8 @@ be_visitor_exception_any_op_cs::visit_exception (be_exception *node)
<< "template class TAO::Any_Dual_Impl_T<" << node->name () << ">;"
<< be_uidt_nl
<< "#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)" << be_nl
- << "# pragma instantiate TAO::Any_Dual_Impl_T<" << node->name ()
+ << "# pragma instantiate TAO::Any_Dual_Impl_T<"
+ << node->name () << " \\"
<< ">" << be_nl
<< "#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */";
diff --git a/TAO/TAO_IDL/be/be_visitor_interface/amh_ch.cpp b/TAO/TAO_IDL/be/be_visitor_interface/amh_ch.cpp
index a51bed9a6a0..99699d86b47 100644
--- a/TAO/TAO_IDL/be/be_visitor_interface/amh_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_interface/amh_ch.cpp
@@ -35,11 +35,9 @@ be_visitor_amh_interface_ch::visit_interface (be_interface *node)
return 0;
}
- if (node->var_out_seq_decls_gen () == 0)
- {
- node->gen_var_out_seq_decls ();
- node->var_out_seq_decls_gen (1);
- }
+ // This will be a no-op if it has already been done by a forward
+ // declaration.
+ node->gen_var_out_seq_decls ();
TAO_OutStream *os = this->ctx_->stream ();
diff --git a/TAO/TAO_IDL/be/be_visitor_interface/interface_ch.cpp b/TAO/TAO_IDL/be/be_visitor_interface/interface_ch.cpp
index 550c5466e96..9a7e4796098 100644
--- a/TAO/TAO_IDL/be/be_visitor_interface/interface_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_interface/interface_ch.cpp
@@ -43,11 +43,9 @@ be_visitor_interface_ch::visit_interface (be_interface *node)
return 0;
}
- if (node->var_out_seq_decls_gen () == 0)
- {
- node->gen_var_out_seq_decls ();
- node->var_out_seq_decls_gen (1);
- }
+ // This will be a no-op if it has already been done by a forward
+ // declaration.
+ node->gen_var_out_seq_decls ();
TAO_OutStream *os = this->ctx_->stream ();
long i;
diff --git a/TAO/TAO_IDL/be/be_visitor_interface_fwd/interface_fwd_ch.cpp b/TAO/TAO_IDL/be/be_visitor_interface_fwd/interface_fwd_ch.cpp
index 7a00e20e99e..b5c8399743e 100644
--- a/TAO/TAO_IDL/be/be_visitor_interface_fwd/interface_fwd_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_interface_fwd/interface_fwd_ch.cpp
@@ -50,11 +50,8 @@ be_visitor_interface_fwd_ch::visit_interface_fwd (be_interface_fwd *node)
AST_Interface *fd = node->full_definition ();
be_interface *bfd = be_interface::narrow_from_decl (fd);
- if (bfd->var_out_seq_decls_gen () == 0)
- {
- bfd->gen_var_out_seq_decls ();
- bfd->var_out_seq_decls_gen (1);
- }
+ // This will be a no-op if it has already been done for this node.
+ bfd->gen_var_out_seq_decls ();
node->cli_hdr_gen (I_TRUE);
return 0;
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp
index 28f93c7690b..bdbd358dc45 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp
@@ -72,7 +72,7 @@ int be_visitor_sequence_ch::visit_sequence (be_sequence *node)
}
*os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
- << "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
+ << "// " << __FILE__ << ":" << __LINE__;
// Generate the appropriate sequence type.
switch (node->managed_type ())
@@ -83,7 +83,8 @@ int be_visitor_sequence_ch::visit_sequence (be_sequence *node)
if (node->unbounded ())
{
- *os << "typedef" << be_idt_nl
+ *os << be_nl << be_nl
+ << "typedef" << be_idt_nl
<< "TAO_Unbounded_Object_Sequence<" << be_idt << be_idt_nl
<< bt->name () << "," << be_nl
<< bt->name () << "_var," << be_nl
@@ -93,7 +94,8 @@ int be_visitor_sequence_ch::visit_sequence (be_sequence *node)
}
else
{
- *os << "typedef" << be_idt_nl
+ *os << be_nl << be_nl
+ << "typedef" << be_idt_nl
<< "TAO_Bounded_Object_Sequence<" << be_idt << be_idt_nl
<< bt->name () << "," << be_nl
<< bt->name () << "_var," << be_nl
@@ -138,7 +140,8 @@ int be_visitor_sequence_ch::visit_sequence (be_sequence *node)
if (node->unbounded ())
{
- *os << "typedef" << be_idt_nl
+ *os << be_nl << be_nl
+ << "typedef" << be_idt_nl
<< "TAO_Unbounded_Abstract_Sequence<" << be_idt << be_idt_nl
<< bt->name () << "," << be_nl
<< bt->name () << "_var," << be_nl
@@ -147,7 +150,8 @@ int be_visitor_sequence_ch::visit_sequence (be_sequence *node)
}
else
{
- *os << "typedef" << be_idt_nl
+ *os << be_nl << be_nl
+ << "typedef" << be_idt_nl
<< "TAO_Bounded_Object_Sequence<" << be_idt << be_idt_nl
<< bt->name () << "," << be_nl
<< bt->name () << "_var," << be_nl
@@ -195,12 +199,60 @@ int be_visitor_sequence_ch::visit_sequence (be_sequence *node)
break;
case be_sequence::MNG_VALUE:
- if (node->unbounded ())
- {
- }
- else
- {
- }
+ {
+ be_interface *elem = be_interface::narrow_from_decl (bt);
+
+ if (node->unbounded ())
+ {
+ *os << be_nl << be_nl
+ << "typedef" << be_idt_nl
+ << "TAO_Unbounded_Valuetype_Sequence<" << be_idt << be_idt_nl
+ << bt->name () << "," << be_nl
+ << bt->name () << "_var," << be_nl
+ << elem->fwd_helper_name () << "_life" << be_uidt_nl
+ << ">" << be_uidt_nl
+ << node->local_name () << ";" << be_uidt;
+ }
+ else
+ {
+ *os << be_nl << be_nl
+ << "typedef" << be_idt_nl
+ << "TAO_Bounded_Valuetype_Sequence<" << be_idt << be_idt_nl
+ << bt->name () << "," << be_nl
+ << bt->name () << "_var," << be_nl
+ << elem->fwd_helper_name () << "_life," << be_nl
+ << node->max_size ()->ev ()->u.ulval << be_uidt_nl
+ << ">" << be_uidt_nl
+ << node->local_name () << ";" << be_uidt;
+ }
+
+ // Generate the _var and _out types only if we are not anonymous.
+ if (this->ctx_->tdef () != 0)
+ {
+ *os << be_nl << be_nl
+ << "typedef" << be_idt_nl
+ << "TAO_VarSeq_Var_T<" << be_idt << be_idt_nl
+ << node->local_name () << "," << be_nl
+ << "TAO_Valuetype_Manager<" << be_idt << be_idt_nl
+ << bt->name () << "," << be_nl
+ << bt->name () << "_var," << be_nl
+ << elem->fwd_helper_name () << "_life" << be_uidt_nl
+ << ">" << be_uidt << be_uidt_nl
+ << "> " << node->local_name () << "_var;" << be_uidt << be_uidt;
+
+ *os << be_nl << be_nl
+ << "typedef" << be_idt_nl
+ << "TAO_Seq_Out_T<" << be_idt << be_idt_nl
+ << node->local_name () << "," << be_nl
+ << node->local_name () << "_var," << be_nl
+ << "TAO_Valuetype_Manager<" << be_idt << be_idt_nl
+ << bt->name () << "," << be_nl
+ << bt->name () << "_var," << be_nl
+ << elem->fwd_helper_name () << "_life" << be_uidt_nl
+ << ">" << be_uidt << be_uidt_nl
+ << "> " << node->local_name () << "_out;" << be_uidt << be_uidt;
+ }
+ }
break;
case be_sequence::MNG_STRING:
@@ -227,33 +279,75 @@ int be_visitor_sequence_ch::visit_sequence (be_sequence *node)
if (node->unbounded ())
{
*os << be_nl << be_nl
- << "typedef TAO_Unbounded_Array_Sequence<"
+ << "typedef" << be_idt_nl
+ << "TAO_Unbounded_Array_Sequence<"
<< be_idt << be_idt_nl
<< bt->name () << "," << be_nl
<< bt->fwd_helper_name () << "_life" << be_uidt_nl
- << "> " << node->local_name () << ";" << be_uidt;
+ << ">" << be_uidt_nl
+ << node->local_name () << ";" << be_uidt;
}
else
{
*os << be_nl << be_nl
- << "typedef TAO_Bounded_Array_Sequence<"
+ << "typedef" << be_idt_nl
+ << "TAO_Bounded_Array_Sequence<"
<< be_idt << be_idt_nl
<< bt->name () << "," << be_nl
<< bt->fwd_helper_name () << "_life," << be_nl
<< node->max_size ()->ev ()->u.ulval << be_uidt_nl
- << "> " << node->local_name () << ";" << be_uidt;
+ << ">" << be_uidt_nl
+ << node->local_name () << ";" << be_uidt;
}
}
else
{
if (node->unbounded ())
{
+ *os << be_nl << be_nl
+ << "typedef" << be_idt_nl
+ << "TAO_Unbounded_Sequence<" << be_idt << be_idt_nl
+ << bt->name () << be_uidt_nl
+ << ">" << be_uidt_nl
+ << node->local_name () << ";" << be_uidt;
}
else
{
+ *os << be_nl << be_nl
+ << "typedef" << be_idt_nl
+ << "TAO_Bounded_Sequence<" << be_idt << be_idt_nl
+ << bt->name () << "," << be_nl
+ << node->max_size ()->ev ()->u.ulval << be_uidt_nl
+ << ">" << be_uidt_nl
+ << node->local_name () << ";" << be_uidt;
}
}
+ // Generate the _var and _out types only if we are not anonymous.
+ if (this->ctx_->tdef () != 0)
+ {
+ AST_Type::SIZE_TYPE st = bt->size_type ();
+
+ *os << be_nl << be_nl
+ << "typedef" << be_idt_nl
+ << (st == AST_Type::FIXED ? "TAO_FixedSeq_Var_T<"
+ : "TAO_VarSeq_Var_T<")
+ << be_idt << be_idt_nl
+ << node->local_name () << "," << be_nl
+ << bt->name () << be_uidt_nl
+ << ">" << be_uidt_nl
+ << node->local_name () << "_var;" << be_uidt;
+
+ *os << be_nl << be_nl
+ << "typedef" << be_idt_nl
+ << "TAO_Seq_Out_T<" << be_idt << be_idt_nl
+ << node->local_name () << "," << be_nl
+ << node->local_name () << "_var," << be_nl
+ << bt->name () << be_uidt_nl
+ << ">" << be_uidt_nl
+ << node->local_name () << "_out;" << be_uidt;
+ }
+
break;
}
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp
index 073a4a7e076..56adee4cef0 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp
@@ -44,12 +44,12 @@ int be_visitor_sequence_cs::visit_sequence (be_sequence *node)
TAO_OutStream *os = this->ctx_->stream ();
be_type *bt = be_type::narrow_from_decl (node->base_type ());
+ AST_Type::SIZE_TYPE st = bt->size_type ();
*os << be_nl << be_nl << "// TAO_IDL - Generated from " << be_nl
<< "// "__FILE__ << ":" << __LINE__;
- *os << be_nl
- << "\n#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)" << be_idt_nl;
+ os->gen_ifdef_AHETI ();
switch (node->managed_type ())
{
@@ -59,7 +59,8 @@ int be_visitor_sequence_cs::visit_sequence (be_sequence *node)
if (node->unbounded ())
{
- *os << "template class" << be_idt_nl
+ *os << be_nl << be_nl
+ << "template class" << be_idt_nl
<< "TAO_Unbounded_Object_Sequence<" << be_idt << be_idt_nl
<< elem->name () << "," << be_nl
<< elem->name () << "_var," << be_nl
@@ -69,36 +70,43 @@ int be_visitor_sequence_cs::visit_sequence (be_sequence *node)
}
else
{
- *os << "template class" << be_idt_nl
+ *os << be_nl << be_nl
+ << "template class" << be_idt_nl
<< "TAO_Bounded_Object_Sequence<" << be_idt << be_idt_nl
<< elem->name () << "," << be_nl
<< elem->name () << "_var," << be_nl
<< elem->fwd_helper_name () << "_life," << be_nl
<< elem->fwd_helper_name () << "_cast," << be_nl
<< node->max_size ()->ev ()->u.ulval << be_uidt_nl
- << ">;" << be_uidt << be_uidt_nl;
+ << ">;" << be_uidt << be_uidt;
}
- *os << "template class" << be_idt_nl
- << "TAO_VarSeq_Var_T<" << be_idt << be_idt_nl
- << node->name () << "," << be_nl
- << "TAO_Object_Manager<" << be_idt << be_idt_nl
- << elem->name () << "," << be_nl
- << elem->name () << "_var," << be_nl
- << elem->fwd_helper_name () << "_life" << be_uidt_nl
- << ">" << be_uidt << be_uidt_nl
- << ">;" << be_uidt << be_uidt_nl;
-
- *os << "template class" << be_idt_nl
- << "TAO_Seq_Out_T<" << be_idt << be_idt_nl
- << node->name () << "," << be_nl
- << node->name () << "_var," << be_nl
- << "TAO_Object_Manager<" << be_idt << be_idt_nl
- << elem->name () << "," << be_nl
- << elem->name () << "_var," << be_nl
- << elem->fwd_helper_name () << "_life" << be_uidt_nl
- << ">" << be_uidt << be_uidt_nl
- << ">;";
+ // Instantiate the _var and _out types only if we are not anonymous.
+ if (this->ctx_->tdef () != 0)
+ {
+ *os << be_nl << be_nl
+ << "template class" << be_idt_nl
+ << "TAO_VarSeq_Var_T<" << be_idt << be_idt_nl
+ << node->name () << "," << be_nl
+ << "TAO_Object_Manager<" << be_idt << be_idt_nl
+ << elem->name () << "," << be_nl
+ << elem->name () << "_var," << be_nl
+ << elem->fwd_helper_name () << "_life" << be_uidt_nl
+ << ">" << be_uidt << be_uidt_nl
+ << ">;" << be_uidt << be_uidt;
+
+ *os << be_nl << be_nl
+ << "template class" << be_idt_nl
+ << "TAO_Seq_Out_T<" << be_idt << be_idt_nl
+ << node->name () << "," << be_nl
+ << node->name () << "_var," << be_nl
+ << "TAO_Object_Manager<" << be_idt << be_idt_nl
+ << elem->name () << "," << be_nl
+ << elem->name () << "_var," << be_nl
+ << elem->fwd_helper_name () << "_life" << be_uidt_nl
+ << ">" << be_uidt << be_uidt_nl
+ << ">;" << be_uidt << be_uidt;
+ }
}
break;
@@ -108,44 +116,52 @@ int be_visitor_sequence_cs::visit_sequence (be_sequence *node)
if (node->unbounded ())
{
- *os << "template class" << be_idt_nl
+ *os << be_nl << be_nl
+ << "template class" << be_idt_nl
<< "TAO_Unbounded_Abstract_Sequence<" << be_idt << be_idt_nl
<< elem->name () << "," << be_nl
<< elem->name () << "_var," << be_nl
<< elem->fwd_helper_name () << "_life" << be_uidt_nl
- << ">;" << be_uidt << be_uidt_nl;
+ << ">;" << be_uidt << be_uidt;
}
else
{
- *os << "template class" << be_idt_nl
- << "TAO_Bounded_Object_Sequence<" << be_idt << be_idt_nl
+ *os << be_nl << be_nl
+ << "template class" << be_idt_nl
+ << "TAO_Bounded_Abstract_Sequence<" << be_idt << be_idt_nl
<< elem->name () << "," << be_nl
<< elem->name () << "_var," << be_nl
<< elem->fwd_helper_name () << "_life," << be_nl
<< node->max_size ()->ev ()->u.ulval << be_uidt_nl
- << ">;" << be_uidt << be_uidt_nl;
+ << ">;" << be_uidt << be_uidt;
}
- *os << "template class" << be_idt_nl
- << "TAO_VarSeq_Var_T<" << be_idt << be_idt_nl
- << node->name () << "," << be_nl
- << "TAO_Abstract_Manager<" << be_idt << be_idt_nl
- << elem->name () << "," << be_nl
- << elem->name () << "_var," << be_nl
- << elem->fwd_helper_name () << "_life" << be_uidt_nl
- << ">" << be_uidt << be_uidt_nl
- << ">;" << be_uidt << be_uidt_nl;
-
- *os << "template class" << be_idt_nl
- << "TAO_Seq_Out_T<" << be_idt << be_idt_nl
- << node->name () << "," << be_nl
- << node->name () << "_var," << be_nl
- << "TAO_Abstract_Manager<" << be_idt << be_idt_nl
- << elem->name () << "," << be_nl
- << elem->name () << "_var," << be_nl
- << elem->fwd_helper_name () << "_life" << be_uidt_nl
- << ">" << be_uidt << be_uidt_nl
- << ">;";
+ // Instantiate the _var and _out types only if we are not anonymous.
+ if (this->ctx_->tdef () != 0)
+ {
+ *os << be_nl << be_nl
+ << "template class" << be_idt_nl
+ << "TAO_VarSeq_Var_T<" << be_idt << be_idt_nl
+ << node->name () << "," << be_nl
+ << "TAO_Abstract_Manager<" << be_idt << be_idt_nl
+ << elem->name () << "," << be_nl
+ << elem->name () << "_var," << be_nl
+ << elem->fwd_helper_name () << "_life" << be_uidt_nl
+ << ">" << be_uidt << be_uidt_nl
+ << ">;" << be_uidt << be_uidt;
+
+ *os << be_nl << be_nl
+ << "template class" << be_idt_nl
+ << "TAO_Seq_Out_T<" << be_idt << be_idt_nl
+ << node->name () << "," << be_nl
+ << node->name () << "_var," << be_nl
+ << "TAO_Abstract_Manager<" << be_idt << be_idt_nl
+ << elem->name () << "," << be_nl
+ << elem->name () << "_var," << be_nl
+ << elem->fwd_helper_name () << "_life" << be_uidt_nl
+ << ">" << be_uidt << be_uidt_nl
+ << ">;" << be_uidt << be_uidt;
+ }
}
break;
@@ -159,12 +175,58 @@ int be_visitor_sequence_cs::visit_sequence (be_sequence *node)
break;
case be_sequence::MNG_VALUE:
- if (node->unbounded ())
- {
- }
- else
- {
- }
+ {
+ be_interface *elem = be_interface::narrow_from_decl (bt);
+
+ if (node->unbounded ())
+ {
+ *os << be_nl << be_nl
+ << "template class" << be_idt_nl
+ << "TAO_Unbounded_Valuetype_Sequence<" << be_idt << be_idt_nl
+ << elem->name () << "," << be_nl
+ << elem->name () << "_var," << be_nl
+ << elem->fwd_helper_name () << "_life" << be_uidt_nl
+ << ">;" << be_uidt << be_uidt;
+ }
+ else
+ {
+ *os << be_nl << be_nl
+ << "template class" << be_idt_nl
+ << "TAO_Bounded_Valuetype_Sequence<" << be_idt << be_idt_nl
+ << elem->name () << "," << be_nl
+ << elem->name () << "_var," << be_nl
+ << elem->fwd_helper_name () << "_life," << be_nl
+ << node->max_size ()->ev ()->u.ulval << be_uidt_nl
+ << ">;" << be_uidt << be_uidt;
+ }
+
+ // Instantiate the _var and _out types only if we are not anonymous.
+ if (this->ctx_->tdef () != 0)
+ {
+ *os << be_nl << be_nl
+ << "template class" << be_idt_nl
+ << "TAO_VarSeq_Var_T<" << be_idt << be_idt_nl
+ << node->name () << "," << be_nl
+ << "TAO_Valuetype_Manager<" << be_idt << be_idt_nl
+ << elem->name () << "," << be_nl
+ << elem->name () << "_var," << be_nl
+ << elem->fwd_helper_name () << "_life" << be_uidt_nl
+ << ">" << be_uidt << be_uidt_nl
+ << ">;" << be_uidt << be_uidt;
+
+ *os << be_nl << be_nl
+ << "template class" << be_idt_nl
+ << "TAO_Seq_Out_T<" << be_idt << be_idt_nl
+ << node->name () << "," << be_nl
+ << node->name () << "_var," << be_nl
+ << "TAO_Valuetype_Manager<" << be_idt << be_idt_nl
+ << elem->name () << "," << be_nl
+ << elem->name () << "_var," << be_nl
+ << elem->fwd_helper_name () << "_life" << be_uidt_nl
+ << ">" << be_uidt << be_uidt_nl
+ << ">;" << be_uidt << be_uidt;
+ }
+ }
break;
case be_sequence::MNG_STRING:
@@ -190,26 +252,74 @@ int be_visitor_sequence_cs::visit_sequence (be_sequence *node)
{
if (node->unbounded ())
{
+ *os << be_nl << be_nl
+ << "template class" << be_idt_nl
+ << "TAO_Unbounded_Array_Sequence<"
+ << be_idt << be_idt_nl
+ << bt->name () << "," << be_nl
+ << bt->fwd_helper_name () << "_life" << be_uidt_nl
+ << ">;" << be_uidt << be_uidt;
}
else
{
+ *os << be_nl << be_nl
+ << "template class" << be_idt_nl
+ << "TAO_Bounded_Array_Sequence<"
+ << be_idt << be_idt_nl
+ << bt->name () << "," << be_nl
+ << bt->fwd_helper_name () << "_life," << be_nl
+ << node->max_size ()->ev ()->u.ulval << be_uidt_nl
+ << ">;" << be_uidt << be_uidt;
}
}
else
{
if (node->unbounded ())
{
+ *os << be_nl << be_nl
+ << "template class" << be_idt_nl
+ << "TAO_Unbounded_Sequence<"
+ << be_idt << be_idt_nl
+ << bt->name () << be_uidt_nl
+ << ">;" << be_uidt << be_uidt;
}
else
{
+ *os << be_nl << be_nl
+ << "template class" << be_idt_nl
+ << "TAO_Bounded_Sequence<"
+ << be_idt << be_idt_nl
+ << bt->name () << "," << be_nl
+ << node->max_size ()->ev ()->u.ulval << be_uidt_nl
+ << ">;" << be_uidt << be_uidt;
}
}
+ // Instantiate the _var and _out types only if we are not anonymous.
+ if (this->ctx_->tdef () != 0)
+ {
+ *os << be_nl << be_nl
+ << "template class" << be_idt_nl
+ << (st == AST_Type::FIXED ? "TAO_FixedSeq_Var_T<"
+ : "TAO_VarSeq_Var_T<")
+ << be_idt << be_idt_nl
+ << node->local_name () << "," << be_nl
+ << bt->name () << be_uidt_nl
+ << ">;" << be_uidt << be_uidt;
+
+ *os << be_nl << be_nl
+ << "template class" << be_idt_nl
+ << "TAO_Seq_Out_T<" << be_idt << be_idt_nl
+ << node->local_name () << "," << be_nl
+ << node->local_name () << "_var," << be_nl
+ << bt->name () << be_uidt_nl
+ << ">;" << be_uidt << be_uidt;
+ }
+
break;
}
- *os << be_uidt << be_uidt << be_uidt_nl
- << "#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)" << be_nl;
+ os->gen_elif_AHETI ();
switch (node->managed_type ())
{
@@ -219,46 +329,54 @@ int be_visitor_sequence_cs::visit_sequence (be_sequence *node)
if (node->unbounded ())
{
- *os << "# pragma instantiate \\" << be_idt << be_idt_nl
+ *os << be_nl << be_nl
+ << "# pragma instantiate \\" << be_idt << be_idt_nl
<< "TAO_Unbounded_Object_Sequence< \\" << be_idt << be_idt_nl
<< elem->name () << ", \\" << be_nl
<< elem->name () << "_var, \\" << be_nl
<< elem->fwd_helper_name () << "_life, \\" << be_nl
<< elem->fwd_helper_name () << "_cast, \\" << be_uidt_nl
- << ">" << be_uidt << be_uidt << be_uidt << be_uidt_nl;
+ << ">" << be_uidt << be_uidt << be_uidt << be_uidt;
}
else
{
- *os << "# pragma instantiate \\" << be_idt << be_idt_nl
+ *os << be_nl << be_nl
+ << "# pragma instantiate \\" << be_idt << be_idt_nl
<< "TAO_Bounded_Object_Sequence< \\" << be_idt << be_idt_nl
<< elem->name () << ", \\" << be_nl
<< elem->name () << "_var, \\" << be_nl
<< elem->fwd_helper_name () << "_life, \\" << be_nl
<< elem->fwd_helper_name () << "_cast \\" << be_nl
<< node->max_size ()->ev ()->u.ulval << " \\" << be_uidt_nl
- << ">" << be_uidt << be_uidt << be_uidt << be_uidt_nl;
+ << ">" << be_uidt << be_uidt << be_uidt << be_uidt;
}
- *os << "# pragma instantiate \\" << be_idt << be_idt_nl
- << "TAO_VarSeq_Var_T< \\" << be_idt << be_idt_nl
- << node->name () << ", \\" << be_nl
- << "TAO_Object_Manager< \\" << be_idt << be_idt_nl
- << elem->name () << ", \\" << be_nl
- << elem->name () << "_var, \\" << be_nl
- << elem->fwd_helper_name () << "_life \\" << be_uidt_nl
- << "> \\" << be_uidt << be_uidt_nl
- << ">" << be_uidt << be_uidt << be_uidt_nl;
-
- *os << "# pragma instantiate \\" << be_idt << be_idt_nl
- << "TAO_Seq_Out_T< \\" << be_idt << be_idt_nl
- << node->name () << ", \\" << be_nl
- << node->name () << "_var, \\" << be_nl
- << "TAO_Object_Manager< \\" << be_idt << be_idt_nl
- << elem->name () << ", \\" << be_nl
- << elem->name () << "_var, \\" << be_nl
- << elem->fwd_helper_name () << "_life \\" << be_uidt_nl
- << "> \\" << be_uidt << be_uidt_nl
- << ">";
+ // Instantiate the _var and _out types only if we are not anonymous.
+ if (this->ctx_->tdef () != 0)
+ {
+ *os << be_nl << be_nl
+ << "# pragma instantiate \\" << be_idt << be_idt_nl
+ << "TAO_VarSeq_Var_T< \\" << be_idt << be_idt_nl
+ << node->name () << ", \\" << be_nl
+ << "TAO_Object_Manager< \\" << be_idt << be_idt_nl
+ << elem->name () << ", \\" << be_nl
+ << elem->name () << "_var, \\" << be_nl
+ << elem->fwd_helper_name () << "_life \\" << be_uidt_nl
+ << "> \\" << be_uidt << be_uidt_nl
+ << ">" << be_uidt << be_uidt << be_uidt;
+
+ *os << be_nl << be_nl
+ << "# pragma instantiate \\" << be_idt << be_idt_nl
+ << "TAO_Seq_Out_T< \\" << be_idt << be_idt_nl
+ << node->name () << ", \\" << be_nl
+ << node->name () << "_var, \\" << be_nl
+ << "TAO_Object_Manager< \\" << be_idt << be_idt_nl
+ << elem->name () << ", \\" << be_nl
+ << elem->name () << "_var, \\" << be_nl
+ << elem->fwd_helper_name () << "_life \\" << be_uidt_nl
+ << "> \\" << be_uidt << be_uidt_nl
+ << ">" << be_uidt << be_uidt;
+ }
}
break;
@@ -268,44 +386,52 @@ int be_visitor_sequence_cs::visit_sequence (be_sequence *node)
if (node->unbounded ())
{
- *os << "# pragma instantiate \\" << be_idt_nl
+ *os << be_nl << be_nl
+ << "# pragma instantiate \\" << be_idt_nl
<< "TAO_Unbounded_Abstract_Sequence< \\" << be_idt << be_idt_nl
<< elem->name () << ", \\" << be_nl
<< elem->name () << "_var, \\" << be_nl
<< elem->fwd_helper_name () << "_life \\" << be_uidt_nl
- << ">" << be_uidt << be_uidt_nl;
+ << ">" << be_uidt << be_uidt;
}
else
{
- *os << "# pragma instantiate \\" << be_idt_nl
- << "TAO_Bounded_Object_Sequence< \\" << be_idt << be_idt_nl
+ *os << be_nl << be_nl
+ << "# pragma instantiate \\" << be_idt_nl
+ << "TAO_Bounded_Abstract_Sequence< \\" << be_idt << be_idt_nl
<< elem->name () << ", \\" << be_nl
<< elem->name () << "_var, \\" << be_nl
<< elem->fwd_helper_name () << "_life, \\" << be_nl
<< node->max_size ()->ev ()->u.ulval << " \\" << be_uidt_nl
- << ">" << be_uidt << be_uidt_nl;
+ << ">" << be_uidt << be_uidt;
}
- *os << "# pragma instantiate \\" << be_idt_nl
- << "TAO_VarSeq_Var_T< \\" << be_idt << be_idt_nl
- << node->name () << ", \\" << be_nl
- << "TAO_Abstract_Manager< \\" << be_idt << be_idt_nl
- << elem->name () << ", \\" << be_nl
- << elem->name () << "_var, \\" << be_nl
- << elem->fwd_helper_name () << "_life \\" << be_uidt_nl
- << "> \\" << be_uidt << be_uidt_nl
- << ">" << be_uidt << be_uidt_nl;
-
- *os << "# pragma instantiate \\" << be_idt_nl
- << "TAO_Seq_Out_T< \\" << be_idt << be_idt_nl
- << node->name () << ", \\" << be_nl
- << node->name () << "_var, \\" << be_nl
- << "TAO_Abstract_Manager< \\" << be_idt << be_idt_nl
- << elem->name () << ", \\" << be_nl
- << elem->name () << "_var, \\" << be_nl
- << elem->fwd_helper_name () << "_life \\" << be_uidt_nl
- << "> \\" << be_uidt << be_uidt_nl
- << ">";
+ // Instantiate the _var and _out types only if we are not anonymous.
+ if (this->ctx_->tdef () != 0)
+ {
+ *os << be_nl << be_nl
+ << "# pragma instantiate \\" << be_idt_nl
+ << "TAO_VarSeq_Var_T< \\" << be_idt << be_idt_nl
+ << node->name () << ", \\" << be_nl
+ << "TAO_Abstract_Manager< \\" << be_idt << be_idt_nl
+ << elem->name () << ", \\" << be_nl
+ << elem->name () << "_var, \\" << be_nl
+ << elem->fwd_helper_name () << "_life \\" << be_uidt_nl
+ << "> \\" << be_uidt << be_uidt_nl
+ << ">" << be_uidt << be_uidt;
+
+ *os << be_nl << be_nl
+ << "# pragma instantiate \\" << be_idt_nl
+ << "TAO_Seq_Out_T< \\" << be_idt << be_idt_nl
+ << node->name () << ", \\" << be_nl
+ << node->name () << "_var, \\" << be_nl
+ << "TAO_Abstract_Manager< \\" << be_idt << be_idt_nl
+ << elem->name () << ", \\" << be_nl
+ << elem->name () << "_var, \\" << be_nl
+ << elem->fwd_helper_name () << "_life \\" << be_uidt_nl
+ << "> \\" << be_uidt << be_uidt_nl
+ << ">" << be_uidt << be_uidt;
+ }
}
break;
@@ -319,12 +445,58 @@ int be_visitor_sequence_cs::visit_sequence (be_sequence *node)
break;
case be_sequence::MNG_VALUE:
- if (node->unbounded ())
- {
- }
- else
- {
- }
+ {
+ be_interface *elem = be_interface::narrow_from_decl (bt);
+
+ if (node->unbounded ())
+ {
+ *os << be_nl << be_nl
+ << "# pragma instantiate \\" << be_idt_nl
+ << "TAO_Unbounded_Valuetype_Sequence< \\" << be_idt << be_idt_nl
+ << elem->name () << ", \\" << be_nl
+ << elem->name () << "_var, \\" << be_nl
+ << elem->fwd_helper_name () << "_life \\" << be_uidt_nl
+ << ">" << be_uidt << be_uidt;
+ }
+ else
+ {
+ *os << be_nl << be_nl
+ << "# pragma instantiate \\" << be_idt_nl
+ << "TAO_Bounded_Valuetype_Sequence< \\" << be_idt << be_idt_nl
+ << elem->name () << ", \\" << be_nl
+ << elem->name () << "_var, \\" << be_nl
+ << elem->fwd_helper_name () << "_life, \\" << be_nl
+ << node->max_size ()->ev ()->u.ulval << " \\" << be_uidt_nl
+ << ">" << be_uidt << be_uidt;
+ }
+
+ // Instantiate the _var and _out types only if we are not anonymous.
+ if (this->ctx_->tdef () != 0)
+ {
+ *os << be_nl << be_nl
+ << "# pragma instantiate \\" << be_idt_nl
+ << "TAO_VarSeq_Var_T< \\" << be_idt << be_idt_nl
+ << node->name () << ", \\" << be_nl
+ << "TAO_Valuetype_Manager< \\" << be_idt << be_idt_nl
+ << elem->name () << ", \\" << be_nl
+ << elem->name () << "_var, \\" << be_nl
+ << elem->fwd_helper_name () << "_life \\" << be_uidt_nl
+ << "> \\" << be_uidt << be_uidt_nl
+ << ">" << be_uidt << be_uidt;
+
+ *os << be_nl << be_nl
+ << "# pragma instantiate \\" << be_idt_nl
+ << "TAO_Seq_Out_T< \\" << be_idt << be_idt_nl
+ << node->name () << ", \\" << be_nl
+ << node->name () << "_var, \\" << be_nl
+ << "TAO_Valuetype_Manager< \\" << be_idt << be_idt_nl
+ << elem->name () << ", \\" << be_nl
+ << elem->name () << "_var, \\" << be_nl
+ << elem->fwd_helper_name () << "_life \\" << be_uidt_nl
+ << "> \\" << be_uidt << be_uidt_nl
+ << ">" << be_uidt << be_uidt;
+ }
+ }
break;
case be_sequence::MNG_STRING:
@@ -350,26 +522,76 @@ int be_visitor_sequence_cs::visit_sequence (be_sequence *node)
{
if (node->unbounded ())
{
+ *os << be_nl << be_nl
+ << "# pragma instantiate \\" << be_idt_nl
+ << "TAO_Unbounded_Array_Sequence< \\"
+ << be_idt << be_idt_nl
+ << bt->name () << ", \\" << be_nl
+ << bt->fwd_helper_name () << "_life \\" << be_uidt_nl
+ << ">" << be_uidt << be_uidt;
}
else
{
+ *os << be_nl << be_nl
+ << "# pragma instantiate \\" << be_idt_nl
+ << "TAO_Bounded_Array_Sequence< \\"
+ << be_idt << be_idt_nl
+ << bt->name () << ", \\" << be_nl
+ << bt->fwd_helper_name () << "_life, \\" << be_nl
+ << node->max_size ()->ev ()->u.ulval
+ << " \\" << be_uidt_nl
+ << ">" << be_uidt << be_uidt;
}
}
else
{
if (node->unbounded ())
{
+ *os << be_nl << be_nl
+ << "# pragma instantiate \\" << be_idt_nl
+ << "TAO_Unbounded_Sequence< \\"
+ << be_idt << be_idt_nl
+ << bt->name () << " \\" << be_uidt_nl
+ << ">" << be_uidt << be_uidt;
}
else
{
+ *os << be_nl << be_nl
+ << "# pragma instantiate \\" << be_idt_nl
+ << "TAO_Bounded_Sequence< \\"
+ << be_idt << be_idt_nl
+ << bt->name () << ", \\" << be_nl
+ << node->max_size ()->ev ()->u.ulval
+ << " \\" << be_uidt_nl
+ << ">" << be_uidt << be_uidt;
}
}
+ // Generate the _var and _out types only if we are not anonymous.
+ if (this->ctx_->tdef () != 0)
+ {
+ *os << be_nl << be_nl
+ << "# pragma instantiate \\" << be_idt_nl
+ << (st == AST_Type::FIXED ? "TAO_FixedSeq_Var_T< \\"
+ : "TAO_VarSeq_Var_T< \\")
+ << be_idt << be_idt_nl
+ << node->local_name () << ", \\" << be_nl
+ << bt->name () << " \\" << be_uidt_nl
+ << ">" << be_uidt << be_uidt;
+
+ *os << be_nl << be_nl
+ << "# pragma instantiate \\" << be_idt_nl
+ << "TAO_Seq_Out_T< \\" << be_idt << be_idt_nl
+ << node->local_name () << ", \\" << be_nl
+ << node->local_name () << "_var, \\" << be_nl
+ << bt->name () << " \\" << be_uidt_nl
+ << ">" << be_uidt << be_uidt;
+ }
+
break;
}
- *os << be_uidt << be_uidt << be_uidt_nl
- << "#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */";
+ os->gen_endif_AHETI ();
node->cli_stub_gen (1);
return 0;
diff --git a/TAO/TAO_IDL/be/be_visitor_structure/structure_ch.cpp b/TAO/TAO_IDL/be/be_visitor_structure/structure_ch.cpp
index cba35e725bc..b146c76a047 100644
--- a/TAO/TAO_IDL/be/be_visitor_structure/structure_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_structure/structure_ch.cpp
@@ -45,12 +45,14 @@ int be_visitor_structure_ch::visit_structure (be_structure *node)
TAO_OutStream *os = this->ctx_->stream ();
- *os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
- << "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
+ // Generate the _var and _out typedefs.
+ node->gen_common_varout (os);
- *os << "class " << node->local_name () << "_var;" << be_nl << be_nl;
+ *os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
+ << "// " << __FILE__ << ":" << __LINE__;
- *os << "struct " << be_global->stub_export_macro () << " "
+ *os << be_nl << be_nl
+ << "struct " << be_global->stub_export_macro () << " "
<< node->local_name () << be_nl
<< "{" << be_idt_nl;
@@ -76,38 +78,6 @@ int be_visitor_structure_ch::visit_structure (be_structure *node)
*os << be_uidt_nl;
*os << "};";
- // Generate var definition.
- if (node->gen_var_defn () == -1)
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_visitor_structure_ch::"
- "visit_structure - "
- "codegen for _var failed\n"),
- -1);
- }
-
- // A class is generated for an out defn only for a variable
- // length struct.
- if (node->size_type () == AST_Type::VARIABLE)
- {
- if (node->gen_out_defn () == -1)
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_visitor_structure_ch::"
- "visit_structure - "
- "codegen for _out failed\n"),
- -1);
- }
- }
- else
- {
- *os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
- << "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
-
- *os << "typedef " << node->local_name () << " &"
- << node->local_name () << "_out;";
- }
-
if (be_global->tc_support ())
{
be_visitor_context ctx (*this->ctx_);
diff --git a/TAO/TAO_IDL/be/be_visitor_structure/structure_ci.cpp b/TAO/TAO_IDL/be/be_visitor_structure/structure_ci.cpp
index c80cd5f007d..66aedd493f2 100644
--- a/TAO/TAO_IDL/be/be_visitor_structure/structure_ci.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_structure/structure_ci.cpp
@@ -38,39 +38,21 @@ be_visitor_structure_ci::~be_visitor_structure_ci (void)
// visit the Structure node and its scope
int be_visitor_structure_ci::visit_structure (be_structure *node)
{
- if (!node->cli_inline_gen () && !node->imported ())
+ if (node->cli_inline_gen () || node->imported ())
{
- if (node->gen_var_impl () == -1)
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_visitor_structure_ci::"
- "visit_structure - "
- "codegen for _var failed\n"),
- -1);
- }
-
- if (node->size_type () == AST_Type::VARIABLE &&
- node->gen_out_impl () == -1)
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_visitor_structure_ci::"
- "visit_structure - "
- "codegen for _out failed\n"),
- -1);
- }
-
- // all we have to do is to visit the scope
- if (this->visit_scope (node) == -1)
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_visitor_structure_ci::"
- "visit_structure - "
- "codegen for scope failed\n"),
- -1);
- }
+ return 0;
+ }
- node->cli_inline_gen (I_TRUE);
+ // All we have to do is to visit the scope.
+ if (this->visit_scope (node) == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_visitor_structure_ci::"
+ "visit_structure - "
+ "codegen for scope failed\n"),
+ -1);
}
+ node->cli_inline_gen (I_TRUE);
return 0;
}
diff --git a/TAO/TAO_IDL/be/be_visitor_structure/structure_cs.cpp b/TAO/TAO_IDL/be/be_visitor_structure/structure_cs.cpp
index a160d3c2900..7db67b176ef 100644
--- a/TAO/TAO_IDL/be/be_visitor_structure/structure_cs.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_structure/structure_cs.cpp
@@ -88,6 +88,10 @@ be_visitor_structure_cs::visit_structure (be_structure *node)
-1);
}
+ // Generate the conditional explicit template instantiations for our
+ // _var and/or _out clases.
+ node->gen_common_tmplinst (os);
+
node->cli_stub_gen (I_TRUE);
return 0;
}
diff --git a/TAO/TAO_IDL/be/be_visitor_structure_fwd.cpp b/TAO/TAO_IDL/be/be_visitor_structure_fwd.cpp
index 3d9cd997639..85cb72ef70f 100644
--- a/TAO/TAO_IDL/be/be_visitor_structure_fwd.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_structure_fwd.cpp
@@ -19,6 +19,7 @@
// ============================================================================
#include "be_structure_fwd.h"
+#include "be_structure.h"
#include "be_visitor_structure_fwd.h"
#include "be_visitor_context.h"
diff --git a/TAO/TAO_IDL/be/be_visitor_structure_fwd/structure_fwd_ch.cpp b/TAO/TAO_IDL/be/be_visitor_structure_fwd/structure_fwd_ch.cpp
index a60ed387127..8c87e56dcfb 100644
--- a/TAO/TAO_IDL/be/be_visitor_structure_fwd/structure_fwd_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_structure_fwd/structure_fwd_ch.cpp
@@ -44,17 +44,11 @@ be_visitor_structure_fwd_ch::visit_structure_fwd (be_structure_fwd *node)
TAO_OutStream *os = this->ctx_->stream ();
- if (node->cli_hdr_gen () || node->imported ())
- {
- return 0;
- }
-
- *os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
- << "// " << __FILE__ << ":" << __LINE__;
+ be_structure *fd =
+ be_structure::narrow_from_decl (node->full_definition ());
- // Generate a forward declaration of the class.
- *os << be_nl << be_nl
- << "struct " << node->local_name () << ";";
+ // This will be a no-op if it has already been done for this node.
+ fd->gen_common_varout (os);
node->cli_hdr_gen (I_TRUE);
return 0;
diff --git a/TAO/TAO_IDL/be/be_visitor_union/union_ch.cpp b/TAO/TAO_IDL/be/be_visitor_union/union_ch.cpp
index 87eee4b15e5..80381a7b6d3 100644
--- a/TAO/TAO_IDL/be/be_visitor_union/union_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_union/union_ch.cpp
@@ -49,16 +49,14 @@ int be_visitor_union_ch::visit_union (be_union *node)
TAO_OutStream *os = this->ctx_->stream ();
- *os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
- << "// " << __FILE__ << ":" << __LINE__;
+ // Generate _var and _out class typedefs.
+ node->gen_common_varout (os);
// Generate the ifdefined macro for the union type.
os->gen_ifdef_macro (node->flat_name ());
*os << be_nl << be_nl
- << "class " << node->local_name () << "_var;" << be_nl << be_nl;
-
- *os << "class " << be_global->stub_export_macro () << " "
+ << "class " << be_global->stub_export_macro () << " "
<< node->local_name () << be_nl
<< "{" << be_nl
<< "public:" << be_idt_nl
@@ -200,45 +198,6 @@ int be_visitor_union_ch::visit_union (be_union *node)
os->gen_endif ();
- // Generate the ifdefined macro for the _var type.
- os->gen_ifdef_macro (node->flat_name (), "_var");
-
- // Generate var definition.
- if (node->gen_var_defn () == -1)
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_visitor_union_ch::"
- "visit_union - "
- "codegen for _var\n"), -1);
- }
-
- os->gen_endif ();
-
- // Generate the ifdefined macro for the array type.
- os->gen_ifdef_macro (node->flat_name (), "_out");
-
- // A class is generated for an out defn only for a variable
- // length struct.
- if (node->size_type () == AST_Type::VARIABLE)
- {
- if (node->gen_out_defn () == -1)
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_visitor_union_ch::"
- "visit_union - "
- "codegen for _out\n"), -1);
- }
- }
- else
- {
- *os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
- << "// " << __FILE__ << ":" << __LINE__;
-
- *os << be_nl << be_nl << "typedef " << node->local_name () << " &"
- << node->local_name () << "_out;";
- }
-
- os->gen_endif ();
node->cli_hdr_gen (I_TRUE);
return 0;
}
diff --git a/TAO/TAO_IDL/be/be_visitor_union/union_ci.cpp b/TAO/TAO_IDL/be/be_visitor_union/union_ci.cpp
index f349e99661d..6333a8f4945 100644
--- a/TAO/TAO_IDL/be/be_visitor_union/union_ci.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_union/union_ci.cpp
@@ -91,36 +91,6 @@ int be_visitor_union_ci::visit_union (be_union *node)
-1);
}
- // Generate the ifdefined macro for the array type.
- os->gen_ifdef_macro (node->flat_name (), "_var");
-
- if (node->gen_var_impl () == -1)
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_visitor_union_ci::"
- "visit_union - "
- "codegen for _var failed\n"),
- -1);
- }
-
- os->gen_endif ();
-
- // Generate the ifdefined macro for the array type then generate the
- // _out impl
- os->gen_ifdef_macro (node->flat_name (), "_out");
-
- if (node->size_type () == AST_Type::VARIABLE
- && node->gen_out_impl () == -1)
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_visitor_union_ci::"
- "visit_union - "
- "codegen for _out failed\n"),
- -1);
- }
-
- os->gen_endif ();
-
node->cli_inline_gen (I_TRUE);
return 0;
}
diff --git a/TAO/TAO_IDL/be/be_visitor_union/union_cs.cpp b/TAO/TAO_IDL/be/be_visitor_union/union_cs.cpp
index b638b8807ac..34e4b8ecb44 100644
--- a/TAO/TAO_IDL/be/be_visitor_union/union_cs.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_union/union_cs.cpp
@@ -292,6 +292,10 @@ int be_visitor_union_cs::visit_union (be_union *node)
}
}
+ // Generate conditional explicit template instantiations for our
+ // _var and/or _out classes.
+ node->gen_common_tmplinst (os);
+
node->cli_stub_gen (I_TRUE);
return 0;
}
diff --git a/TAO/TAO_IDL/be/be_visitor_union_fwd.cpp b/TAO/TAO_IDL/be/be_visitor_union_fwd.cpp
index 79ed60e34cc..e50944b28e9 100644
--- a/TAO/TAO_IDL/be/be_visitor_union_fwd.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_union_fwd.cpp
@@ -19,6 +19,7 @@
// ============================================================================
#include "be_union_fwd.h"
+#include "be_union.h"
#include "be_visitor_union_fwd.h"
#include "be_visitor_context.h"
diff --git a/TAO/TAO_IDL/be/be_visitor_union_fwd/union_fwd_ch.cpp b/TAO/TAO_IDL/be/be_visitor_union_fwd/union_fwd_ch.cpp
index 455b4fdec48..474c49e7075 100644
--- a/TAO/TAO_IDL/be/be_visitor_union_fwd/union_fwd_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_union_fwd/union_fwd_ch.cpp
@@ -43,13 +43,10 @@ be_visitor_union_fwd_ch::visit_union_fwd (be_union_fwd *node)
}
TAO_OutStream *os = this->ctx_->stream ();
+ be_union *fd = be_union::narrow_from_decl (node->full_definition ());
- *os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
- << "// " << __FILE__ << ":" << __LINE__;
-
- // Generate a forward declaration of the class.
- *os << be_nl << be_nl
- << "class " << node->local_name () << ";";
+ // This will be a no-op if it has already been done for this node.
+ fd->gen_common_varout (os);
node->cli_hdr_gen (I_TRUE);
return 0;
diff --git a/TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_ch.cpp b/TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_ch.cpp
index 733c020ea79..216fbd35b8d 100644
--- a/TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_ch.cpp
@@ -45,11 +45,9 @@ be_visitor_valuetype_ch::visit_valuetype (be_valuetype *node)
return 0;
}
- if (node->var_out_seq_decls_gen () == 0)
- {
- node->gen_var_out_seq_decls ();
- node->var_out_seq_decls_gen (1);
- }
+ // This will be a no-op if it has alread by done by a forward
+ // declaration.
+ node->gen_var_out_seq_decls ();
TAO_OutStream *os = this->ctx_->stream ();
int status = 0;
diff --git a/TAO/TAO_IDL/be/be_visitor_valuetype_fwd/valuetype_fwd_ch.cpp b/TAO/TAO_IDL/be/be_visitor_valuetype_fwd/valuetype_fwd_ch.cpp
index a64d3b5a7c5..987845541cc 100644
--- a/TAO/TAO_IDL/be/be_visitor_valuetype_fwd/valuetype_fwd_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_valuetype_fwd/valuetype_fwd_ch.cpp
@@ -47,11 +47,8 @@ be_visitor_valuetype_fwd_ch::visit_valuetype_fwd (be_valuetype_fwd *node)
AST_Interface *fd = node->full_definition ();
be_valuetype *bfd = be_valuetype::narrow_from_decl (fd);
- if (bfd->var_out_seq_decls_gen () == 0)
- {
- bfd->gen_var_out_seq_decls ();
- bfd->var_out_seq_decls_gen (1);
- }
+ // This will be a no-op if it has already been done for this node.
+ bfd->gen_var_out_seq_decls ();
node->cli_hdr_gen (I_TRUE);
return 0;
diff --git a/TAO/TAO_IDL/be_include/be_component.h b/TAO/TAO_IDL/be_include/be_component.h
index bddd9f35a66..6b36761bc1e 100644
--- a/TAO/TAO_IDL/be_include/be_component.h
+++ b/TAO/TAO_IDL/be_include/be_component.h
@@ -44,6 +44,9 @@ public:
~be_component (void);
+ virtual void redefine (AST_Interface *from);
+ // Catch BE-specific members before delegating to the base class.
+
// Cleanup function.
virtual void destroy (void);
diff --git a/TAO/TAO_IDL/be_include/be_helper.h b/TAO/TAO_IDL/be_include/be_helper.h
index b2caf8864e6..c3fdaf52c6b 100644
--- a/TAO/TAO_IDL/be_include/be_helper.h
+++ b/TAO/TAO_IDL/be_include/be_helper.h
@@ -150,8 +150,8 @@ public:
int gen_ifdef_AHETI (void);
// generate the ACE_HAS_EXPLICIT... ifdef
- int gen_else_AHETI (void);
- // generate the ACE_HAS_EXPLICIT... else
+ int gen_elif_AHETI (void);
+ // generate the ACE_HAS_EXPLICIT... elif
int gen_endif_AHETI (void);
// generate the ACE_HAS_EXPLICIT... endif
diff --git a/TAO/TAO_IDL/be_include/be_interface.h b/TAO/TAO_IDL/be_include/be_interface.h
index 49a1a9c261d..a4a385f9575 100644
--- a/TAO/TAO_IDL/be_include/be_interface.h
+++ b/TAO/TAO_IDL/be_include/be_interface.h
@@ -99,7 +99,7 @@ public:
const char *local_coll_name (int) const;
// Retrieve the fully qualified collocated class name.
- virtual const char *base_proxy_impl_name (void);
+ virtual const char *base_proxy_impl_name (void);
// retrieve the name of the base proxy implementation.
virtual const char *full_base_proxy_impl_name (void);
@@ -217,6 +217,9 @@ public:
void in_mult_inheritance (int mi);
// Set a new value.
+ virtual void redefine (AST_Interface *from);
+ // Pass along BE-specific member values when redefining a fwd decl.
+
virtual void destroy (void);
// Cleanup function.
@@ -331,10 +334,6 @@ public:
int has_mixed_parentage (void);
// Do we have both abstract and concrete parents?
- int var_out_seq_decls_gen (void) const;
- void var_out_seq_decls_gen (int val);
- // Accessors for the members.
-
private:
void gen_gperf_input_header (TAO_OutStream *ss);
// Output the header (type declaration and %%) to the gperf's input
@@ -370,6 +369,10 @@ private:
void gen_linear_search_instance (const char *flat_name);
// Create an instance of the linear search optable.
+protected:
+ int var_out_seq_decls_gen_;
+ // Have these been done already?
+
private:
int skel_count_;
// Number of static skeletons in the operation table.
@@ -387,9 +390,6 @@ private:
int has_mixed_parentage_;
// Do we have both abstract and concrete parents?
-
- int var_out_seq_decls_gen_;
- // Have these been done already?
};
/**
diff --git a/TAO/TAO_IDL/be_include/be_structure.h b/TAO/TAO_IDL/be_include/be_structure.h
index 7d337d7e440..6a48bd892f7 100644
--- a/TAO/TAO_IDL/be_include/be_structure.h
+++ b/TAO/TAO_IDL/be_include/be_structure.h
@@ -42,19 +42,9 @@ public:
idl_bool abstract);
// Constructor.
- virtual int gen_var_defn (char *local_name = 0);
- // Generate the _var class definition.
-
- virtual int gen_var_impl (char *local_name = 0,
- char *full_name = 0);
- // Generate the implementation for the _var class.
-
- virtual int gen_out_defn (char *local_name = 0);
- // Generate the _out class definition.
-
- virtual int gen_out_impl (char *local_name = 0,
- char *full_name = 0);
- // Generate the _out implementation.
+ virtual void redefine (AST_Structure *from);
+ // Copy BE-specific values when redefining struct or union
+ // from a forward declaration.
virtual void destroy (void);
// Cleanup method.
diff --git a/TAO/TAO_IDL/be_include/be_type.h b/TAO/TAO_IDL/be_include/be_type.h
index 34b06109515..5f5d0bfea5c 100644
--- a/TAO/TAO_IDL/be_include/be_type.h
+++ b/TAO/TAO_IDL/be_include/be_type.h
@@ -57,6 +57,12 @@ public:
const char *fwd_helper_name (void) const;
// Accessor to the member.
+ void gen_common_varout (TAO_OutStream *os);
+ // Generate _var and _out typedefs for structs and unions.
+
+ void gen_common_tmplinst (TAO_OutStream *os);
+ // Generate explicit template instantiations for the above.
+
virtual AST_Decl::NodeType base_node_type (void) const;
// Typedefs are tricky to handle, in many points their mapping
// depend on base type they are aliasing. Since typedefs can be
@@ -81,7 +87,10 @@ protected:
// Typecode name.
ACE_CString fwd_helper_name_;
- // Calculate this in one place.
+ // Used by interfaces, valuetypes and arrays to name helper structs.
+
+ idl_bool common_varout_gen_;
+ // Have we generated our _var and _out class typedefs yet?
};
#endif // end of if !defined
diff --git a/TAO/TAO_IDL/be_include/be_union.h b/TAO/TAO_IDL/be_include/be_union.h
index 2901fa1bf2f..94153173192 100644
--- a/TAO/TAO_IDL/be_include/be_union.h
+++ b/TAO/TAO_IDL/be_include/be_union.h
@@ -43,19 +43,8 @@ public:
idl_bool abstract);
// Constructor.
- virtual int gen_var_defn (char *local_name = 0);
- // Generate the _var class definition.
-
- virtual int gen_var_impl (char *local_name = 0,
- char *full_name = 0);
- // Generate the implementation for the _var class.
-
- virtual int gen_out_defn (char *local_name = 0);
- // Generate the _out class definition.
-
- virtual int gen_out_impl (char *local_name = 0,
- char *full_name = 0);
- // Generate the _out implementation.
+ virtual void redefine (AST_Structure *from);
+ // Catch BE-specific member values before delegating to the base class.
virtual idl_bool has_duplicate_case_labels (void);
// Do we have at least one member with multiple case labels?
diff --git a/TAO/TAO_IDL/be_include/be_valuetype.h b/TAO/TAO_IDL/be_include/be_valuetype.h
index 886b2e81ebd..5b7c2f4fdfd 100644
--- a/TAO/TAO_IDL/be_include/be_valuetype.h
+++ b/TAO/TAO_IDL/be_include/be_valuetype.h
@@ -144,10 +144,6 @@ public:
// Helper method to generate *_skel operations for the concrete
// interface that we support (if any) and those of its base classes.
- int var_out_seq_decls_gen (void) const;
- void var_out_seq_decls_gen (int val);
- // Accessors for the members.
-
const char *fwd_helper_name (void) const;
// Accessor to the member.
diff --git a/TAO/tao/Sequence_T.cpp b/TAO/tao/Sequence_T.cpp
index fa44243a940..d38b2ff5b85 100644
--- a/TAO/tao/Sequence_T.cpp
+++ b/TAO/tao/Sequence_T.cpp
@@ -97,6 +97,18 @@ TAO_Unbounded_Sequence<T>::~TAO_Unbounded_Sequence (void)
template<typename T>
void
+TAO_Unbounded_Sequence<T>::_tao_any_destructor (
+ void * _tao_void_pointer
+ )
+{
+ typedef TAO_Unbounded_Sequence<T> THIS_SEQ_TYPE;
+ THIS_SEQ_TYPE *tmp = ACE_static_cast (THIS_SEQ_TYPE *,
+ _tao_void_pointer);
+ delete tmp;
+}
+
+template<typename T>
+void
TAO_Unbounded_Sequence<T>::_allocate_buffer (CORBA::ULong length)
{
T * tmp = TAO_Unbounded_Sequence<T>::allocbuf (length);
@@ -301,6 +313,18 @@ TAO_Bounded_Sequence<T, MAX>::~TAO_Bounded_Sequence (void)
this->_deallocate_buffer ();
}
+template<typename T, size_t MAX>
+void
+TAO_Bounded_Sequence<T, MAX>::_tao_any_destructor (
+ void * _tao_void_pointer
+ )
+{
+ typedef TAO_Bounded_Sequence<T, MAX> THIS_SEQ_TYPE;
+ THIS_SEQ_TYPE *tmp = ACE_static_cast (THIS_SEQ_TYPE *,
+ _tao_void_pointer);
+ delete tmp;
+}
+
template<typename T, size_t MAX>
void
TAO_Bounded_Sequence<T, MAX>::_allocate_buffer (CORBA::ULong)
diff --git a/TAO/tao/Sequence_T.h b/TAO/tao/Sequence_T.h
index d794d23dead..91f9825e0d7 100644
--- a/TAO/tao/Sequence_T.h
+++ b/TAO/tao/Sequence_T.h
@@ -77,6 +77,8 @@ public:
/// Free the sequence.
static void freebuf (T *);
+ static void _tao_any_destructor (void *);
+
/// Implement the TAO_Base_Sequence methods (see Sequence.h)
virtual void _allocate_buffer (CORBA::ULong length);
virtual void _deallocate_buffer (void);
@@ -180,6 +182,8 @@ public:
/// Free the sequence.
static void freebuf (T *);
+ static void _tao_any_destructor (void *);
+
/// allocate a buffer of the requested length. The buffer is allocated for
/// the right type
virtual void _allocate_buffer (CORBA::ULong length);
diff --git a/TAO/tao/VarOut_T.h b/TAO/tao/VarOut_T.h
index 5868401ae75..0a061a59927 100644
--- a/TAO/tao/VarOut_T.h
+++ b/TAO/tao/VarOut_T.h
@@ -44,10 +44,11 @@ public:
operator T & ();
operator T & () const;
- // in, inout, out, _retn
+ // Common mapping for fixed and variable size types.
const T & in (void) const;
T & inout (void);
+ // TAO extension.
T * ptr (void) const;
protected:
@@ -76,13 +77,9 @@ public:
TAO_Fixed_Var_T & operator= (const TAO_Fixed_Var_T<T> &);
// Fixed-size types only.
-
TAO_Fixed_Var_T & operator= (const T &);
- operator const T & () const;
- operator T & ();
- operator T & () const;
-
+ // Mapping for fixed size types.
T & out (void);
T _retn (void);
};
@@ -105,14 +102,10 @@ public:
TAO_Var_Var_T & operator= (T *);
TAO_Var_Var_T & operator= (const TAO_Var_Var_T<T> &);
- operator const T & () const;
- operator T & ();
- operator T & () const;
-
// Variable size types only.
-
operator T *& ();
+ // Mapping for variable size types.
T *& out (void);
T * _retn (void);
};
diff --git a/TAO/tao/VarOut_T.inl b/TAO/tao/VarOut_T.inl
index 76546ce4d03..3fb5c1f5642 100644
--- a/TAO/tao/VarOut_T.inl
+++ b/TAO/tao/VarOut_T.inl
@@ -36,6 +36,27 @@ TAO_Var_Base_T<T>::operator-> (void)
}
template<typename T>
+ACE_INLINE
+TAO_Var_Base_T<T>::operator const T & () const
+{
+ return *this->ptr_;
+}
+
+template<typename T>
+ACE_INLINE
+TAO_Var_Base_T<T>::operator T & ()
+{
+ return *this->ptr_;
+}
+
+template<typename T>
+ACE_INLINE
+TAO_Var_Base_T<T>::operator T & () const
+{
+ return *this->ptr_;
+}
+
+template<typename T>
ACE_INLINE
const T &
TAO_Var_Base_T<T>::in (void) const
@@ -97,27 +118,6 @@ TAO_Fixed_Var_T<T>::operator= (T * p)
return *this;
}
-template<typename T>
-ACE_INLINE
-TAO_Fixed_Var_T<T>::operator const T & () const
-{
- return *this->ptr_;
-}
-
-template<typename T>
-ACE_INLINE
-TAO_Fixed_Var_T<T>::operator T & ()
-{
- return *this->ptr_;
-}
-
-template<typename T>
-ACE_INLINE
-TAO_Var_Base_T<T>::operator T & () const
-{
- return *this->ptr_;
-}
-
// Mapping for fixed size.
template<typename T>
ACE_INLINE
@@ -164,27 +164,6 @@ TAO_Var_Var_T<T>::operator= (T * p)
return *this;
}
-template<typename T>
-ACE_INLINE
-TAO_Var_Var_T<T>::operator const T & () const
-{
- return *this->ptr_;
-}
-
-template<typename T>
-ACE_INLINE
-TAO_Var_Var_T<T>::operator T & ()
-{
- return *this->ptr_;
-}
-
-template<typename T>
-ACE_INLINE
-TAO_Var_Var_T<T>::operator T & () const
-{
- return *this->ptr_;
-}
-
// Variable-size types only.
template<typename T>
ACE_INLINE