summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorparsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2003-03-21 08:35:17 +0000
committerparsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2003-03-21 08:35:17 +0000
commit6a2a0f5c189375927c8dbb34bb6c8b62ff197fd8 (patch)
tree55552778ce38abc0f5dc7cd50c7e3127d2a178bf
parent5a0c8eb40e9b6bf0d3ccae94fc3ca286d9584a99 (diff)
downloadATCD-6a2a0f5c189375927c8dbb34bb6c8b62ff197fd8.tar.gz
ChangeLogTag: Fri Mar 21 02:33:00 2003 Jeff Parsons <j.parsons@vanderbilt.edu>
-rw-r--r--TAO/ChangeLog28
-rw-r--r--TAO/TAO_IDL/be/be_interface.cpp54
-rw-r--r--TAO/TAO_IDL/be/be_valuetype.cpp576
-rw-r--r--TAO/TAO_IDL/be/be_visitor_interface/interface_cs.cpp25
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp118
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp255
-rw-r--r--TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_ch.cpp51
-rw-r--r--TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_cs.cpp63
-rw-r--r--TAO/TAO_IDL/be/be_visitor_valuetype_fwd/valuetype_fwd_ch.cpp56
-rw-r--r--TAO/TAO_IDL/be_include/be_interface.h9
-rw-r--r--TAO/TAO_IDL/be_include/be_valuetype.h31
-rw-r--r--TAO/tao/Objref_VarOut_T.cpp8
-rw-r--r--TAO/tao/Objref_VarOut_T.h2
-rw-r--r--TAO/tao/Sequence_T.cpp24
-rw-r--r--TAO/tao/Sequence_T.h8
-rw-r--r--TAO/tao/TAO.dsp31
-rw-r--r--TAO/tao/Value_VarOut_T.cpp192
-rw-r--r--TAO/tao/Value_VarOut_T.h101
-rw-r--r--TAO/tao/corba.h1
19 files changed, 888 insertions, 745 deletions
diff --git a/TAO/ChangeLog b/TAO/ChangeLog
index f98115e3ca5..5c5f8472860 100644
--- a/TAO/ChangeLog
+++ b/TAO/ChangeLog
@@ -1,3 +1,31 @@
+Fri Mar 21 02:33:00 2003 Jeff Parsons <j.parsons@vanderbilt.edu>
+
+ * TAO_IDL/be/be_interface.cpp:
+ * TAO_IDL/be/be_valuetype.cpp:
+ * TAO_IDL/be/be_visitor_interface/interface_cs.cpp:
+ * TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp:
+ * TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp:
+ * TAO_IDL/be/be_visitor_valuetype/valuetype_ch.cpp:
+ * TAO_IDL/be/be_visitor_valuetype/valuetype_cs.cpp:
+ * TAO_IDL/be/be_visitor_valuetype_fwd/valuetype_fwd_ch.cpp:
+ * TAO_IDL/be_include/be_interface.h:
+ * TAO_IDL/be_include/be_valuetype.h:
+ * tao/Objref_VarOut_T.cpp:
+ * tao/Objref_VarOut_T.h:
+ * tao/Sequence_T.cpp:
+ * tao/Sequence_T.h:
+ * tao/TAO.dsp:
+ * tao/corba.h:
+
+ Modified code generation for sequences of object references,
+ added conditional explicit template instantiation, template
+ valuetype _var and _out class generation.
+
+ * tao/Value_VarOut_T.cpp:
+ * tao/Value_VarOut_T.h:
+
+ New files for the valuetype _var and _out classes.
+
Wed Mar 19 18:40:03 2003 Jeff Parsons <j.parsons@vanderbilt.edu>
* TAO_IDL/be/be_interface.cpp:
diff --git a/TAO/TAO_IDL/be/be_interface.cpp b/TAO/TAO_IDL/be/be_interface.cpp
index d0e6c3dbcc4..5de15921286 100644
--- a/TAO/TAO_IDL/be/be_interface.cpp
+++ b/TAO/TAO_IDL/be/be_interface.cpp
@@ -46,8 +46,7 @@ be_interface::be_interface (void)
in_mult_inheritance_ (-1),
original_interface_ (0),
has_mixed_parentage_ (-1),
- var_out_seq_decls_gen_ (0),
- var_out_seq_defns_gen_ (0)
+ var_out_seq_decls_gen_ (0)
{
ACE_NEW (this->strategy_,
be_interface_default_strategy (this));
@@ -77,11 +76,40 @@ be_interface::be_interface (UTL_ScopedName *n,
in_mult_inheritance_ (-1),
original_interface_ (0),
has_mixed_parentage_ (-1),
- var_out_seq_decls_gen_ (0),
- var_out_seq_defns_gen_ (0)
+ var_out_seq_decls_gen_ (0)
{
ACE_NEW (this->strategy_,
be_interface_default_strategy (this));
+
+ AST_Decl *parent = ScopeAsDecl (this->defined_in ());
+ Identifier *segment = 0;
+ char *tmp = 0;
+
+ if (parent != 0 && parent->node_type () != AST_Decl::NT_root)
+ {
+ for (UTL_IdListActiveIterator i (parent->name ());
+ !i.is_done ();
+ i.next ())
+ {
+ segment = i.item ();
+ tmp = segment->get_string ();
+
+ if (ACE_OS::strcmp (tmp, "") == 0)
+ {
+ continue;
+ }
+
+ this->fwd_helper_name_ += tmp;
+ this->fwd_helper_name_ += "::";
+ }
+ }
+ else
+ {
+ this->fwd_helper_name_= "";
+ }
+
+ this->fwd_helper_name_ += "tao_";
+ this->fwd_helper_name_ += this->local_name ();
}
be_interface::~be_interface (void)
@@ -553,9 +581,9 @@ be_interface:: gen_var_out_seq_decls (void)
<< "typedef " << lname << " *" << lname << "_ptr;" << be_nl
<< "struct tao_" << lname << "_life;" << be_nl
<< "typedef TAO_Objref_Var_T<" << lname << ", tao_"
- << lname << "_life>" << lname << "_var;" << be_nl
+ << lname << "_life> " << lname << "_var;" << be_nl
<< "typedef TAO_Objref_Out_T<" << lname << ", tao_"
- << lname << "_life>" << lname << "_out;";
+ << lname << "_life> " << lname << "_out;";
*os << be_nl << be_nl
<< "struct tao_" << lname << "_life" << be_nl
@@ -567,7 +595,7 @@ be_interface:: gen_var_out_seq_decls (void)
<< "static CORBA::Boolean tao_marshal (" << be_idt << be_idt_nl
<< lname << "_ptr," << be_nl
<< "TAO_OutputCDR &" << be_uidt_nl
- << ");" << be_uidt_nl
+ << ");" << be_uidt << be_uidt_nl
<< "};";
*os << be_nl << be_nl
@@ -2001,16 +2029,10 @@ be_interface::var_out_seq_decls_gen (int val)
this->var_out_seq_decls_gen_ = val;
}
-int
-be_interface::var_out_seq_defns_gen (void) const
-{
- return this->var_out_seq_defns_gen_;
-}
-
-void
-be_interface::var_out_seq_defns_gen (int val)
+const char *
+be_interface::fwd_helper_name (void) const
{
- this->var_out_seq_defns_gen_ = val;
+ return this->fwd_helper_name_.fast_rep ();
}
const char *
diff --git a/TAO/TAO_IDL/be/be_valuetype.cpp b/TAO/TAO_IDL/be/be_valuetype.cpp
index e3a1a2465ec..c438ea9c48b 100644
--- a/TAO/TAO_IDL/be/be_valuetype.cpp
+++ b/TAO/TAO_IDL/be/be_valuetype.cpp
@@ -23,6 +23,7 @@
#include "be_extern.h"
#include "be_helper.h"
#include "ast_module.h"
+#include "utl_identifier.h"
#include "idl_defines.h"
#include "nr_extern.h"
#include "ace/Log_Msg.h"
@@ -92,7 +93,8 @@ be_valuetype::be_valuetype (UTL_ScopedName *n,
COMMON_Base (0,
abstract),
full_obv_skel_name_ (0),
- supports_abstract_ (0)
+ supports_abstract_ (0),
+ var_out_seq_decls_gen_ (0)
{
// Check that redefine() copies all members.
@@ -117,6 +119,36 @@ be_valuetype::be_valuetype (UTL_ScopedName *n,
break;
}
}
+
+ AST_Decl *parent = ScopeAsDecl (this->defined_in ());
+ Identifier *segment = 0;
+ char *tmp = 0;
+
+ if (parent != 0 && parent->node_type () != AST_Decl::NT_root)
+ {
+ for (UTL_IdListActiveIterator i (parent->name ());
+ !i.is_done ();
+ i.next ())
+ {
+ segment = i.item ();
+ tmp = segment->get_string ();
+
+ if (ACE_OS::strcmp (tmp, "") == 0)
+ {
+ continue;
+ }
+
+ this->fwd_helper_name_ += tmp;
+ this->fwd_helper_name_ += "::";
+ }
+ }
+ else
+ {
+ this->fwd_helper_name_= "";
+ }
+
+ this->fwd_helper_name_ += "tao_";
+ this->fwd_helper_name_ += this->local_name ();
}
be_valuetype::~be_valuetype (void)
@@ -157,517 +189,22 @@ be_valuetype::full_obv_skel_name (void)
return this->full_obv_skel_name_;
}
-// Generate the var definition.
-int
-be_valuetype::gen_var_defn (char *local_name)
+int
+be_valuetype::var_out_seq_decls_gen (void) const
{
- char namebuf [NAMEBUFSIZE];
-
- if (local_name == 0)
- {
- local_name = (char *) this->local_name ();
- }
-
- ACE_OS::memset (namebuf,
- '\0',
- NAMEBUFSIZE);
-
- ACE_OS::sprintf (namebuf,
- "%s_var",
- local_name);
-
- TAO_OutStream *ch = tao_cg->client_header ();
-
- *ch << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
- << "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
-
- // 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 << "class " << be_global->stub_export_macro ()
- << " " << namebuf << be_nl;
- *ch << "{" << be_nl;
- *ch << "public:" << be_idt_nl;
-
- // Default constructor.
- *ch << namebuf << " (void);" << be_nl;
- *ch << namebuf << " (" << local_name << "*);" << be_nl;
- *ch << namebuf << " (const " << local_name
- << "*); // (TAO extension)" << be_nl;
-
- // Copy constructor.
- *ch << namebuf << " (const " << namebuf <<
- " &);" << be_nl;
-
- // Destructor.
- *ch << "~" << namebuf << " (void);" << be_nl;
- *ch << be_nl;
-
- // Assignment operator from a pointer.
- *ch << namebuf << " &operator= (" << local_name
- << "*);" << be_nl;
-
- // Assignment from _var.
- *ch << namebuf << " &operator= (const " << namebuf <<
- " &);" << be_nl;
-
- // Arrow operator.
- *ch << local_name << "* operator-> (void) const;" << be_nl;
-
- *ch << be_nl;
-
- // Other extra types (cast operators and others).
- *ch << "operator const " << local_name
- << "* () const;" << be_nl;
- *ch << "operator " << local_name << "*& ();" << 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.
- *ch << local_name << "* in (void) const;" << be_nl;
- *ch << local_name << "*& inout (void);" << be_nl;
- *ch << local_name << "*& out (void);" << be_nl;
- *ch << local_name << "* _retn (void);" << be_nl;
-
- // Generate an additional member function that returns
- // the underlying pointer.
- *ch << local_name << "* ptr (void) const;" << be_nl << be_nl;
-
- // Hooks for non-defined forward declared interfaces.
- *ch << "// Hooks used by template sequence and valuetype manager classes"
- << be_nl
- << "// for non-defined forward declared valuetypes." << be_nl
- << "static void tao_add_ref (" << local_name << " *);" << be_nl
- << "static void tao_remove_ref (" << local_name << " *);"
- << be_uidt_nl << be_nl;
-
- // Private.
- *ch << "private:" << be_idt_nl;
- *ch << local_name << "* ptr_;" << be_uidt_nl;
-
- *ch << "};";
-
- return 0;
+ return this->var_out_seq_decls_gen_;
}
-// Implementation of the _var class. All of these get generated in the stubs
-// file.
-int
-be_valuetype::gen_var_impl (char *local_name,
- char *full_name)
+void
+be_valuetype::var_out_seq_decls_gen (int val)
{
- TAO_OutStream *cs = 0;
- TAO_NL be_nl;
-
- // Decide on the names to use.
- // Even if one argument is 0, there is no point using the
- // arguments. Let us then use the name in this node.
- if (local_name == 0 || full_name == 0)
- {
- local_name = (char *) this->local_name ();
- full_name = (char *) this->full_name ();
- }
-
- // 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",
- full_name);
-
- ACE_OS::memset (lname,
- '\0',
- NAMEBUFSIZE);
-
- ACE_OS::sprintf (lname,
- "%s_var",
- local_name);
-
- cs = tao_cg->client_stubs ();
-
- // Generate the var implementation in the stubs file
- // Depending upon the data type, there are some differences which we account
- // for over here.
-
- *cs << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
- << "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
-
- *cs << "// *************************************************************"
- << be_nl;
- *cs << "// Operations for class " << fname << be_nl;
- *cs << "// *************************************************************"
- << be_nl << be_nl;
-
- // Default constructor.
- *cs << fname << "::" << lname <<
- " (void)" << be_nl;
- *cs << " " << ": ptr_ (0)" << be_nl;
- *cs << "{}" << be_nl << be_nl;
-
- // Constructor from a pointer.
- *cs << fname << "::" << lname << " ("
- << local_name << "* p)" << be_nl;
- *cs << " : ptr_ (p)" << be_nl;
- *cs << "{}" << be_nl << be_nl;
-
- // Constructor from a const pointer.
- // TAO extension - it appears that there are problems with at least g++
- // which reclaims amguity between T(T*) and T(const T_var &)
- *cs << fname << "::" << lname << " (const "
- << local_name << "* p)" << be_nl;
- *cs << " : ptr_ (ACE_const_cast ("
- << local_name << " *, p))" << be_nl;
- *cs << "{}" << be_nl << be_nl;
-
- // The additional ptr () member function. This member function must be
- // defined before the remaining member functions including the copy
- // constructor because this inline function is used elsewhere. Hence to make
- // inlining of this function possible, we must define it before its use.
- *cs << full_name << " *" << be_nl;
- *cs << fname << "::ptr (void) const" << be_nl;
- *cs << "{" << be_idt_nl;
-
- *cs << "return this->ptr_;" << be_uidt_nl;
-
- *cs << "}" << be_nl << be_nl;
-
- // Copy constructor.
- *cs << fname << "::" << lname << " (const " << lname <<
- " &p)" << be_nl;
- *cs << "{" << be_idt_nl
- << "CORBA::add_ref (p.ptr ());" << be_nl
- << "this->ptr_ = p.ptr ();" << be_uidt_nl
- << "}" << be_nl << be_nl;
-
- // Destructor.
- *cs << fname << "::~" << lname << " (void) // destructor" << be_nl;
- *cs << "{" << be_idt_nl;
-
- *cs << "CORBA::remove_ref (this->ptr_);" << be_uidt_nl;
-
- *cs << "}" << be_nl << be_nl;
-
- // Assignment operator.
- *cs << fname << " &" << be_nl;
- *cs << fname << "::operator= (" << local_name
- << " *p)" << be_nl;
- *cs << "{" << be_idt_nl;
-
- *cs << "CORBA::remove_ref (this->ptr_);" << be_nl;
- *cs << "this->ptr_ = p;" << be_nl;
- *cs << "return *this;" << be_uidt_nl;
-
- *cs << "}" << be_nl << be_nl;
-
- // Assignment operator from _var.
- *cs << fname << " &" << be_nl;
- *cs << fname << "::operator= (const " << lname
- << " &p)" << be_nl;
- *cs << "{" << be_idt_nl;
-
- *cs << "if (this != &p)" << be_nl;
- *cs << "{" << be_idt_nl;
-
- *cs << "CORBA::remove_ref (this->ptr_);" << be_nl
- << local_name << " *tmp = p.ptr ();" << be_nl
- << "CORBA::add_ref (tmp);" << be_nl
- << "this->ptr_ = tmp;" << be_uidt_nl;
-
- *cs << "}" << be_nl << be_nl;
- *cs << "return *this;" << be_uidt_nl;
-
- *cs << "}" << be_nl << be_nl;
-
- // Other extra methods - cast operators.
- *cs << fname << "::operator const " << full_name
- << "* () const // cast" << be_nl;
- *cs << "{" << be_idt_nl;
-
- *cs << "return this->ptr_;" << be_uidt_nl;
-
- *cs << "}" << be_nl << be_nl;
-
- *cs << fname << "::operator " << full_name
- << "*& () // cast " << be_nl;
- *cs << "{" << be_idt_nl;
-
- *cs << "return this->ptr_;" << be_uidt_nl;
-
- *cs << "}" << be_nl << be_nl;
-
- // operator->
- *cs << full_name << " *" << be_nl;
- *cs << fname << "::operator-> (void) const" << be_nl;
- *cs << "{" << be_idt_nl;
-
- *cs << "return this->ptr_;" << be_uidt_nl;
-
- *cs << "}" << be_nl << be_nl;
-
- // in, inout, out, and _retn.
- *cs << full_name << " *" << be_nl;
- *cs << fname << "::in (void) const" << be_nl;
- *cs << "{" << be_idt_nl;
-
- *cs << "return this->ptr_;" << be_uidt_nl;
-
- *cs << "}" << be_nl << be_nl;
-
- *cs << full_name << " *&" << be_nl;
- *cs << fname << "::inout (void)" << be_nl;
- *cs << "{" << be_idt_nl;
-
- *cs << "return this->ptr_;" << be_uidt_nl;
-
- *cs << "}" << be_nl << be_nl;
-
- *cs << full_name << " *&" << be_nl;
- *cs << fname << "::out (void)" << be_nl;
- *cs << "{" << be_idt_nl;
-
- *cs << "CORBA::remove_ref (this->ptr_);" << be_nl;
- *cs << "this->ptr_ = 0;" << be_nl;
- *cs << "return this->ptr_;" << be_uidt_nl;
-
- *cs << "}" << be_nl << be_nl;
-
- *cs << full_name << " *" << be_nl;
- *cs << fname << "::_retn (void)" << be_nl;
- *cs << "{" << be_idt_nl;
-
- *cs << "// yield ownership of managed obj reference" << be_nl;
- *cs << local_name << "* tmp = this->ptr_;" << be_nl;
- *cs << "this->ptr_ = 0;" << be_nl;
- *cs << "return tmp;" << be_uidt_nl;
- *cs << "}" << be_nl << be_nl;
-
- // Hooks for the flat name global functions used by references to
- // non-defined valuetypes.
- *cs << "void" << be_nl
- << fname << "::tao_add_ref (" << be_idt << be_idt_nl
- << local_name << " *p" << be_uidt_nl
- << ")" << be_uidt_nl
- << "{" << be_idt_nl
- << "CORBA::add_ref (p);"
- << be_uidt_nl
- << "}" << be_nl << be_nl;
-
- *cs << "void" << be_nl
- << fname << "::tao_remove_ref (" << be_idt << be_idt_nl
- << local_name << " *p" << be_uidt_nl
- << ")" << be_uidt_nl
- << "{" << be_idt_nl
- << "CORBA::remove_ref (p);" << be_uidt_nl
- << "}";
-
- return 0;
-}
-
-// Generate the _out definition.
-int
-be_valuetype::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 ());
-
- ch = tao_cg->client_header ();
-
- *ch << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
- << "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
-
- // Generate the out definition (always in the client header).
-
- *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.
- // Only interface allows assignment from var &.
- *ch << namebuf << " &operator= (const " << this->local_name ()
- << "_var &);" << be_nl;
- *ch << namebuf << " &operator= (" << this->local_name ()
- << "*);" << be_nl;
-
- // Cast.
- *ch << "operator " << this->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_uidt_nl;
- *ch << "};";
-
- return 0;
+ this->var_out_seq_decls_gen_ = val;
}
-int
-be_valuetype::gen_out_impl (char *,
- char *)
+const char *
+be_valuetype::fwd_helper_name (void) const
{
- TAO_OutStream *cs = 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 ());
-
- cs = tao_cg->client_stubs ();
-
- *cs << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
- << "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
-
- // Generate the var implementation in the inline file
- // Depending upon the data type, there are some differences which we account
- // for over here.
-
- *cs << "// *************************************************************"
- << be_nl;
- *cs << "// Operations for class " << fname << be_nl;
- *cs << "// *************************************************************"
- << be_nl << be_nl;
-
- // Constructor from a pointer.
- *cs << fname << "::" << lname << " (" << this->local_name ()
- << " *&p)" << be_nl;
- *cs << " : ptr_ (p)" << be_nl;
- *cs << "{" << be_idt_nl;
-
- *cs << "this->ptr_ = 0;" << be_uidt_nl;
-
- *cs << "}" << be_nl << be_nl;
-
- // Constructor from _var &.
- *cs << fname << "::" << lname << " (" << this->local_name ()
- << "_var &p)" << be_nl;
- *cs << " : ptr_ (p.out ())" << be_nl;
- *cs << "{" << be_idt_nl;
-
- *cs << "CORBA::remove_ref (this->ptr_);" << be_nl;
- *cs << "this->ptr_ = 0;" << be_uidt_nl;
-
- *cs << "}" << be_nl << be_nl;
-
- // Copy constructor.
- *cs << fname << "::" << lname << " (const " << lname
- << " &p)" << be_nl;
- *cs << " : ptr_ (ACE_const_cast (" << lname << "&, p).ptr_)" << be_nl;
- *cs << "{}" << be_nl << be_nl;
-
- // Assignment operator from _out &.
- *cs << fname << " &" << be_nl;
- *cs << fname << "::operator= (const " << lname <<
- " &p)" << be_nl;
- *cs << "{" << be_idt_nl;
-
- *cs << "this->ptr_ = ACE_const_cast (" << lname << "&, p).ptr_;" << be_nl;
- *cs << "return *this;" << be_uidt_nl;
-
- *cs << "}" << be_nl << be_nl;
-
- // Assignment operator from _var.
- *cs << fname << " &" << be_nl;
- *cs << fname << "::operator= (const " << this->local_name ()
- << "_var &p)" << be_nl;
- *cs << "{" << be_idt_nl;
-
- *cs << this->local_name () << " *tmp = p.ptr ();" << be_nl
- << "CORBA::add_ref (tmp);" << be_nl
- << "this->ptr_ = tmp;" << be_nl;
- *cs << "return *this;" << be_uidt_nl;
-
- *cs << "}" << be_nl << be_nl;
-
- // Assignment operator from *.
- *cs << fname << " &" << be_nl;
- *cs << fname << "::operator= (" << this->local_name ()
- << " *p)" << be_nl;
- *cs << "{" << be_idt_nl;
-
- *cs << "this->ptr_ = p;" << be_nl;
- *cs << "return *this;" << be_uidt_nl;
-
- *cs << "}" << be_nl << be_nl;
-
- // Other extra methods - cast operator ().
- *cs << fname << "::operator " << this->name ()
- << "*& () // cast" << be_nl;
- *cs << "{" << be_idt_nl;
- *cs << "return this->ptr_;" << be_uidt_nl;
-
- *cs << "}" << be_nl << be_nl;
-
- // ptr function.
- *cs << this->name () << " *&" << be_nl;
- *cs << fname << "::ptr (void) // ptr" << be_nl;
- *cs << "{" << be_idt_nl;
- *cs << "return this->ptr_;" << be_uidt_nl;
-
- *cs << "}" << be_nl << be_nl;
-
- // operator->
- *cs << this->name () << " *" << be_nl;
- *cs << fname << "::operator-> (void)" << be_nl;
- *cs << "{" << be_idt_nl;
-
- *cs << "return this->ptr_;" << be_uidt_nl;
-
- *cs << "}" << be_nl << be_nl;
-
- *cs << "// *************************************************************";
-
- return 0;
+ return this->fwd_helper_name_.fast_rep ();
}
int
@@ -761,6 +298,35 @@ be_valuetype::gen_helper_stubs (char* ,
return 0;
}
+// Generate the forward declarations and static methods used by the
+// interface _var and _out template classes, as well as by the
+// template sequence classes for object references.
+void
+be_valuetype:: gen_var_out_seq_decls (void)
+{
+ TAO_OutStream *os = tao_cg->client_header ();
+
+ *os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
+ << "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
+
+ const char *lname = this->local_name ();
+
+ *os << "class " << lname << ";" << be_nl
+ << "struct tao_" << lname << "_life;" << be_nl
+ << "typedef TAO_Value_Var_T<" << lname << ", tao_"
+ << lname << "_life> " << lname << "_var;" << be_nl
+ << "typedef TAO_Value_Out_T<" << lname << ", tao_"
+ << lname << "_life> " << lname << "_out;";
+
+ *os << be_nl << be_nl
+ << "struct tao_" << lname << "_life" << be_nl
+ << "{" << be_idt_nl
+ << "static void tao_add_ref ("
+ << lname << " *);" << be_nl
+ << "static void tao_remove_ref (" << lname << " *);" << be_uidt_nl
+ << "};";
+}
+
// For building the pre and postfix of private data fields.
const char *
be_valuetype::field_pd_prefix (void)
diff --git a/TAO/TAO_IDL/be/be_visitor_interface/interface_cs.cpp b/TAO/TAO_IDL/be/be_visitor_interface/interface_cs.cpp
index cd57700a562..f2cc690fae0 100644
--- a/TAO/TAO_IDL/be/be_visitor_interface/interface_cs.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_interface/interface_cs.cpp
@@ -201,6 +201,31 @@ be_visitor_interface_cs::visit_interface (be_interface *node)
<< "}";
}
+ *os << be_nl
+ << "\n#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)" << be_idt_nl
+ << "template class" << be_idt_nl
+ << "TAO_Objref_Var_T<" << be_idt << be_idt_nl
+ << node->name () << "," << be_nl
+ << node->fwd_helper_name () << "_life" << be_uidt_nl
+ << ">;" << be_uidt << be_uidt_nl
+ << "template class" << be_idt_nl
+ << "TAO_Objref_Out_T<" << be_idt << be_idt_nl
+ << node->name () << "," << be_nl
+ << node->fwd_helper_name () << "_life" << be_uidt_nl
+ << ">;" << be_uidt << be_uidt << be_uidt_nl
+ << "#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)" << be_nl
+ << "# pragma instantiate \\" << be_idt << be_idt_nl
+ << "TAO_Objref_Var_T< \\" << be_idt << be_idt_nl
+ << node->name () << ", \\" << be_nl
+ << node->fwd_helper_name () << "_life \\" << be_uidt_nl
+ << ">" << be_uidt << be_uidt << be_uidt_nl
+ << "# pragma instantiate \\" << be_idt << be_idt_nl
+ << "TAO_Objref_Out_T< \\" << be_idt << be_idt_nl
+ << node->name () << ", \\" << be_nl
+ << node->fwd_helper_name () << "_life \\" << be_uidt_nl
+ << ">" << be_uidt << be_uidt << be_uidt_nl
+ << "#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */";
+
be_visitor_context ctx = (*this->ctx_);
// Interceptor classes. The interceptors helper classes must be
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 0e8a657721e..eb66599b33c 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp
@@ -71,8 +71,6 @@ int be_visitor_sequence_ch::visit_sequence (be_sequence *node)
-1);
}
- AST_Decl *parent = ScopeAsDecl (bt->defined_in ());
-
*os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
<< "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
@@ -80,70 +78,58 @@ int be_visitor_sequence_ch::visit_sequence (be_sequence *node)
switch (node->managed_type ())
{
case be_sequence::MNG_OBJREF:
- if (node->unbounded ())
- {
- *os << "typedef" << be_idt_nl
- << "TAO_Unbounded_Object_Sequence<" << be_idt << be_idt_nl
- << bt->name () << "," << be_nl
- << bt->name () << "_var," << be_nl;
-
- if (parent != 0 && parent->node_type () != AST_Decl::NT_root)
- {
- *os << parent->name () << "::";
- }
-
- *os << "tao_" << bt->local_name () << "_life," << be_nl;
-
- if (parent != 0 && parent->node_type () != AST_Decl::NT_root)
- {
- *os << parent->name () << "::";
- }
-
- *os << "tao_" << bt->local_name () << "_cast" << be_uidt_nl
- << "> " << node->local_name () << ";" << be_uidt << be_uidt;
- }
- else
- {
- }
-
- // 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_Object_Manager<" << be_idt << be_idt_nl
- << bt->name () << "," << be_nl
- << bt->name () << "_var," << be_nl;
-
- if (parent != 0 && parent->node_type () != AST_Decl::NT_root)
- {
- *os << parent->name () << "::";
- }
-
- *os << "tao_" << bt->local_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_Object_Manager<" << be_idt << be_idt_nl
- << bt->name () << "," << be_nl
- << bt->name () << "_var," << be_nl;
-
- if (parent != 0 && parent->node_type () != AST_Decl::NT_root)
- {
- *os << parent->name () << "::";
- }
-
- *os << "tao_" << bt->local_name () << "_life" << be_uidt_nl
- << ">" << be_uidt << be_uidt_nl
- << "> " << node->local_name () << "_out;" << be_uidt << be_uidt;
- }
+ {
+ be_interface *elem = be_interface::narrow_from_decl (bt);
+
+ if (node->unbounded ())
+ {
+ *os << "typedef" << be_idt_nl
+ << "TAO_Unbounded_Object_Sequence<" << be_idt << be_idt_nl
+ << bt->name () << "," << be_nl
+ << bt->name () << "_var," << be_nl
+ << elem->fwd_helper_name () << "_life," << be_nl
+ << elem->fwd_helper_name () << "_cast" << be_uidt_nl
+ << "> " << node->local_name () << ";" << be_uidt << be_uidt;
+ }
+ else
+ {
+ *os << "typedef" << be_idt_nl
+ << "TAO_Bounded_Object_Sequence<" << be_idt << be_idt_nl
+ << bt->name () << "," << be_nl
+ << bt->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
+ << "> " << node->local_name () << ";" << 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
+ << "typedef" << be_idt_nl
+ << "TAO_VarSeq_Var_T<" << be_idt << be_idt_nl
+ << node->local_name () << "," << be_nl
+ << "TAO_Object_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_Object_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_ABSTRACT:
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 0d099e3eb97..7494ff61cd0 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp
@@ -37,13 +37,264 @@ be_visitor_sequence_cs::~be_visitor_sequence_cs (void)
int be_visitor_sequence_cs::visit_sequence (be_sequence *node)
{
- TAO_OutStream *os = this->ctx_->stream ();
-
if (node->cli_stub_gen () || node->imported ())
{
return 0;
}
+ TAO_OutStream *os = this->ctx_->stream ();
+ be_type *bt = be_type::narrow_from_decl (node->base_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;
+
+ switch (node->managed_type ())
+ {
+ case be_sequence::MNG_OBJREF:
+ {
+ be_interface *elem = be_interface::narrow_from_decl (bt);
+
+ if (node->unbounded ())
+ {
+ *os << "template class" << 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_nl;
+ }
+ else
+ {
+ *os << "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;
+ }
+
+ *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
+ << ">;";
+ }
+
+ break;
+ case be_sequence::MNG_ABSTRACT:
+ if (node->unbounded ())
+ {
+ }
+ else
+ {
+ }
+
+ break;
+ case be_sequence::MNG_PSEUDO:
+ if (node->unbounded ())
+ {
+ }
+ else
+ {
+ }
+
+ break;
+ case be_sequence::MNG_VALUE:
+ if (node->unbounded ())
+ {
+ }
+ else
+ {
+ }
+
+ break;
+ case be_sequence::MNG_STRING:
+ if (node->unbounded ())
+ {
+ }
+ else
+ {
+ }
+
+ break;
+ case be_sequence::MNG_WSTRING:
+ if (node->unbounded ())
+ {
+ }
+ else
+ {
+ }
+
+ break;
+ default: // not a managed type
+ if (bt->base_node_type () == AST_Decl::NT_array)
+ {
+ if (node->unbounded ())
+ {
+ }
+ else
+ {
+ }
+ }
+ else
+ {
+ if (node->unbounded ())
+ {
+ }
+ else
+ {
+ }
+ }
+
+ break;
+ }
+
+ *os << be_uidt << be_uidt << be_uidt_nl
+ << "#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)" << be_nl;
+
+ switch (node->managed_type ())
+ {
+ case be_sequence::MNG_OBJREF:
+ {
+ be_interface *elem = be_interface::narrow_from_decl (bt);
+
+ if (node->unbounded ())
+ {
+ *os << "# 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_nl;
+ }
+ else
+ {
+ *os << "# 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_nl;
+ }
+
+ *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
+ << ">";
+ }
+
+ break;
+ case be_sequence::MNG_ABSTRACT:
+ if (node->unbounded ())
+ {
+ }
+ else
+ {
+ }
+
+ break;
+ case be_sequence::MNG_PSEUDO:
+ if (node->unbounded ())
+ {
+ }
+ else
+ {
+ }
+
+ break;
+ case be_sequence::MNG_VALUE:
+ if (node->unbounded ())
+ {
+ }
+ else
+ {
+ }
+
+ break;
+ case be_sequence::MNG_STRING:
+ if (node->unbounded ())
+ {
+ }
+ else
+ {
+ }
+
+ break;
+ case be_sequence::MNG_WSTRING:
+ if (node->unbounded ())
+ {
+ }
+ else
+ {
+ }
+
+ break;
+ default: // not a managed type
+ if (bt->base_node_type () == AST_Decl::NT_array)
+ {
+ if (node->unbounded ())
+ {
+ }
+ else
+ {
+ }
+ }
+ else
+ {
+ if (node->unbounded ())
+ {
+ }
+ else
+ {
+ }
+ }
+
+ break;
+ }
+
+ *os << be_uidt << be_uidt << be_uidt_nl
+ << "#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */";
+
node->cli_stub_gen (1);
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 bd7cbb13e3f..733c020ea79 100644
--- a/TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_ch.cpp
@@ -45,59 +45,18 @@ be_visitor_valuetype_ch::visit_valuetype (be_valuetype *node)
return 0;
}
- TAO_OutStream *os = this->ctx_->stream ();
- int status = 0;
-
- *os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
- << "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
-
- // == STEP 1: Generate the class name and class names we inherit ==
-
- // Forward declaration.
- *os << "class " << node->local_name () << ";";
-
- os->gen_ifdef_macro (node->flat_name (), "_ptr");
-
- *os << be_nl << be_nl << "typedef " << node->local_name ()
- << " *" << node->local_name () << "_ptr;";
-
- os->gen_endif ();
-
- // Generate the ifdefined macro for the _var type.
- os->gen_ifdef_macro (node->flat_name (), "_var");
-
- // Generate the _var declaration.
- if (node->gen_var_defn () == -1)
+ if (node->var_out_seq_decls_gen () == 0)
{
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_visitor_valuetype_ch::"
- "visit_valuetype - "
- "codegen for _var failed\n"),
- -1);
+ node->gen_var_out_seq_decls ();
+ node->var_out_seq_decls_gen (1);
}
- os->gen_endif ();
-
- // Generate the ifdef macro for the _out class.
- os->gen_ifdef_macro (node->flat_name (),
- "_out");
-
- // Generate the _out declaration.
- if (node->gen_out_defn () == -1)
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_visitor_valuetype_ch::"
- "visit_valuetype - "
- "codegen for _out failed\n"),
- -1);
- }
+ TAO_OutStream *os = this->ctx_->stream ();
+ int status = 0;
*os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
<< "// " << __FILE__ << ":" << __LINE__;
- // Generate the endif macro.
- os->gen_endif ();
-
// Now the valuetype definition itself.
os->gen_ifdef_macro (node->flat_name ());
diff --git a/TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_cs.cpp b/TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_cs.cpp
index e4c1fbed165..c6cb3f4663e 100644
--- a/TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_cs.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_cs.cpp
@@ -93,51 +93,54 @@ be_visitor_valuetype_cs::visit_valuetype (be_valuetype *node)
*os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
<< "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
- // Global functions to allow non-defined forward declared interfaces
+ // Helper functions to allow non-defined forward declared valuetypes
// access to some methods in the full definition.
*os << "void" << be_nl
- << "tao_" << node->flat_name ()
- << "_add_ref (" << be_idt << be_idt_nl
- << node->full_name () << " *p" << be_uidt_nl
+ << node->fwd_helper_name () << "_life::tao_add_ref ("
+ << be_idt << be_idt_nl
+ << node->full_name () << " * p" << be_uidt_nl
<< ")" << be_uidt_nl
<< "{" << be_idt_nl
<< "CORBA::add_ref (p);" << be_uidt_nl
<< "}" << be_nl << be_nl;
*os << "void" << be_nl
- << "tao_" << node->flat_name ()
- << "_remove_ref (" << be_idt << be_idt_nl
- << node->full_name () << " *p" << be_uidt_nl
+ << node->fwd_helper_name () << "_life::tao_remove_ref ("
+ << be_idt << be_idt_nl
+ << node->full_name () << " * p" << be_uidt_nl
<< ")" << be_uidt_nl
<< "{" << be_idt_nl
<< "CORBA::remove_ref (p);" << be_uidt_nl
<< "}";
- // Generate methods for _var class.
- if (node->gen_var_impl () == -1)
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_visitor_valuetype_cs::"
- "visit_valuetype - "
- "codegen for _var failed\n"),
- -1);
- }
-
- // Generate methods for _out class
- if (node->gen_out_impl () == -1)
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_visitor_valuetype_cs::"
- "visit_valuetype - "
- "codegen for _out failed\n"),
- -1);
- }
-
- *os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
- << "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
+ *os << be_nl
+ << "\n#if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION)" << be_idt_nl
+ << "template class" << be_idt_nl
+ << "TAO_Value_Var_T<" << be_idt << be_idt_nl
+ << node->name () << "," << be_nl
+ << node->fwd_helper_name () << "_life" << be_uidt_nl
+ << ">;" << be_uidt << be_uidt_nl
+ << "template class" << be_idt_nl
+ << "TAO_Value_Out_T<" << be_idt << be_idt_nl
+ << node->name () << "," << be_nl
+ << node->fwd_helper_name () << "_life" << be_uidt_nl
+ << ">;" << be_uidt << be_uidt << be_uidt_nl
+ << "#elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA)" << be_nl
+ << "# pragma instantiate \\" << be_idt << be_idt_nl
+ << "TAO_Value_Var_T< \\" << be_idt << be_idt_nl
+ << node->name () << ", \\" << be_nl
+ << node->fwd_helper_name () << "_life \\" << be_uidt_nl
+ << ">" << be_uidt << be_uidt << be_uidt_nl
+ << "# pragma instantiate \\" << be_idt << be_idt_nl
+ << "TAO_Value_Out_T< \\" << be_idt << be_idt_nl
+ << node->name () << ", \\" << be_nl
+ << node->fwd_helper_name () << "_life \\" << be_uidt_nl
+ << ">" << be_uidt << be_uidt << be_uidt_nl
+ << "#endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */";
// The _downcast method // %! use ACE_xxx_cast here ?
- *os << node->name () << " *" << be_nl << node->name ()
+ *os << be_nl << be_nl
+ << node->name () << " *" << be_nl << node->name ()
<< "::_downcast (CORBA::ValueBase *v)" << be_nl
<< "{" << be_idt_nl
<< "if (v == 0)" << be_idt_nl
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 b1ff613ea30..a64d3b5a7c5 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,62 +47,12 @@ 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 (!fd->is_defined ())
+ if (bfd->var_out_seq_decls_gen () == 0)
{
- // To generate extern declarations after all modules are closed.
- be_global->non_defined_interfaces.enqueue_tail (node);
+ bfd->gen_var_out_seq_decls ();
+ bfd->var_out_seq_decls_gen (1);
}
- TAO_OutStream *os = this->ctx_->stream ();
-
- *os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
- << "// " << __FILE__ << ":" << __LINE__ << be_nl << be_nl;
-
- // == STEP 1: Generate the class name and class names we inherit ==
-
- // Forward declaration.
- *os << "class " << node->local_name () << ";";
-
- // Generate _ptr declaration
- os->gen_ifdef_macro (node->flat_name (), "_ptr");
-
- *os << be_nl << be_nl
- << "typedef " << node->local_name ()
- << " *" << node->local_name () << "_ptr;";
-
- os->gen_endif ();
-
- // Generate the ifdefined macro for the _var type.
- os->gen_ifdef_macro (node->flat_name (), "_var");
-
- // Generate the _var declaration.
- if (bfd->gen_var_defn () == -1)
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_visitor_valuetype_ch::"
- "visit_valuetype - "
- "codegen for _var failed\n"),
- -1);
- }
-
- os->gen_endif ();
-
- // Generate the ifdef macro for the _out class.
- os->gen_ifdef_macro (node->flat_name (), "_out");
-
- // Generate the _out declaration
- if (bfd->gen_out_defn () == -1)
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_visitor_valuetype_ch::"
- "visit_valuetype - "
- "codegen for _out failed\n"), -1);
- }
-
- // generate the endif macro.
- os->gen_endif ();
-
node->cli_hdr_gen (I_TRUE);
-
return 0;
}
diff --git a/TAO/TAO_IDL/be_include/be_interface.h b/TAO/TAO_IDL/be_include/be_interface.h
index 8e664a5f650..0fd3bd134aa 100644
--- a/TAO/TAO_IDL/be_include/be_interface.h
+++ b/TAO/TAO_IDL/be_include/be_interface.h
@@ -333,10 +333,11 @@ public:
int var_out_seq_decls_gen (void) const;
void var_out_seq_decls_gen (int val);
- int var_out_seq_defns_gen (void) const;
- void var_out_seq_defns_gen (int val);
// Accessors for the members.
+ const char *fwd_helper_name (void) const;
+ // Accessor to the member.
+
private:
void gen_gperf_input_header (TAO_OutStream *ss);
// Output the header (type declaration and %%) to the gperf's input
@@ -391,8 +392,10 @@ private:
// Do we have both abstract and concrete parents?
int var_out_seq_decls_gen_;
- int var_out_seq_defns_gen_;
// Have these been done already?
+
+ ACE_CString fwd_helper_name_;
+ // Calculate this in one place.
};
/**
diff --git a/TAO/TAO_IDL/be_include/be_valuetype.h b/TAO/TAO_IDL/be_include/be_valuetype.h
index ee6b1ec3f61..886b2e81ebd 100644
--- a/TAO/TAO_IDL/be_include/be_valuetype.h
+++ b/TAO/TAO_IDL/be_include/be_valuetype.h
@@ -60,20 +60,6 @@ public:
idl_bool opt_accessor (void);
// Should generate optimized form?
- 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 int gen_helper_header (char *local_name = 0,
char *full_name = 0);
// Generate the helper functions definition.
@@ -86,6 +72,10 @@ public:
char *full_name = 0);
// Generate the helper functions implementation.
+ void gen_var_out_seq_decls (void);
+ // Generate the declarations used by the template _var, _out
+ // classes for valuetypes, and by sequence template classes.
+
const char *full_obv_skel_name (void);
// Retrieve the fully scoped skel class name.
@@ -154,11 +144,24 @@ 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.
+
private:
char *full_obv_skel_name_;
idl_bool supports_abstract_;
// Do we support at least one abstract interface?
+
+ int var_out_seq_decls_gen_;
+ // Have these been done already?
+
+ ACE_CString fwd_helper_name_;
+ // Calculate this in one place.
};
#endif // if !defined
diff --git a/TAO/tao/Objref_VarOut_T.cpp b/TAO/tao/Objref_VarOut_T.cpp
index ca626fe45ec..a443407b4d3 100644
--- a/TAO/tao/Objref_VarOut_T.cpp
+++ b/TAO/tao/Objref_VarOut_T.cpp
@@ -1,13 +1,13 @@
// $Id$
-#ifndef TAO_OBJREF_T_C
-#define TAO_OBJREF_T_C
+#ifndef TAO_OBJREF_VAROUT_T_C
+#define TAO_OBJREF_VAROUT_T_C
#include "tao/Objref_VarOut_T.h"
#include "tao/Environment.h"
ACE_RCSID (tao,
- Objref_T,
+ Objref_VarOut_T,
"$Id$")
template <typename T, typename T_life>
@@ -201,4 +201,4 @@ TAO_Objref_Out_T<T, T_life>::operator-> (void)
return this->ptr_;
}
-#endif /* TAO_OBJREF_T_C */
+#endif /* TAO_OBJREF_VAROUT_T_C */
diff --git a/TAO/tao/Objref_VarOut_T.h b/TAO/tao/Objref_VarOut_T.h
index 89e6ca26549..f62c7d79f59 100644
--- a/TAO/tao/Objref_VarOut_T.h
+++ b/TAO/tao/Objref_VarOut_T.h
@@ -2,7 +2,7 @@
//=============================================================================
/**
- * @file Objref_Varout_T.h
+ * @file Objref_VarOut_T.h
*
* $Id$
*
diff --git a/TAO/tao/Sequence_T.cpp b/TAO/tao/Sequence_T.cpp
index 579be2a2a36..86e144208bf 100644
--- a/TAO/tao/Sequence_T.cpp
+++ b/TAO/tao/Sequence_T.cpp
@@ -1001,10 +1001,26 @@ TAO_Bounded_Object_Sequence<T,T_var,T_life,T_cast,MAX>::freebuf (T* *buffer)
}
template<typename T,
- typename T_var,
- typename T_life,
- typename T_cast,
- size_t MAX>
+ typename T_var,
+ typename T_life,
+ typename T_cast,
+ size_t MAX>
+void
+TAO_Bounded_Object_Sequence<T,T_var,T_life,T_cast,MAX>::_tao_any_destructor (
+ void * _tao_void_pointer
+ )
+{
+ typedef TAO_Bounded_Object_Sequence<T,T_var,T_life,T_cast,MAX> THIS_SEQ_TYPE;
+ THIS_SEQ_TYPE *tmp = ACE_static_cast (THIS_SEQ_TYPE *,
+ _tao_void_pointer);
+ delete tmp;
+}
+
+template<typename T,
+ typename T_var,
+ typename T_life,
+ typename T_cast,
+ size_t MAX>
void
TAO_Bounded_Object_Sequence<T,T_var,T_life,T_cast,MAX>::_allocate_buffer (
CORBA::ULong length
diff --git a/TAO/tao/Sequence_T.h b/TAO/tao/Sequence_T.h
index ad3407281e9..87c12576d4b 100644
--- a/TAO/tao/Sequence_T.h
+++ b/TAO/tao/Sequence_T.h
@@ -627,7 +627,10 @@ private:
* class, in charge of handling the object lifetime, examples are
* pseudo objects, object references, valuetypes, and strings.
*/
-template<typename T, typename T_var, typename T_life, typename T_cast>
+template<typename T,
+ typename T_var,
+ typename T_life,
+ typename T_cast>
class TAO_Unbounded_Object_Sequence : public TAO_Unbounded_Base_Sequence
{
@@ -823,6 +826,9 @@ public:
/// it.
static void freebuf (T* *buffer);
+ static void _tao_any_destructor (void *);
+ typedef T_var _var_type;
+
// The Base_Sequence functions, please see "tao/sequence.h"
/// No default to workaround egcs problem with templates and
/// namespaces
diff --git a/TAO/tao/TAO.dsp b/TAO/tao/TAO.dsp
index 69df03fc6cd..967441e2edd 100644
--- a/TAO/tao/TAO.dsp
+++ b/TAO/tao/TAO.dsp
@@ -1527,6 +1527,10 @@ SOURCE=.\ObjectReferenceTemplateC.h
# End Source File
# Begin Source File
+SOURCE=.\Objref_VarOut_T.h
+# End Source File
+# Begin Source File
+
SOURCE=.\OctetSeqC.h
# End Source File
# Begin Source File
@@ -1679,6 +1683,10 @@ SOURCE=.\Resume_Handle.h
# End Source File
# Begin Source File
+SOURCE=.\Seq_VarOut_T.h
+# End Source File
+# Begin Source File
+
SOURCE=.\sequence.h
# End Source File
# Begin Source File
@@ -1827,6 +1835,10 @@ SOURCE=.\TypeCodeFactory_Adapter.h
# End Source File
# Begin Source File
+SOURCE=.\Value_VarOut_T.h
+# End Source File
+# Begin Source File
+
SOURCE=.\ValueBase.h
# End Source File
# Begin Source File
@@ -2319,6 +2331,10 @@ SOURCE=.\Resume_Handle.inl
# End Source File
# Begin Source File
+SOURCE=.\Seq_VarOut_T.inl
+# End Source File
+# Begin Source File
+
SOURCE=.\sequence.i
# End Source File
# Begin Source File
@@ -2453,9 +2469,24 @@ SOURCE=.\Codeset_Translator_Factory_T.cpp
# End Source File
# Begin Source File
+SOURCE=.\Objref_VarOut_T.cpp
+# PROP Exclude_From_Build 1
+# End Source File
+# Begin Source File
+
+SOURCE=.\Seq_VarOut_T.cpp
+# PROP Exclude_From_Build 1
+# End Source File
+# Begin Source File
+
SOURCE=.\Sequence_T.cpp
# PROP Exclude_From_Build 1
# End Source File
+# Begin Source File
+
+SOURCE=.\Value_VarOut_T.cpp
+# PROP Exclude_From_Build 1
+# End Source File
# End Group
# End Target
# End Project
diff --git a/TAO/tao/Value_VarOut_T.cpp b/TAO/tao/Value_VarOut_T.cpp
new file mode 100644
index 00000000000..5b75b912c9b
--- /dev/null
+++ b/TAO/tao/Value_VarOut_T.cpp
@@ -0,0 +1,192 @@
+// $Id$
+
+#ifndef TAO_VALUE_VAROUT_T_C
+#define TAO_VALUE_VAROUT_T_C
+
+#include "tao/Value_VarOut_T.h"
+
+ACE_RCSID (tao,
+ Value_VarOut_T,
+ "$Id$")
+
+template <typename T, typename T_life>
+TAO_Value_Var_T<T,T_life>::TAO_Value_Var_T (void)
+ : ptr_ (0)
+{}
+
+template <typename T, typename T_life>
+TAO_Value_Var_T<T,T_life>::TAO_Value_Var_T (T * p)
+ : ptr_ (p)
+{}
+
+template <typename T, typename T_life>
+TAO_Value_Var_T<T,T_life>::TAO_Value_Var_T (const T * p)
+ : ptr_ (ACE_const_cast (T *, p))
+{}
+
+template <typename T, typename T_life>
+T *
+TAO_Value_Var_T<T,T_life>::ptr (void) const
+{
+ return this->ptr_;
+}
+
+template <typename T, typename T_life>
+TAO_Value_Var_T<T,T_life>::TAO_Value_Var_T (
+ const TAO_Value_Var_T<T,T_life> & p
+ )
+{
+ T_life::tao_add_ref (p.ptr ());
+ this->ptr_ = p.ptr ();
+}
+
+template <typename T, typename T_life>
+TAO_Value_Var_T<T,T_life>::~TAO_Value_Var_T (void)
+{
+ T_life::tao_remove_ref (this->ptr_);
+}
+
+template <typename T, typename T_life>
+TAO_Value_Var_T<T,T_life> &
+TAO_Value_Var_T<T,T_life>::operator= (T * p)
+{
+ T_life::tao_remove_ref (this->ptr_);
+ this->ptr_ = p;
+ return *this;
+}
+
+template <typename T, typename T_life>
+TAO_Value_Var_T<T,T_life> &
+TAO_Value_Var_T<T,T_life>::operator= (const TAO_Value_Var_T & p)
+{
+ if (this != &p)
+ {
+ T_life::tao_remove_ref (this->ptr_);
+ T * tmp = p.ptr ();
+ T_life::tao_add_ref (tmp);
+ this->ptr_ = tmp;
+ }
+
+ return *this;
+}
+
+template <typename T, typename T_life>
+TAO_Value_Var_T<T,T_life>::operator const T * () const
+{
+ return this->ptr_;
+}
+
+template <typename T, typename T_life>
+TAO_Value_Var_T<T,T_life>::operator T *& ()
+{
+ return this->ptr_;
+}
+
+template <typename T, typename T_life>
+T *
+TAO_Value_Var_T<T,T_life>::operator-> (void) const
+{
+ return this->ptr_;
+}
+
+template <typename T, typename T_life>
+T *
+TAO_Value_Var_T<T,T_life>::in (void) const
+{
+ return this->ptr_;
+}
+
+template <typename T, typename T_life>
+T *&
+TAO_Value_Var_T<T,T_life>::inout (void)
+{
+ return this->ptr_;
+}
+
+template <typename T, typename T_life>
+T *&
+TAO_Value_Var_T<T,T_life>::out (void)
+{
+ T_life::tao_remove_ref (this->ptr_);
+ this->ptr_ = 0;
+ return this->ptr_;
+}
+
+template <typename T, typename T_life>
+T *
+TAO_Value_Var_T<T,T_life>::_retn (void)
+{
+ T * tmp = this->ptr_;
+ this->ptr_ = 0;
+ return tmp;
+}
+
+// *************************************************************
+
+template <typename T, typename T_life>
+TAO_Value_Out_T<T,T_life>::TAO_Value_Out_T (T *& p)
+ : ptr_ (p)
+{
+ this->ptr_ = 0;
+}
+
+template <typename T, typename T_life>
+TAO_Value_Out_T<T,T_life>::TAO_Value_Out_T (TAO_Value_Var_T<T,T_life> & p)
+ : ptr_ (p.out ())
+{
+ T_life::tao_remove_ref (this->ptr_);
+ this->ptr_ = 0;
+}
+
+template <typename T, typename T_life>
+TAO_Value_Out_T<T,T_life>::TAO_Value_Out_T (const TAO_Value_Out_T<T,T_life> & p)
+ : ptr_ (ACE_const_cast (THIS_OUT_TYPE &, p).ptr_)
+{}
+
+template <typename T, typename T_life>
+TAO_Value_Out_T<T,T_life> &
+TAO_Value_Out_T<T,T_life>::operator= (const TAO_Value_Out_T<T,T_life> & p)
+{
+ this->ptr_ = ACE_const_cast (THIS_OUT_TYPE &, p).ptr_;
+ return *this;
+}
+
+template <typename T, typename T_life>
+TAO_Value_Out_T<T,T_life> &
+TAO_Value_Out_T<T,T_life>::operator= (const TAO_Value_Var_T<T,T_life> & p)
+{
+ T * tmp = p.ptr ();
+ T_life::tao_add_ref (tmp);
+ this->ptr_ = tmp;
+ return *this;
+}
+
+template <typename T, typename T_life>
+TAO_Value_Out_T<T,T_life> &
+TAO_Value_Out_T<T,T_life>::operator= (T * p)
+{
+ this->ptr_ = p;
+ return *this;
+}
+
+template <typename T, typename T_life>
+TAO_Value_Out_T<T,T_life>::operator T *& ()
+{
+ return this->ptr_;
+}
+
+template <typename T, typename T_life>
+T *&
+TAO_Value_Out_T<T,T_life>::ptr (void)
+{
+ return this->ptr_;
+}
+
+template <typename T, typename T_life>
+T *
+TAO_Value_Out_T<T,T_life>::operator-> (void)
+{
+ return this->ptr_;
+}
+
+#endif /* TAO_VALUE_VAROUT_T_C */
diff --git a/TAO/tao/Value_VarOut_T.h b/TAO/tao/Value_VarOut_T.h
new file mode 100644
index 00000000000..0b0cef9479b
--- /dev/null
+++ b/TAO/tao/Value_VarOut_T.h
@@ -0,0 +1,101 @@
+// -*- C++ -*-
+
+//=============================================================================
+/**
+ * @file Value_VarOut_T.h
+ *
+ * $Id$
+ *
+ * @author Jeff Parsons
+ */
+//=============================================================================
+
+
+#ifndef TAO_VALUE_VAROUT_T_H
+#define TAO_VALUE_VAROUT_T_H
+
+#include "ace/pre.h"
+
+#if !defined (ACE_LACKS_PRAGMA_ONCE)
+# pragma once
+#endif /* ACE_LACKS_PRAGMA_ONCE */
+
+/**
+ * @class TAO_Value_Var_T
+ *
+ * @brief Parametrized implementation of _var class for valuetypes.
+ *
+ */
+template <typename T, typename T_life>
+class TAO_Value_Var_T
+{
+public:
+ TAO_Value_Var_T (void);
+ TAO_Value_Var_T (T *);
+ TAO_Value_Var_T (const TAO_Value_Var_T<T,T_life> &);
+
+ // (TAO extension)
+ TAO_Value_Var_T (const T *);
+
+ ~TAO_Value_Var_T (void);
+
+ TAO_Value_Var_T &operator= (T *);
+ TAO_Value_Var_T &operator= (const TAO_Value_Var_T<T,T_life> &);
+
+ T * operator-> (void) const;
+
+ operator const T * () const;
+ operator T *& ();
+
+ // in, inout, out, _retn
+ T * in (void) const;
+ T *& inout (void);
+ T *& out (void);
+ T * _retn (void);
+
+ // (TAO extension)
+ T * ptr (void) const;
+
+private:
+ T * ptr_;
+};
+
+/**
+ * @class TAO_Value_Var_T
+ *
+ * @brief Parametrized implementation of _out class for valuetypes.
+ *
+ */
+template <typename T, typename T_life>
+class TAO_Value_Out_T
+{
+public:
+ TAO_Value_Out_T (T *&);
+ TAO_Value_Out_T (TAO_Value_Var_T<T,T_life> &);
+ TAO_Value_Out_T (const TAO_Value_Out_T<T,T_life> &);
+
+ TAO_Value_Out_T &operator= (const TAO_Value_Out_T<T,T_life> &);
+ TAO_Value_Out_T &operator= (const TAO_Value_Var_T<T,T_life> &);
+ TAO_Value_Out_T &operator= (T *);
+
+ operator T *& ();
+ T *& ptr (void);
+
+ T * operator-> (void);
+
+private:
+ typedef TAO_Value_Out_T<T, T_life> THIS_OUT_TYPE;
+ T *& ptr_;
+};
+
+#if defined (ACE_TEMPLATES_REQUIRE_SOURCE)
+#include "tao/Value_VarOut_T.cpp"
+#endif /* ACE_TEMPLATES_REQUIRE_SOURCE */
+
+#if defined (ACE_TEMPLATES_REQUIRE_PRAGMA)
+#pragma implementation ("Value_VarOut_T.cpp")
+#endif /* ACE_TEMPLATES_REQUIRE_PRAGMA */
+
+#include "ace/post.h"
+
+#endif /* TAO_VALUE_VAROUT_T_H */
diff --git a/TAO/tao/corba.h b/TAO/tao/corba.h
index fffc366437b..c9067573994 100644
--- a/TAO/tao/corba.h
+++ b/TAO/tao/corba.h
@@ -69,6 +69,7 @@
#include "tao/ObjectIdListC.h"
#include "tao/Objref_VarOut_T.h"
+#include "tao/Value_VarOut_T.h"
#include "tao/Seq_VarOut_T.h"
#include "tao/Remote_Object_Proxy_Impl.h"