diff options
author | coryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1998-01-18 03:02:28 +0000 |
---|---|---|
committer | coryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1998-01-18 03:02:28 +0000 |
commit | fc989aed9b5598fb71b370579fee7410235931ee (patch) | |
tree | 9f684ce4a987250b77a5e8a54812b07fac09dba6 | |
parent | bdd2d07f075298e1872ec4737cdcfdbe6babbe5b (diff) | |
download | ATCD-fc989aed9b5598fb71b370579fee7410235931ee.tar.gz |
ChangeLogTag:Sat Jan 17 20:54:26 1998 <coryan@MILONGA>
-rw-r--r-- | TAO/ChangeLog-98c | 22 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_attribute.cpp | 3 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_interface.cpp | 29 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_sequence.cpp | 4 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_interface.cpp | 28 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_sequence.cpp | 22 | ||||
-rw-r--r-- | TAO/tao/sequence_T.cpp | 16 | ||||
-rw-r--r-- | TAO/tao/sequence_T.i | 4 | ||||
-rw-r--r-- | TAO/tao/servant_base.cpp | 11 | ||||
-rw-r--r-- | TAO/tao/servant_base.h | 2 |
10 files changed, 92 insertions, 49 deletions
diff --git a/TAO/ChangeLog-98c b/TAO/ChangeLog-98c index a769691d3fa..f65e4a1ec4e 100644 --- a/TAO/ChangeLog-98c +++ b/TAO/ChangeLog-98c @@ -1,3 +1,25 @@ +Sat Jan 17 20:54:26 1998 <coryan@MILONGA> + + * TAO_IDL/be/be_attribute.cpp: + * TAO_IDL/be/be_interface.cpp: + * TAO_IDL/be/be_sequence.cpp: + * TAO_IDL/be/be_visitor_interface.cpp: + * TAO_IDL/be/be_visitor_sequence.cpp: + More bug fixes in code generation for sequences, attributes, + etc. Most of them were minor inconsitencies. Also fixed + constructors for collocated classes on NT (working around MSVC++ + bug). + + * tao/servant_base.cpp: + * tao/servant_base.h: + Added default implementation for _downcast(), it just works if + downcasting to "Object". + + * tao/sequence_T.cpp: + * tao/sequence_T.h: + * tao/sequence_T.i: + Fixed some problems with managed sequences. + Sat Jan 17 19:27:12 1998 <coryan@MILONGA> * tao/servant_base.h: diff --git a/TAO/TAO_IDL/be/be_attribute.cpp b/TAO/TAO_IDL/be/be_attribute.cpp index db325652c55..c4e8712d5d3 100644 --- a/TAO/TAO_IDL/be/be_attribute.cpp +++ b/TAO/TAO_IDL/be/be_attribute.cpp @@ -164,6 +164,7 @@ be_attribute::gen_client_stubs (void) { case AST_Decl::NT_interface: case AST_Decl::NT_interface_fwd: + case AST_Decl::NT_string: // no need of size here *cs << "0}"; break; @@ -520,7 +521,7 @@ be_attribute::gen_server_skeletons (void) *ss << "void " << intf->full_skel_name () << "::_get_" << this->local_name () << "_skel (" << "CORBA::ServerRequest &_tao_server_request, " - << "void *_tao_object_reference, void */*context*/, " + << "void *_tao_object_reference, void * /*context*/, " << "CORBA::Environment &_tao_environment)" << nl; *ss << "{\n"; ss->incr_indent (); diff --git a/TAO/TAO_IDL/be/be_interface.cpp b/TAO/TAO_IDL/be/be_interface.cpp index bc065df3d7c..6982232d628 100644 --- a/TAO/TAO_IDL/be/be_interface.cpp +++ b/TAO/TAO_IDL/be/be_interface.cpp @@ -378,13 +378,12 @@ be_interface::gen_client_header (void) *ch << "protected:\n"; ch->incr_indent (); *ch << this->local_name () << " (void); // default constructor" << nl; - *ch << this->local_name () << " (STUB_Object *objref);" << nl; + *ch << this->local_name () << " (STUB_Object *objref);\n"; ch->decr_indent (); // dtor is public... - *ch << "public:\n"; - *ch << "virtual ~" << this->local_name () << " (void);\n"; - ch->decr_indent (); + *ch << "public:" << be_idt_nl + << "virtual ~" << this->local_name () << " (void);" << be_uidt_nl; // private copy constructor and assignment operator. These are not // allowed, hence they are private. @@ -591,7 +590,7 @@ be_interface::gen_client_stubs (void) // generate the is_a method cs->indent (); *cs << "CORBA::Boolean " << this->name () << "::_is_a (" << - "const CORBA::Char *value, CORBA::Environment &env)" << nl; + "const CORBA::Char *value, CORBA::Environment &_tao_environment)" << nl; *cs << "{\n"; cs->incr_indent (); *cs << "if (\n"; @@ -603,11 +602,11 @@ be_interface::gen_client_stubs (void) "inheritance graph failed\n"), -1); } cs->indent (); - *cs << "(!ACE_OS::strcmp ((char *)value, CORBA::_tc_Object->id (env))))\n"; + *cs << "(!ACE_OS::strcmp ((char *)value, CORBA::_tc_Object->id (_tao_environment))))\n"; *cs << "\treturn 1; // success using local knowledge\n"; cs->decr_indent (); *cs << "else" << nl; - *cs << "\treturn this->CORBA_Object::_is_a (value, env); // remote call\n"; + *cs << "\treturn this->CORBA_Object::_is_a (value, _tao_environment); // remote call\n"; cs->decr_indent (); *cs << "}\n\n"; @@ -726,7 +725,7 @@ int be_interface::gen_server_header (void) // add our _is_a method sh->indent (); *sh << "static void _is_a_skel (CORBA::ServerRequest &req, " << - "void *obj, void *context, CORBA::Environment &env);\n\n"; + "void *obj, void *context, CORBA::Environment &_tao_enviroment);\n\n"; // generate skeletons for operations of our base classes. These skeletons // just cast the pointer to the appropriate type before invoking the call @@ -835,8 +834,9 @@ int be_interface::gen_server_skeletons (void) *ss << "CORBA::String value;" << nl; *ss << nl; *ss << "req.orb()->create_list (0, nvlist);" << nl; - *ss << "nv = nvlist->add_value (0, temp_value, CORBA::ARG_IN, env);" << nl; - *ss << "req.params (nvlist, env); // parse the args" << nl; + *ss << "nv = nvlist->add_value (0, temp_value, " + << "CORBA::ARG_IN, _tao_environment);" << nl; + *ss << "req.params (nvlist, _tao_environment); // parse the args" << nl; *ss << "if (_tao_environment.exception () != 0) return;" << nl; *ss << "value = *(CORBA::String *)nv->value ()->value ();" << nl; @@ -848,7 +848,7 @@ int be_interface::gen_server_skeletons (void) << "if (_tao_environment.exception () != 0) return;" << be_nl; *ss << "any = new CORBA::Any (CORBA::_tc_boolean, " << "retval, CORBA::B_TRUE);" << nl; - *ss << "req.result (any, env);\n"; + *ss << "req.result (any, _tao_environment);\n"; ss->decr_indent (); *ss << "}\n\n"; @@ -866,7 +866,8 @@ int be_interface::gen_server_skeletons (void) } ss->indent (); - *ss << "(!ACE_OS::strcmp ((char *)value, CORBA::_tc_Object->id (env))))" + *ss << "(!ACE_OS::strcmp ((char *)value, " + << "CORBA::_tc_Object->id (_tao_environment))))" << be_idt_nl << "return CORBA::B_TRUE;" << be_uidt_nl << "else" << be_idt_nl << "return CORBA::B_TRUE;" << be_uidt << be_uidt << be_uidt_nl @@ -1816,7 +1817,9 @@ be_interface::gen_optable_helper (be_interface *derived, } int -be_interface::is_a_helper (be_interface * /*derived*/, be_interface *bi, TAO_OutStream *os) +be_interface::is_a_helper (be_interface * /*derived*/, + be_interface *bi, + TAO_OutStream *os) { // emit the comparison code os->indent (); diff --git a/TAO/TAO_IDL/be/be_sequence.cpp b/TAO/TAO_IDL/be/be_sequence.cpp index 003e8479ea1..85ed898c6c2 100644 --- a/TAO/TAO_IDL/be/be_sequence.cpp +++ b/TAO/TAO_IDL/be/be_sequence.cpp @@ -1548,7 +1548,7 @@ be_sequence::gen_var_impl (void) } #endif - be_visitor_sequence_elemtype elemtype (ci, this, bt); + be_visitor_sequence_elemtype elemtype (ci, 0, bt); if (bt->accept (&elemtype) == -1) { ACE_ERROR_RETURN ((LM_ERROR, @@ -1915,7 +1915,7 @@ be_sequence::gen_out_impl (void) } #endif - be_visitor_sequence_elemtype elemtype (ci, this, bt); + be_visitor_sequence_elemtype elemtype (ci, 0, bt); if (bt->accept (&elemtype) == -1) { ACE_ERROR_RETURN ((LM_ERROR, diff --git a/TAO/TAO_IDL/be/be_visitor_interface.cpp b/TAO/TAO_IDL/be/be_visitor_interface.cpp index e8c5e016ed1..54c58267468 100644 --- a/TAO/TAO_IDL/be/be_visitor_interface.cpp +++ b/TAO/TAO_IDL/be/be_visitor_interface.cpp @@ -213,8 +213,6 @@ be_visitor_collocated_ss::~be_visitor_collocated_ss (void) int be_visitor_collocated_ss::visit_interface (be_interface *node) { - TAO_NL nl; - TAO_CodeGen *cg = TAO_CODEGEN::instance (); TAO_OutStream *ss = cg->server_skeletons (); @@ -226,7 +224,7 @@ int be_visitor_collocated_ss::visit_interface (be_interface *node) ss->incr_indent (0); ss->incr_indent (); *ss << node->full_skel_name () << "_ptr " - << " servant," << nl; + << " servant," << be_nl; *ss << "STUB_Object *stub\n"; ss->decr_indent (); @@ -234,7 +232,19 @@ int be_visitor_collocated_ss::visit_interface (be_interface *node) ss->decr_indent (0); ss->incr_indent (); - *ss << ": " << node->name () << " (stub)," << nl; +#if defined (ACE_WIN32) + // @@ TODO MSVC++ compiler has some kind of issue (read + // *bug*) wrt nested classes in constructors, if the fully + // qualified name is used it gets all confused. Quite to my + // dismay the work around is to use a non-qualified name for + // the base class! + // I wish I never have to know why the symbol table for + // MSVC++ can get so confused ;-) (coryan) + *ss << ": " << node->local_name () << " (stub)," << be_nl; +#else + *ss << ": " << node->name () << " (stub)," << be_nl; +#endif /* ACE_WIN32 */ + if (this->current_interface_->n_inherits () > 0) { for (int i = 0; i < node->n_inherits (); ++i) @@ -249,11 +259,11 @@ int be_visitor_collocated_ss::visit_interface (be_interface *node) // the base class! // I wish I never have to know why the symbol table for // MSVC++ can get so confused ;-) (coryan) - *ss << " " << parent->local_coll_name () << " (servant)," - << nl; + *ss << " " << parent->local_coll_name () << " (servant, stub)," + << be_nl; #else - *ss << " " << parent->full_coll_name () << " (servant)," - << nl; + *ss << " " << parent->full_coll_name () << " (servant, stub)," + << be_nl; #endif /* ACE_WIN32 */ } } @@ -276,7 +286,7 @@ int be_visitor_collocated_ss::visit_interface (be_interface *node) *ss << "}\n\n"; ss->indent (); - *ss << "CORBA::Boolean " << this->current_interface_->full_skel_name () + *ss << "CORBA::Boolean " << this->current_interface_->full_coll_name () << "::_is_a (" << be_idt << be_idt_nl << "const char* logical_type_id," << be_nl << "CORBA::Environment &_tao_environment" << be_uidt_nl diff --git a/TAO/TAO_IDL/be/be_visitor_sequence.cpp b/TAO/TAO_IDL/be/be_visitor_sequence.cpp index 92ddbf40928..b49d5b95b68 100644 --- a/TAO/TAO_IDL/be/be_visitor_sequence.cpp +++ b/TAO/TAO_IDL/be/be_visitor_sequence.cpp @@ -180,6 +180,9 @@ be_visitor_sequence_base_ch::~be_visitor_sequence_base_ch (void) be_decl * be_visitor_sequence_base_ch::seq_scope (void) { + if (this->node_ == 0) + return 0; + be_decl *scope = 0; if (this->node_->is_nested ()) scope = be_scope::narrow_from_scope (this->node_->defined_in ())->decl (); @@ -300,6 +303,9 @@ be_visitor_sequence_elemtype::~be_visitor_sequence_elemtype (void) be_decl * be_visitor_sequence_elemtype::seq_scope (void) { + if (this->node_ == 0) + return 0; + be_decl *scope = 0; if (this->node_->is_nested ()) scope = be_scope::narrow_from_scope (this->node_->defined_in ())->decl (); @@ -310,15 +316,12 @@ int be_visitor_sequence_elemtype::visit_predefined_type (be_predefined_type *node) { TAO_OutStream &os = this->stream (); - be_sequence *seq = be_sequence::narrow_from_decl (this->be_node ()); - if (!seq) - return -1; switch (node->pt ()) { case AST_PredefinedType::PT_pseudo: - if (seq->unbounded ()) - os << "TAO_Object_Manager<CORBA::Object> "; + os << "TAO_Object_Manager<CORBA::Object> "; + break; default: os << this->current_type_->name () << " &"; } @@ -348,9 +351,6 @@ int be_visitor_sequence_elemtype::visit_interface (be_interface *node) { TAO_OutStream &os = this->stream (); - be_sequence *seq = be_sequence::narrow_from_decl (this->be_node ()); - if (!seq) - return -1; os << "TAO_Object_Manager <" << this->current_type_->nested_type_name (this->seq_scope ()) @@ -363,9 +363,6 @@ int be_visitor_sequence_elemtype::visit_interface_fwd (be_interface_fwd *node) { TAO_OutStream &os = this->stream (); - be_sequence *seq = be_sequence::narrow_from_decl (this->be_node ()); - if (!seq) - return -1; os << "TAO_Object_Manager <" << this->current_type_->nested_type_name (this->seq_scope ()) @@ -378,9 +375,6 @@ int be_visitor_sequence_elemtype::visit_string (be_string * /*node*/) { TAO_OutStream &os = this->stream (); - be_sequence *seq = be_sequence::narrow_from_decl (this->be_node ()); - if (!seq) - return -1; os << "TAO_String_Manager "; return 0; diff --git a/TAO/tao/sequence_T.cpp b/TAO/tao/sequence_T.cpp index 201bcd5f371..b79392b29d0 100644 --- a/TAO/tao/sequence_T.cpp +++ b/TAO/tao/sequence_T.cpp @@ -144,13 +144,15 @@ void TAO_Bounded_Sequence<T,MAX>::_deallocate_buffer (void) template <class T> TAO_Object_Manager<T>::~TAO_Object_Manager (void) { + if (this->release_) + T::_release (*(this->ptr_)); } template <class T> TAO_Object_Manager<T>::TAO_Object_Manager (const TAO_Object_Manager &rhs) { - *this->ptr_ = T::_duplicate (*rhs.ptr_); - this->release_ = _tao_mng_type.release_; + this->ptr_ = rhs.ptr_; + this->release_ = rhs.release_; } template <class T> @@ -163,7 +165,7 @@ TAO_Object_Manager<T>::operator= (const TAO_Object_Manager &rhs) if (this->release_) // need to free old one CORBA::release (*this->ptr_); - *this->ptr_ = T::_duplicate (*rhs.ptr_); + this->ptr_ = rhs.ptr_; return *this; } @@ -216,7 +218,7 @@ TAO_Unbounded_Managed_Sequence<T,Manager>::TAO_Unbounded_Managed_Sequence T* *tmp1 = ACE_reinterpret_cast(T* *,this->buffer_); T* *tmp2 = ACE_reinterpret_cast(T* *,seq.buffer_); for (CORBA::ULong i=0; i < seq.length_; i++) - tmp [i] = T::_duplicate (tmp2 [i]); + tmp1 [i] = T::_duplicate (tmp2 [i]); } // assignment operator @@ -235,7 +237,7 @@ TAO_Unbounded_Managed_Sequence<T,Manager>::operator= T* *tmp1 = ACE_reinterpret_cast(T* *,this->buffer_); T* *tmp2 = ACE_reinterpret_cast(T* *,seq.buffer_); for (CORBA::ULong i=0; i < seq.length_; i++) - tmp [i] = T::_duplicate (tmp2 [i]); + tmp1 [i] = T::_duplicate (tmp2 [i]); return *this; } @@ -309,7 +311,7 @@ TAO_Bounded_Managed_Sequence<T,Manager,MAX>::TAO_Bounded_Managed_Sequence T* *tmp1 = ACE_reinterpret_cast(T* *,this->buffer_); T* *tmp2 = ACE_reinterpret_cast(T* *,seq.buffer_); for (CORBA::ULong i=0; i < seq.length_; i++) - tmp [i] = T::_duplicate (tmp2 [i]); + tmp1 [i] = T::_duplicate (tmp2 [i]); } // assignment operator @@ -328,7 +330,7 @@ TAO_Bounded_Managed_Sequence<T,Manager,MAX>::operator= T* *tmp1 = ACE_reinterpret_cast(T* *,this->buffer_); T* *tmp2 = ACE_reinterpret_cast(T* *,seq.buffer_); for (CORBA::ULong i=0; i < seq.length_; i++) - tmp [i] = T::_duplicate (tmp2 [i]); + tmp1 [i] = T::_duplicate (tmp2 [i]); return *this; } diff --git a/TAO/tao/sequence_T.i b/TAO/tao/sequence_T.i index e2ae782032f..9fd2439490d 100644 --- a/TAO/tao/sequence_T.i +++ b/TAO/tao/sequence_T.i @@ -119,8 +119,8 @@ TAO_Bounded_Sequence<T,MAX>::freebuf (T *buffer) // ************************************************************* template <class T> ACE_INLINE -TAO_Object_Manager<T>::TAO_Object_Manager(T** buffer, CORBA::Boolean release) - : ptr_ (buffer), +TAO_Object_Manager<T>::TAO_Object_Manager(T** ptr, CORBA::Boolean release) + : ptr_ (ptr), release_ (release) { } diff --git a/TAO/tao/servant_base.cpp b/TAO/tao/servant_base.cpp index 3461609faf7..b2c029d307a 100644 --- a/TAO/tao/servant_base.cpp +++ b/TAO/tao/servant_base.cpp @@ -38,6 +38,17 @@ TAO_ServantBase::_is_a (const char* logical_type_id, return CORBA::B_FALSE; } + +void* +TAO_ServantBase::_downcast (const char* logical_type_id) +{ + if (ACE_OS::strcmp (logical_type_id, CORBA::_tc_Object->id ()) == 0) + { + return this; + } + return 0; +} + void TAO_ServantBase::set_parent (TAO_IUnknown *p) { diff --git a/TAO/tao/servant_base.h b/TAO/tao/servant_base.h index 9e6f0937c74..f430ac2bd38 100644 --- a/TAO/tao/servant_base.h +++ b/TAO/tao/servant_base.h @@ -52,7 +52,7 @@ public: virtual const char *_interface_repository_id (void) const = 0; // Get this interface's repository id - virtual void *_downcast (const char *repository_id) = 0; + virtual void *_downcast (const char *repository_id); // Get the correct vtable protected: |