summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/be/be_visitor_interface/interface_cs.cpp
diff options
context:
space:
mode:
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.cpp137
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);
}