diff options
Diffstat (limited to 'TAO/TAO_IDL/be/be_visitor_interface/interface_cs.cpp')
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_interface/interface_cs.cpp | 137 |
1 files changed, 70 insertions, 67 deletions
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 c36393fe791..9539f64869a 100644 --- a/TAO/TAO_IDL/be/be_visitor_interface/interface_cs.cpp +++ b/TAO/TAO_IDL/be/be_visitor_interface/interface_cs.cpp @@ -69,77 +69,50 @@ be_visitor_interface_cs::visit_interface (be_interface *node) << "if (is_a == 0)" << be_idt_nl << "return " << node->full_name () << "::_nil ();" << be_uidt_nl; + *os << "return " << node->full_name () + << "::_unchecked_narrow (obj, ACE_TRY_ENV);" << be_uidt_nl + << "}" << be_nl << be_nl; + // This may be necessary to work around a GCC compiler bug! // const char *skel_name = node->full_skel_name (); // unused at this time // const char *coll_name = node->full_coll_name (); // assert (coll_name != 0); // The _unchecked_narrow method - if (!idl_global->gen_locality_constraint ()) - { - *os << "return " << node->full_name () - << "::_unchecked_narrow (obj, ACE_TRY_ENV);" << be_uidt_nl - << "}" << be_nl << be_nl; - - *os << node->full_name () << "_ptr " << node->full_name () - << "::_unchecked_narrow (" << be_idt << be_idt_nl - << "CORBA::Object_ptr obj," << be_nl - << "CORBA::Environment &" << be_uidt_nl - << ")" << be_uidt_nl - << "{" << be_idt_nl - << "if (CORBA::is_nil (obj))" << be_idt_nl - << "return " << node->full_name () << "::_nil ();" << be_uidt_nl; - - *os << "TAO_Stub* stub = obj->_stubobj ();" << be_nl - << "stub->_incr_refcnt ();" << be_nl; - - *os << "if (obj->_is_collocated () && _TAO_collocation_" - << node->flat_name () << "_Stub_Factory_function_pointer != 0)" - << be_idt_nl << "{" << be_idt_nl << node->local_name () - << "_ptr retv = _TAO_collocation_" - << node->flat_name () << "_Stub_Factory_function_pointer (obj);" - << be_nl << "if (retv != 0)" << be_idt_nl << "return retv;" - << be_uidt << be_uidt_nl << "}" << be_uidt_nl; - - *os << node->full_name () << "_ptr retval = 0;" << be_nl - << "ACE_NEW_RETURN (retval, " << node->full_name () - << " (stub), 0);" << be_nl - << "return retval;" << be_uidt_nl - << "}" << be_nl << be_nl; - - // The _duplicate method - *os << node->full_name () << "_ptr " << be_nl - << node->full_name () << "::_duplicate (" - << node->full_name () << "_ptr obj)" << be_nl - << "{" << be_idt_nl - << "if (!CORBA::is_nil (obj))" << be_idt_nl - << "obj->_incr_refcnt ();" << be_uidt_nl - << "return obj;" << be_uidt_nl; - } - else - { - // _narrow implementation for locality constraint object. - *os << "void *servant = 0;" << be_nl - << "if (!obj->_is_collocated ()" << be_idt << be_idt << be_idt_nl - << "|| !obj->_servant ()" << be_nl - << "|| (servant = obj->_servant()->_downcast (\"" - << node->repoID () << "\")) == 0" << be_uidt_nl - << ")" << be_uidt_nl - << "ACE_THROW_RETURN (CORBA::MARSHAL (), " - << node->full_name () << "::_nil ());" << be_uidt_nl; - - // Locality constraint objects alway use "direct" collocated - // implementation. - *os << node->full_name () << "_ptr retval = 0;" << be_nl - << "ACE_NEW_RETURN (" << be_idt << be_idt_nl - << "retval," << be_nl - << node->full_coll_name (be_interface::DIRECT) << " (" - << "ACE_reinterpret_cast (POA_" << node->full_name () - << "_ptr, servant), 0)," << be_nl - << "0" << be_uidt_nl << ");" << be_uidt_nl - << "return retval;" << be_uidt_nl; - } - *os << "}" << be_nl << be_nl; + *os << node->full_name () << "_ptr " << node->full_name () + << "::_unchecked_narrow (" << be_idt << be_idt_nl + << "CORBA::Object_ptr obj," << be_nl + << "CORBA::Environment &" << be_uidt_nl + << ")" << be_uidt_nl + << "{" << be_idt_nl + << "if (CORBA::is_nil (obj))" << be_idt_nl + << "return " << node->full_name () << "::_nil ();" << be_uidt_nl; + + *os << "TAO_Stub* stub = obj->_stubobj ();" << be_nl + << "stub->_incr_refcnt ();" << be_nl; + + *os << "if (obj->_is_collocated () && _TAO_collocation_" << node->flat_name () + << "_Stub_Factory_function_pointer != 0)" << be_idt_nl + << "{" << be_idt_nl + << node->local_name () << "_ptr retv = _TAO_collocation_" + << node->flat_name () + << "_Stub_Factory_function_pointer (obj);" << be_nl + << "if (retv != 0)" << be_idt_nl + << "return retv;" << be_uidt << be_uidt_nl + << "}" << be_uidt_nl; + + *os << "return new " << node->full_name () << "(stub);" << be_uidt_nl + << "}" << be_nl << be_nl; + + // The _duplicate method + *os << node->full_name () << "_ptr " << be_nl + << node->full_name () << "::_duplicate (" + << node->full_name () << "_ptr obj)" << be_nl + << "{" << be_idt_nl + << "if (!CORBA::is_nil (obj))" << be_idt_nl + << "obj->_incr_refcnt ();" << be_uidt_nl + << "return obj;" << be_uidt_nl + << "}" << be_nl << be_nl; // generate code for the elements of the interface if (this->visit_scope (node) == -1) @@ -206,7 +179,7 @@ be_visitor_interface_cs::visit_interface (be_interface *node) if (idl_global->ami_call_back () == I_TRUE) { - be_interface_type_strategy *old_strategy = + be_interface_type_strategy *old_strategy = node->set_strategy (new be_interface_ami_handler_strategy (node)); // = Generate the default stub code for Handler. @@ -215,7 +188,7 @@ be_visitor_interface_cs::visit_interface (be_interface *node) be_visitor_context ctx (*this->ctx_); // Set the state. - ctx.state (TAO_CodeGen::TAO_AMI_HANDLER_INTERFACE_CS); + ctx.state (TAO_CodeGen::TAO_AMI_HANDLER_STUB_CS); // Create the visitor. be_visitor *visitor = tao_cg->make_visitor (&ctx); @@ -240,6 +213,36 @@ be_visitor_interface_cs::visit_interface (be_interface *node) } delete visitor; + // = Generate the Servant Skeleton code. + // Set the context. + ctx = *this->ctx_; + + // Set the state. + ctx.state (TAO_CodeGen::TAO_AMI_HANDLER_SERVANT_CS); + + // Create the visitor. + visitor = tao_cg->make_visitor (&ctx); + if (!visitor) + { + ACE_ERROR_RETURN ((LM_ERROR, + "(%N:%l) be_visitor_interface_cs::" + "visit_interface - " + "Bad visitor\n"), + -1); + } + + // Call the visitor on this interface. + if (node->accept (visitor) == -1) + { + delete visitor; + ACE_ERROR_RETURN ((LM_ERROR, + "(%N:%l) be_visitor_interface_cs::" + "visit_interface - " + "code gen for ami handler failed\n"), + -1); + } + delete visitor; + delete node->set_strategy (old_strategy); } |