diff options
Diffstat (limited to 'TAO/TAO_IDL/be/be_visitor_sequence/any_op_cs.cpp')
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_sequence/any_op_cs.cpp | 169 |
1 files changed, 142 insertions, 27 deletions
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/any_op_cs.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/any_op_cs.cpp index fe8df12a2da..ead93407e9b 100644 --- a/TAO/TAO_IDL/be/be_visitor_sequence/any_op_cs.cpp +++ b/TAO/TAO_IDL/be/be_visitor_sequence/any_op_cs.cpp @@ -18,8 +18,8 @@ // *************************************************************************** be_visitor_sequence_any_op_cs::be_visitor_sequence_any_op_cs ( - be_visitor_context *ctx - ) + be_visitor_context *ctx + ) : be_visitor_decl (ctx) { } @@ -88,21 +88,21 @@ be_visitor_sequence_any_op_cs::visit_sequence (be_sequence *node) switch (tc) { - case ANY_OBJREF: - *os << "insert_objref_vector<" - << bt->full_name () << "_ptr> ("; + case ANY_OBJREF: + *os << "insert_objref_vector<" + << bt->full_name () << "_ptr> ("; - break; - case ANY_ARRAY: - *os << "insert_array_vector<" - << bt->full_name () << "_forany> ("; + break; + case ANY_ARRAY: + *os << "insert_array_vector<" + << bt->full_name () << "_forany> ("; - break; - default: - *os << "insert_value_vector<" - << bt->full_name () << "> ("; + break; + default: + *os << "insert_value_vector<" + << bt->full_name () << "> ("; - break; + break; } *os << be_idt_nl @@ -121,21 +121,21 @@ be_visitor_sequence_any_op_cs::visit_sequence (be_sequence *node) switch (tc) { - case ANY_OBJREF: - *os << "extract_objref_vector<" - << bt->full_name () << "_ptr> ("; + case ANY_OBJREF: + *os << "extract_objref_vector<" + << bt->full_name () << "_ptr> ("; - break; - case ANY_ARRAY: - *os << "extract_array_vector<" - << bt->full_name () << "_forany> ("; + break; + case ANY_ARRAY: + *os << "extract_array_vector<" + << bt->full_name () << "_forany> ("; - break; - default: - *os << "extract_value_vector<" - << bt->full_name () << "> ("; + break; + default: + *os << "extract_value_vector<" + << bt->full_name () << "> ("; - break; + break; } *os << be_idt_nl @@ -178,11 +178,121 @@ be_visitor_sequence_any_op_cs::visit_sequence (be_sequence *node) << "}" << be_uidt_nl << "}" << be_nl; } - + + *os << be_global->core_versioning_end () << be_nl; + // If this is non-zero, we want to call its tc_name() // for the TypeCode to pass to the Any operator impls. be_typedef *td = this->ctx_->tdef (); + be_module *module = 0; + if (node->is_nested ()) + { + AST_Decl *d = node; + AST_Decl::NodeType nt = d->node_type (); + + while (nt != AST_Decl::NT_root) + { + if (nt == AST_Decl::NT_module) + { + module = be_module::narrow_from_decl (d); + break; + } + else + { + d = ScopeAsDecl (d->defined_in ()); + nt = d->node_type (); + } + } + + if (module != 0) + { + // Some compilers handle "any" operators in a namespace + // corresponding to their module, others do not. + *os << "\n\n#if defined (ACE_ANY_OPS_USE_NAMESPACE)\n"; + + be_util::gen_nested_namespace_begin (os, module); + + // Copying insertion. + *os << be_nl + << "// Copying insertion." << be_nl + << "void operator<<= (" << be_idt << be_idt_nl + << "::CORBA::Any &_tao_any," << be_nl + << "const ::" << node->name () << " &_tao_elem" << be_uidt_nl + << ")" << be_uidt_nl + << "{" << be_idt_nl + + << "if (0 == &_tao_elem) // Trying to de-reference NULL object" + << be_idt_nl + << "_tao_any <<= static_cast< ::" << node->name () + << " *>( 0 ); // Use non-copying insertion of a NULL" << be_uidt_nl + << "else" << be_idt_nl + + << "TAO::Any_Dual_Impl_T< ::" << node->name () << ">::insert_copy (" + << be_idt << be_idt_nl + << "_tao_any," << be_nl + << "::" << node->name () << "::_tao_any_destructor," << be_nl + << "::" << (td != 0 ? td->tc_name () : node->tc_name ()) << "," << be_nl + << "_tao_elem" << be_uidt_nl + << ");" << be_uidt << be_uidt << be_uidt_nl + << "}" << be_nl << be_nl; + + // Non-copying insertion. + *os << "// Non-copying insertion." << be_nl + << "void operator<<= (" << be_idt << be_idt_nl + << "::CORBA::Any &_tao_any," << be_nl + << "::" << node->name () << " *_tao_elem" << be_uidt_nl + << ")" << be_uidt_nl + << "{" << be_idt_nl + << "TAO::Any_Dual_Impl_T< ::" << node->name () << ">::insert (" + << be_idt << be_idt_nl + << "_tao_any," << be_nl + << "::" << node->name () << "::_tao_any_destructor," << be_nl + << "::" << (td != 0 ? td->tc_name () : node->tc_name ()) << "," << be_nl + << "_tao_elem" << be_uidt_nl + << ");" << be_uidt << be_uidt_nl + << "}" << be_nl << be_nl; + + // Extraction to non-const pointer (deprecated, just calls the other). + *os << "// Extraction to non-const pointer (deprecated)." << be_nl + << "::CORBA::Boolean operator>>= (" << be_idt << be_idt_nl + << "const ::CORBA::Any &_tao_any," << be_nl + << "::" << node->name () << " *&_tao_elem" << be_uidt_nl + << ")" << be_uidt_nl + << "{" << be_idt_nl + << "return _tao_any >>= const_cast<" << be_idt << be_idt_nl + << "const ::" << node->name () << " *&> (" << be_nl + << "_tao_elem" << be_uidt_nl + << ");" << be_uidt << be_uidt_nl + << "}" << be_nl << be_nl; + + // Extraction to const pointer. + *os << "// Extraction to const pointer." << be_nl + << "::CORBA::Boolean operator>>= (" << be_idt << be_idt_nl + << "const ::CORBA::Any &_tao_any," << be_nl + << "const ::" << node->name () << " *&_tao_elem" << be_uidt_nl + << ")" << be_uidt_nl + << "{" << be_idt_nl + << "return" << be_idt_nl + << "TAO::Any_Dual_Impl_T< ::" << node->name () << ">::extract (" + << be_idt << be_idt_nl + << "_tao_any," << be_nl + << "::" << node->name () << "::_tao_any_destructor," << be_nl + << "::" << (td != 0 ? td->tc_name () : node->tc_name ()) << "," << be_nl + << "_tao_elem" << be_uidt_nl + << ");" << be_uidt << be_uidt << be_uidt_nl + << "}"; + + be_util::gen_nested_namespace_end (os, module); + + // Emit #else. + *os << be_nl << be_nl + << "#else\n\n"; + } + } + + *os << be_global->core_versioning_begin () << be_nl; + // Copying insertion. *os << be_nl << "// Copying insertion." << be_nl @@ -254,6 +364,11 @@ be_visitor_sequence_any_op_cs::visit_sequence (be_sequence *node) << "}"; *os << be_global->core_versioning_end () << be_nl; + + if (module != 0) + { + *os << "\n\n#endif"; + } node->cli_stub_any_op_gen (true); return 0; |