diff options
author | parsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2003-03-21 08:35:17 +0000 |
---|---|---|
committer | parsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2003-03-21 08:35:17 +0000 |
commit | 6a2a0f5c189375927c8dbb34bb6c8b62ff197fd8 (patch) | |
tree | 55552778ce38abc0f5dc7cd50c7e3127d2a178bf | |
parent | 5a0c8eb40e9b6bf0d3ccae94fc3ca286d9584a99 (diff) | |
download | ATCD-6a2a0f5c189375927c8dbb34bb6c8b62ff197fd8.tar.gz |
ChangeLogTag: Fri Mar 21 02:33:00 2003 Jeff Parsons <j.parsons@vanderbilt.edu>
-rw-r--r-- | TAO/ChangeLog | 28 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_interface.cpp | 54 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_valuetype.cpp | 576 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_interface/interface_cs.cpp | 25 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp | 118 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp | 255 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_ch.cpp | 51 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_cs.cpp | 63 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_valuetype_fwd/valuetype_fwd_ch.cpp | 56 | ||||
-rw-r--r-- | TAO/TAO_IDL/be_include/be_interface.h | 9 | ||||
-rw-r--r-- | TAO/TAO_IDL/be_include/be_valuetype.h | 31 | ||||
-rw-r--r-- | TAO/tao/Objref_VarOut_T.cpp | 8 | ||||
-rw-r--r-- | TAO/tao/Objref_VarOut_T.h | 2 | ||||
-rw-r--r-- | TAO/tao/Sequence_T.cpp | 24 | ||||
-rw-r--r-- | TAO/tao/Sequence_T.h | 8 | ||||
-rw-r--r-- | TAO/tao/TAO.dsp | 31 | ||||
-rw-r--r-- | TAO/tao/Value_VarOut_T.cpp | 192 | ||||
-rw-r--r-- | TAO/tao/Value_VarOut_T.h | 101 | ||||
-rw-r--r-- | TAO/tao/corba.h | 1 |
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" |