diff options
author | coryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1998-01-18 07:10:33 +0000 |
---|---|---|
committer | coryan <coryan@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1998-01-18 07:10:33 +0000 |
commit | 6675fbb0b36f86f7b852971cb18dba8c77dbe06d (patch) | |
tree | 78b00d399ab3508176c8ed0b6378521bc9a9872a | |
parent | fc989aed9b5598fb71b370579fee7410235931ee (diff) | |
download | ATCD-6675fbb0b36f86f7b852971cb18dba8c77dbe06d.tar.gz |
ChangeLogTag:Sun Jan 18 01:04:22 1998 <coryan@MILONGA>
-rw-r--r-- | TAO/ChangeLog-98c | 11 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_attribute.cpp | 2 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_codegen.cpp | 3 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_interface.cpp | 120 | ||||
-rw-r--r-- | TAO/TAO_IDL/be_include/be_interface.h | 4 | ||||
-rw-r--r-- | TAO/tao/servant_base.h | 7 |
6 files changed, 108 insertions, 39 deletions
diff --git a/TAO/ChangeLog-98c b/TAO/ChangeLog-98c index f65e4a1ec4e..d7ceca8661b 100644 --- a/TAO/ChangeLog-98c +++ b/TAO/ChangeLog-98c @@ -1,3 +1,14 @@ +Sun Jan 18 01:04:22 1998 <coryan@MILONGA> + + * TAO_IDL/be/be_attribute.cpp: + * TAO_IDL/be/be_codegen.cpp: + * TAO_IDL/be/be_interface.cpp: + * TAO_IDL/be_include/be_interface.h: + * tao/servant_base.h: + Added support for collocation in the _narrow method, this + required a complete implementation of _downcast() for each + skeleton. + Sat Jan 17 20:54:26 1998 <coryan@MILONGA> * TAO_IDL/be/be_attribute.cpp: diff --git a/TAO/TAO_IDL/be/be_attribute.cpp b/TAO/TAO_IDL/be/be_attribute.cpp index c4e8712d5d3..294a7c4c0b2 100644 --- a/TAO/TAO_IDL/be/be_attribute.cpp +++ b/TAO/TAO_IDL/be/be_attribute.cpp @@ -586,7 +586,7 @@ be_attribute::gen_server_skeletons (void) *ss << "void " << intf->full_skel_name () << "::_set_" << 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_codegen.cpp b/TAO/TAO_IDL/be/be_codegen.cpp index 005735ec430..d1214f1a8b9 100644 --- a/TAO/TAO_IDL/be/be_codegen.cpp +++ b/TAO/TAO_IDL/be/be_codegen.cpp @@ -270,6 +270,9 @@ TAO_CodeGen::client_stubs (const char *fname) *this->client_stubs_ << "#include \"" << idl_global->be_get_client_hdr_fname () << "\"\n\n"; + *this->client_stubs_ << "#include \"" << + idl_global->be_get_server_hdr_fname () << "\"\n\n"; + // generate the code that includes the inline file if not included in the // header file *this->client_stubs_ << "#if !defined (__ACE_INLINE__)\n"; diff --git a/TAO/TAO_IDL/be/be_interface.cpp b/TAO/TAO_IDL/be/be_interface.cpp index 6982232d628..20bdc2c7a76 100644 --- a/TAO/TAO_IDL/be/be_interface.cpp +++ b/TAO/TAO_IDL/be/be_interface.cpp @@ -377,8 +377,11 @@ be_interface::gen_client_header (void) ch->decr_indent (); *ch << "protected:\n"; ch->incr_indent (); - *ch << this->local_name () << " (void); // default constructor" << nl; - *ch << this->local_name () << " (STUB_Object *objref);\n"; + *ch << this->local_name () << " (" << be_idt << be_idt_nl + << "STUB_Object *objref = 0," << be_nl + << "TAO_ServantBase *servant = 0," << be_nl + << "CORBA::Boolean collocated = CORBA::B_FALSE" << be_uidt_nl + << ");\n" << be_uidt; ch->decr_indent (); // dtor is public... @@ -431,23 +434,28 @@ be_interface::gen_client_inline (void) TAO_OutStream *ci = cg->client_inline (); ci->indent (); // start from the current indentation level - // generate the constructors and destructor *ci << "ACE_INLINE" << nl; - *ci << this->name () << "::" << this->local_name () << - " (void) // default constructor" << nl; - *ci << "{}" << nl << nl; - - *ci << "ACE_INLINE" << nl; - *ci << this->name () << "::" << this->local_name () << - " (STUB_Object *objref) // constructor" << nl; - *ci << "\t: ACE_CORBA_1 (Object) (objref)" << nl; - *ci << "{}" << nl << nl; + *ci << this->name () << "::" + << this->local_name () << "(" << be_idt << be_idt_nl + << "STUB_Object *objref," << be_nl + << "TAO_ServantBase *servant," << be_nl + << "CORBA::Boolean collocated" << be_uidt_nl + << ")" << be_uidt_nl + << " : ACE_CORBA_1 (Object) (objref, servant, collocated)" << be_nl + << "{}" << be_nl << be_nl; *ci << "ACE_INLINE" << nl; *ci << this->name () << "::~" << this->local_name () << " (void) // destructor" << nl; *ci << "{}\n\n"; + // _nil method + *ci << "ACE_INLINE " << this->name () << "_ptr" << be_nl + << this->name () << "::_nil (void)" << be_nl + << "{" << be_idt_nl + << "return (" << this->name () << "_ptr)0;" << be_uidt_nl + << "}\n" << be_nl; + // generate the ifdefined macro for the _var type ci->gen_ifdef_macro (this->flatname (), "_var"); @@ -510,14 +518,19 @@ be_interface::gen_client_stubs (void) // The _narrow method *cs << this->name () << "_ptr " << this->name () - << "::_narrow (CORBA::Object_ptr obj, CORBA::Environment &env)" << nl; - *cs << "{\n"; - cs->incr_indent (); - *cs << "if (CORBA::is_nil (obj)) return " << this->name () << "::_nil ();" << - nl; - *cs << "if (obj->_is_a (\"" << this->repoID () << "\", env))" << nl; - *cs << "{\n"; - cs->incr_indent (); + << "::_narrow (" << be_idt << be_idt_nl + << "CORBA::Object_ptr obj," << be_nl + << "CORBA::Environment &env" << be_uidt_nl + << ")" << be_uidt_nl + << "{" << be_idt_nl + << "if (CORBA::is_nil (obj))" << be_idt_nl + << "return " << this->name () << "::_nil ();" << be_uidt_nl + << "if (!obj->_is_a (\"" << this->repoID () << "\", env))" + << be_idt_nl + << "return " << this->name () << "::_nil ();" << be_uidt_nl; + + *cs << "if (!obj->_is_collocated () || !obj->_servant())" << be_nl + << "{" << be_idt_nl; *cs << "STUB_Object *istub;" << nl; *cs << this->name () << "_ptr new_obj; // to be returned " << nl; #if 0 // XXXASG - I was told that emitting this line of code is the root cause @@ -539,19 +552,20 @@ be_interface::gen_client_stubs (void) << "// construct obj ref using the stub object" << nl; *cs << "return new_obj;\n"; cs->decr_indent (); - *cs << "} // end of if" << nl; - *cs << "return " << this->name () << "::_nil (); // _narrow failed\n"; - cs->decr_indent (); - *cs << "} // end of _narrow" << nl << nl; - - // _nil method - *cs << this->name () << "_ptr " << this->name () << "::_nil (void)" << - nl; - *cs << "{\n"; - cs->incr_indent (); - *cs << "return (" << this->name () << "_ptr)NULL;\n"; - cs->decr_indent (); - *cs << "} // end of _nil" << nl << nl; + *cs << "} // end of if\n" << nl; + + *cs << "STUB_Object *stub = obj->_servant ()->_create_stub (env);" << be_nl + << "if (env.exception () != 0)" << be_idt_nl + << "return " << this->name () << "::_nil ();" << be_uidt_nl + << "void* servant = obj->_servant ()->_downcast (\"" + << this->repoID () << "\");" << be_nl + << "return new " + << this->full_coll_name () << "(" << be_idt << be_idt_nl + << "ACE_reinterpret_cast(" << this->full_skel_name () + << "_ptr, servant)," << be_nl + << "stub" << be_uidt_nl + << ");" << be_uidt << be_uidt_nl + << "}" << be_nl << be_nl; // the _bind method *cs << this->name () << "_ptr " << this->name () << "::_bind (" << @@ -714,6 +728,11 @@ int be_interface::gen_server_header (void) << "CORBA::Environment &_tao_environment" << be_uidt << ");\n" << be_uidt; + sh->indent (); + *sh << "virtual void* _downcast (" << be_idt << be_idt_nl + << "const char* logical_type_id" << be_uidt_nl + << ");\n" << be_uidt; + // generate code for elements in the scope (e.g., operations) if (be_scope::gen_server_header () == -1) { @@ -870,9 +889,30 @@ int be_interface::gen_server_skeletons (void) << "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 + << "return CORBA::B_FALSE;" << be_uidt << be_uidt << be_uidt_nl << "}\n\n"; + ss->indent (); + *ss << "void* " << this->full_skel_name () + << "::_downcast (" << be_idt << be_idt_nl + << "const char* logical_type_id" << be_uidt_nl + << ")" << be_uidt_nl + << "{" << be_idt_nl; + + if (this->traverse_inheritance_graph (be_interface::downcast_helper, ss) == -1) + { + return -1; + } + + *ss << "if (ACE_OS::strcmp (logical_type_id, " + << "\"IDL:omg.org/CORBA/Object:1.0\") == 0)" << be_idt_nl + << "return ACE_static_cast(PortableServer::Servant, this);" + << be_uidt_nl; + + *ss << "return 0;" << be_uidt_nl + << "}\n\n"; + + // now the dispatch method ss->indent (); *ss << "void " << this->full_skel_name () << @@ -1830,6 +1870,18 @@ be_interface::is_a_helper (be_interface * /*derived*/, } int +be_interface::downcast_helper (be_interface * /* derived */, + be_interface *base, + TAO_OutStream *os) +{ + *os << "if (ACE_OS::strcmp (logical_type_id, \"" + << base->repoID () << "\") == 0)" << be_idt_nl + << "return ACE_static_cast (" + << base->full_skel_name () << "_ptr, this);" << be_uidt_nl; + return 0; +} + +int be_interface::gen_skel_helper (be_interface *derived, be_interface *ancestor, TAO_OutStream *os) diff --git a/TAO/TAO_IDL/be_include/be_interface.h b/TAO/TAO_IDL/be_include/be_interface.h index 397da2c5766..24536da765d 100644 --- a/TAO/TAO_IDL/be_include/be_interface.h +++ b/TAO/TAO_IDL/be_include/be_interface.h @@ -136,6 +136,10 @@ public: static int is_a_helper (be_interface *, be_interface *, TAO_OutStream *os); // helper method passed to the template method + static int downcast_helper (be_interface *, + be_interface *, + TAO_OutStream *os); + static int gen_optable_helper (be_interface *, be_interface *, TAO_OutStream *os); diff --git a/TAO/tao/servant_base.h b/TAO/tao/servant_base.h index f430ac2bd38..7e9f05d1e88 100644 --- a/TAO/tao/servant_base.h +++ b/TAO/tao/servant_base.h @@ -55,6 +55,9 @@ public: virtual void *_downcast (const char *repository_id); // Get the correct vtable + virtual STUB_Object *_create_stub (CORBA_Environment &_env); + // This is an auxiliar method for _this() and _narrow(). + protected: TAO_ServantBase (void); // Default constructor, only derived classes can be created. @@ -68,10 +71,6 @@ protected: // internal (implementation) method its name should start with '_' protected: - STUB_Object *_create_stub (CORBA_Environment &_env); - // This is an auxiliar method for _this(). - -protected: TAO_Operation_Table *optable_; // The operation table for this servant, it is initialized by the // most derived class. |