summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcoryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1998-01-18 03:02:28 +0000
committercoryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1998-01-18 03:02:28 +0000
commitfc989aed9b5598fb71b370579fee7410235931ee (patch)
tree9f684ce4a987250b77a5e8a54812b07fac09dba6
parentbdd2d07f075298e1872ec4737cdcfdbe6babbe5b (diff)
downloadATCD-fc989aed9b5598fb71b370579fee7410235931ee.tar.gz
ChangeLogTag:Sat Jan 17 20:54:26 1998 <coryan@MILONGA>
-rw-r--r--TAO/ChangeLog-98c22
-rw-r--r--TAO/TAO_IDL/be/be_attribute.cpp3
-rw-r--r--TAO/TAO_IDL/be/be_interface.cpp29
-rw-r--r--TAO/TAO_IDL/be/be_sequence.cpp4
-rw-r--r--TAO/TAO_IDL/be/be_visitor_interface.cpp28
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence.cpp22
-rw-r--r--TAO/tao/sequence_T.cpp16
-rw-r--r--TAO/tao/sequence_T.i4
-rw-r--r--TAO/tao/servant_base.cpp11
-rw-r--r--TAO/tao/servant_base.h2
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: