From b4fc474c68da5b22ac89d954ef00c52ebe8c2d46 Mon Sep 17 00:00:00 2001 From: parsons Date: Sat, 25 Oct 2003 05:46:08 +0000 Subject: ChangeLogTag: Sat Oct 25 000:28:02 2003 Jeff Parsons --- TAO/ChangeLog_ref | 53 +++++++ TAO/TAO_IDL/be/be_visitor_array/any_op_cs.cpp | 36 ++++- TAO/TAO_IDL/be/be_visitor_enum/any_op_cs.cpp | 29 ++++ TAO/TAO_IDL/be/be_visitor_enum/enum_cs.cpp | 3 +- TAO/TAO_IDL/be/be_visitor_exception/any_op_cs.cpp | 53 +++---- TAO/TAO_IDL/be/be_visitor_interface/any_op_cs.cpp | 11 +- TAO/TAO_IDL/be/be_visitor_sequence/any_op_cs.cpp | 29 ++++ TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp | 3 +- TAO/TAO_IDL/be/be_visitor_structure/any_op_cs.cpp | 29 ++++ TAO/TAO_IDL/be/be_visitor_tmplinst.cpp | 1 + .../be/be_visitor_tmplinst/arg_tmplinst.cpp | 2 +- TAO/TAO_IDL/be/be_visitor_tmplinst/tmplinst_cs.cpp | 93 +++++++++++- TAO/TAO_IDL/be/be_visitor_tmplinst/tmplinst_ss.cpp | 48 ++++++ TAO/TAO_IDL/be/be_visitor_union/any_op_cs.cpp | 29 ++++ .../be/be_visitor_valuetype/valuetype_cs.cpp | 2 +- .../be_include/be_visitor_tmplinst/tmplinst_cs.h | 2 + .../be_include/be_visitor_tmplinst/tmplinst_ss.h | 2 + TAO/tao/Any.cpp | 46 +++++- TAO/tao/Object.cpp | 64 +++++++- TAO/tao/PortableServer/Default_ORTC.cpp | 36 +---- TAO/tao/PortableServer/Default_ORTC.h | 4 - TAO/tao/PortableServer/PortableServerC.cpp | 165 ++++++++++++++++++++- TAO/tao/Typecode.cpp | 65 ++++++-- 23 files changed, 696 insertions(+), 109 deletions(-) diff --git a/TAO/ChangeLog_ref b/TAO/ChangeLog_ref index 3a76d1ca7fa..4f663f28f78 100644 --- a/TAO/ChangeLog_ref +++ b/TAO/ChangeLog_ref @@ -1,3 +1,56 @@ +Sat Oct 25 000:28:02 2003 Jeff Parsons + + * tao/Any.cpp: + * tao/Object.cpp: + * tao/Typecode.cpp: + + Added still more explicit template instantiations, + for the argument template helper classes parameterized + with the above types. + + * tao/PortableServer/Default_ORTC.cpp: + * tao/PortableServer/Default_ORTC.h: + + Updated implementation of _downcast() and removed + the now-unnecessary *_tao_obv_narrow() instances. + + * tao/PortableServer/PortableServerC.cpp: + + Updated generated code for Any operators of types + that are nested inside a local interface. + + * TAO_IDL/be/be_visitor_tmplinst.cpp: + * TAO_IDL/be/be_visitor_array/any_op_cs.cpp: + * TAO_IDL/be/be_visitor_enum/any_op_cs.cpp: + * TAO_IDL/be/be_visitor_enum/enum_cs.cpp: + * TAO_IDL/be/be_visitor_exception/any_op_cs.cpp: + * TAO_IDL/be/be_visitor_interface/any_op_cs.cpp: + * TAO_IDL/be/be_visitor_sequence/any_op_cs.cpp: + * TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp: + * TAO_IDL/be/be_visitor_structure/any_op_cs.cpp: + * TAO_IDL/be/be_visitor_tmplinst/arg_tmplinst.cpp: + * TAO_IDL/be/be_visitor_tmplinst/tmplinst_cs.cpp: + * TAO_IDL/be/be_visitor_tmplinst/tmplinst_ss.cpp: + * TAO_IDL/be/be_visitor_union/any_op_cs.cpp: + * TAO_IDL/be/be_visitor_valuetype/valuetype_cs.cpp: + * TAO_IDL/be_include/be_visitor_tmplinst/tmplinst_cs.h: + * TAO_IDL/be_include/be_visitor_tmplinst/tmplinst_ss.h: + + - Added explicit template instantiation code generation + for parameters of operations associated with + interface attributes. + + - Added generation of overrides (returning 0) of + Any_*_Impl::(de)marshal_value() for types that are + nested inside a local interface. + + - Changed generated #ifdef guard around explicit template + instantiation of sequence base class to use a string + aggregated from the unaliased element type flat name and + the bound (if any), thus avoiding duplicate instantiations + of the base class when it is a parent of multiple unique + derived sequence classes. + Fri Oct 24 19:22:10 2003 Balachandran Natarajan * tao/Valuetype/AbstractBase_T.h: diff --git a/TAO/TAO_IDL/be/be_visitor_array/any_op_cs.cpp b/TAO/TAO_IDL/be/be_visitor_array/any_op_cs.cpp index fe40142088c..9ce08329aeb 100644 --- a/TAO/TAO_IDL/be/be_visitor_array/any_op_cs.cpp +++ b/TAO/TAO_IDL/be/be_visitor_array/any_op_cs.cpp @@ -88,8 +88,7 @@ be_visitor_array_any_op_cs::visit_array (be_array *node) << "TAO::Any_Array_Impl_T<" << be_idt << be_idt_nl << node->name () << "_slice," << be_nl << node->name () << "_forany" << be_uidt_nl - << ">::extract (" - << be_idt << be_idt_nl + << ">::extract (" << be_idt << be_idt_nl << "_tao_any," << be_nl << node->name () << "_forany::_tao_any_destructor," << be_nl << node->tc_name () << "," << be_nl @@ -100,6 +99,39 @@ be_visitor_array_any_op_cs::visit_array (be_array *node) << ");" << be_uidt << be_uidt << be_uidt << be_uidt_nl << "}"; + // Since we don't generate CDR stream operators for types that + // explicitly contain a local interface (at some level), we + // must override these Any template class methods to avoid + // calling the non-existent operators. The zero return value + // will eventually cause CORBA::MARSHAL to be raised if this + // type is inserted into an Any and then marshaled. + if (node->is_local ()) + { + TAO_OutStream *os = this->ctx_->stream (); + + *os << be_nl << be_nl + << "ACE_TEMPLATE_SPECIALIZATION" << be_nl + << "CORBA::Boolean" << be_nl + << "TAO::Any_Array_Impl_T<" << be_idt << be_idt_nl + << node->name () << "_slice," << be_nl + << node->name () << "_forany" << be_uidt_nl + << ">::marshal_value (TAO_OutputCDR &)" << be_uidt_nl + << "{" << be_idt_nl + << "return 0;" << be_uidt_nl + << "}"; + + *os << be_nl << be_nl + << "ACE_TEMPLATE_SPECIALIZATION" << be_nl + << "CORBA::Boolean" << be_nl + << "TAO::Any_Array_Impl_T<" << be_idt << be_idt_nl + << node->name () << "_slice," << be_nl + << node->name () << "_forany" << be_uidt_nl + << ">::demarshal_value (TAO_OutputCDR &)" << be_uidt_nl + << "{" << be_idt_nl + << "return 0;" << be_uidt_nl + << "}"; + } + node->cli_stub_any_op_gen (1); return 0; } diff --git a/TAO/TAO_IDL/be/be_visitor_enum/any_op_cs.cpp b/TAO/TAO_IDL/be/be_visitor_enum/any_op_cs.cpp index 84ccd9f95b5..3bbef0e165a 100644 --- a/TAO/TAO_IDL/be/be_visitor_enum/any_op_cs.cpp +++ b/TAO/TAO_IDL/be/be_visitor_enum/any_op_cs.cpp @@ -80,6 +80,35 @@ be_visitor_enum_any_op_cs::visit_enum (be_enum *node) << ");" << be_uidt << be_uidt << be_uidt_nl << "}"; + // Since we don't generate CDR stream operators for types that + // explicitly contain a local interface (at some level), we + // must override these Any template class methods to avoid + // calling the non-existent operators. The zero return value + // will eventually cause CORBA::MARSHAL to be raised if this + // type is inserted into an Any and then marshaled. + if (node->is_local ()) + { + TAO_OutStream *os = this->ctx_->stream (); + + *os << be_nl << be_nl + << "ACE_TEMPLATE_SPECIALIZATION" << be_nl + << "CORBA::Boolean" << be_nl + << "TAO::Any_Basic_Impl_T<" << node->name () + << ">::marshal_value (TAO_OutputCDR &)" << be_nl + << "{" << be_idt_nl + << "return 0;" << be_uidt_nl + << "}"; + + *os << be_nl << be_nl + << "ACE_TEMPLATE_SPECIALIZATION" << be_nl + << "CORBA::Boolean" << be_nl + << "TAO::Any_Basic_Impl_T<" << node->name () + << ">::demarshal_value (TAO_InputCDR &)" << be_nl + << "{" << be_idt_nl + << "return 0;" << be_uidt_nl + << "}"; + } + node->cli_stub_any_op_gen (1); return 0; } diff --git a/TAO/TAO_IDL/be/be_visitor_enum/enum_cs.cpp b/TAO/TAO_IDL/be/be_visitor_enum/enum_cs.cpp index 292e45147ed..0bb8eb73e98 100644 --- a/TAO/TAO_IDL/be/be_visitor_enum/enum_cs.cpp +++ b/TAO/TAO_IDL/be/be_visitor_enum/enum_cs.cpp @@ -44,8 +44,7 @@ int be_visitor_enum_cs::visit_enum (be_enum *node) { if (node->cli_stub_gen () - || node->imported () - || node->is_local ()) + || node->imported ()) { return 0; } diff --git a/TAO/TAO_IDL/be/be_visitor_exception/any_op_cs.cpp b/TAO/TAO_IDL/be/be_visitor_exception/any_op_cs.cpp index b5f1f26ebb0..86654cacecb 100644 --- a/TAO/TAO_IDL/be/be_visitor_exception/any_op_cs.cpp +++ b/TAO/TAO_IDL/be/be_visitor_exception/any_op_cs.cpp @@ -49,31 +49,34 @@ be_visitor_exception_any_op_cs::visit_exception (be_exception *node) << "// TAO_IDL - Generated from " << be_nl << "// " << __FILE__ << ":" << __LINE__; - *os << be_nl << be_nl - << "ACE_TEMPLATE_SPECIALIZATION" << be_nl - << "CORBA::Boolean" << be_nl - << "TAO::Any_Dual_Impl_T<" << node->name () - << ">::demarshal_value (" << be_idt << be_idt_nl - << "TAO_InputCDR & cdr" << be_uidt_nl - << ")" << be_uidt_nl - << "{" << be_idt_nl - << "CORBA::String_var id;" << be_nl << be_nl - << "if ((cdr >> id.out ()) == 0)" << be_idt_nl - << "{" << be_idt_nl - << "return 0;" << be_uidt_nl - << "}" << be_uidt_nl << be_nl - << "ACE_TRY_NEW_ENV" << be_idt_nl - << "{" << be_idt_nl - << "this->value_->_tao_decode (cdr ACE_ENV_ARG_PARAMETER);" << be_nl - << "ACE_TRY_CHECK;" << be_uidt_nl - << "}" << be_uidt_nl - << "ACE_CATCHANY" << be_idt_nl - << "{" << be_idt_nl - << "return 0;" << be_uidt_nl - << "}" << be_uidt_nl - << "ACE_ENDTRY;" << be_nl << be_nl - << "return 1;" << be_uidt_nl - << "}"; + if (!node->is_local ()) + { + *os << be_nl << be_nl + << "ACE_TEMPLATE_SPECIALIZATION" << be_nl + << "CORBA::Boolean" << be_nl + << "TAO::Any_Dual_Impl_T<" << node->name () + << ">::demarshal_value (" << be_idt << be_idt_nl + << "TAO_InputCDR & cdr" << be_uidt_nl + << ")" << be_uidt_nl + << "{" << be_idt_nl + << "CORBA::String_var id;" << be_nl << be_nl + << "if ((cdr >> id.out ()) == 0)" << be_idt_nl + << "{" << be_idt_nl + << "return 0;" << be_uidt_nl + << "}" << be_uidt_nl << be_nl + << "ACE_TRY_NEW_ENV" << be_idt_nl + << "{" << be_idt_nl + << "this->value_->_tao_decode (cdr ACE_ENV_ARG_PARAMETER);" << be_nl + << "ACE_TRY_CHECK;" << be_uidt_nl + << "}" << be_uidt_nl + << "ACE_CATCHANY" << be_idt_nl + << "{" << be_idt_nl + << "return 0;" << be_uidt_nl + << "}" << be_uidt_nl + << "ACE_ENDTRY;" << be_nl << be_nl + << "return 1;" << be_uidt_nl + << "}"; + } // Copying insertion operator. diff --git a/TAO/TAO_IDL/be/be_visitor_interface/any_op_cs.cpp b/TAO/TAO_IDL/be/be_visitor_interface/any_op_cs.cpp index 24e674ded19..d30c009f4d6 100644 --- a/TAO/TAO_IDL/be/be_visitor_interface/any_op_cs.cpp +++ b/TAO/TAO_IDL/be/be_visitor_interface/any_op_cs.cpp @@ -157,14 +157,11 @@ be_visitor_interface_any_op_cs::visit_interface (be_interface *node) << "}"; // All we have to do is to visit the scope and generate code. - if (!node->is_local ()) + if (this->visit_scope (node) == -1) { - if (this->visit_scope (node) == -1) - { - ACE_ERROR_RETURN ((LM_ERROR, - "(%N:%l) be_visitor_interface::visit_interface - " - "codegen for scope failed\n"), -1); - } + ACE_ERROR_RETURN ((LM_ERROR, + "(%N:%l) be_visitor_interface::visit_interface - " + "codegen for scope failed\n"), -1); } node->cli_stub_any_op_gen (1); 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 cd511a70aef..3a15ff9d5a6 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 @@ -115,6 +115,35 @@ be_visitor_sequence_any_op_cs::visit_sequence (be_sequence *node) << ");" << be_uidt << be_uidt << be_uidt_nl << "}"; + // Since we don't generate CDR stream operators for types that + // explicitly contain a local interface (at some level), we + // must override these Any template class methods to avoid + // calling the non-existent operators. The zero return value + // will eventually cause CORBA::MARSHAL to be raised if this + // type is inserted into an Any and then marshaled. + if (node->is_local ()) + { + TAO_OutStream *os = this->ctx_->stream (); + + *os << be_nl << be_nl + << "ACE_TEMPLATE_SPECIALIZATION" << be_nl + << "CORBA::Boolean" << be_nl + << "TAO::Any_Dual_Impl_T<" << node->name () + << ">::marshal_value (TAO_OutputCDR &)" << be_nl + << "{" << be_idt_nl + << "return 0;" << be_uidt_nl + << "}"; + + *os << be_nl << be_nl + << "ACE_TEMPLATE_SPECIALIZATION" << be_nl + << "CORBA::Boolean" << be_nl + << "TAO::Any_Dual_Impl_T<" << node->name () + << ">::demarshal_value (TAO_InputCDR &)" << be_nl + << "{" << be_idt_nl + << "return 0;" << be_uidt_nl + << "}"; + } + node->cli_stub_any_op_gen (1); return 0; } diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp index 9e1e7eadd39..644fabe8b3a 100644 --- a/TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp +++ b/TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp @@ -37,13 +37,12 @@ be_visitor_sequence_cs::~be_visitor_sequence_cs (void) int be_visitor_sequence_cs::visit_sequence (be_sequence *node) { - be_type *bt = be_type::narrow_from_decl (node->base_type ()); - if (node->imported () || node->cli_stub_gen ()) { return 0; } + be_type *bt = be_type::narrow_from_decl (node->base_type ()); AST_Decl::NodeType nt = bt->node_type (); // If our base type is an anonymous sequence, generate code for it here. diff --git a/TAO/TAO_IDL/be/be_visitor_structure/any_op_cs.cpp b/TAO/TAO_IDL/be/be_visitor_structure/any_op_cs.cpp index 4be0e65948e..a2d2e55facc 100644 --- a/TAO/TAO_IDL/be/be_visitor_structure/any_op_cs.cpp +++ b/TAO/TAO_IDL/be/be_visitor_structure/any_op_cs.cpp @@ -115,6 +115,35 @@ be_visitor_structure_any_op_cs::visit_structure (be_structure *node) << ");" << be_uidt << be_uidt << be_uidt_nl << "}"; + // Since we don't generate CDR stream operators for types that + // explicitly contain a local interface (at some level), we + // must override these Any template class methods to avoid + // calling the non-existent operators. The zero return value + // will eventually cause CORBA::MARSHAL to be raised if this + // type is inserted into an Any and then marshaled. + if (node->is_local ()) + { + TAO_OutStream *os = this->ctx_->stream (); + + *os << be_nl << be_nl + << "ACE_TEMPLATE_SPECIALIZATION" << be_nl + << "CORBA::Boolean" << be_nl + << "TAO::Any_Dual_Impl_T<" << node->name () + << ">::marshal_value (TAO_OutputCDR &)" << be_nl + << "{" << be_idt_nl + << "return 0;" << be_uidt_nl + << "}"; + + *os << be_nl << be_nl + << "ACE_TEMPLATE_SPECIALIZATION" << be_nl + << "CORBA::Boolean" << be_nl + << "TAO::Any_Dual_Impl_T<" << node->name () + << ">::demarshal_value (TAO_InputCDR &)" << be_nl + << "{" << be_idt_nl + << "return 0;" << be_uidt_nl + << "}"; + } + // all we have to do is to visit the scope and generate code if (this->visit_scope (node) == -1) { diff --git a/TAO/TAO_IDL/be/be_visitor_tmplinst.cpp b/TAO/TAO_IDL/be/be_visitor_tmplinst.cpp index edfc6ee31a9..d0b54a4f006 100644 --- a/TAO/TAO_IDL/be/be_visitor_tmplinst.cpp +++ b/TAO/TAO_IDL/be/be_visitor_tmplinst.cpp @@ -23,6 +23,7 @@ #include "be_interface.h" #include "be_valuetype.h" #include "be_array.h" +#include "be_attribute.h" #include "be_enum.h" #include "be_sequence.h" #include "be_string.h" diff --git a/TAO/TAO_IDL/be/be_visitor_tmplinst/arg_tmplinst.cpp b/TAO/TAO_IDL/be/be_visitor_tmplinst/arg_tmplinst.cpp index 5ea7ca6a4d9..8bcf206fed7 100644 --- a/TAO/TAO_IDL/be/be_visitor_tmplinst/arg_tmplinst.cpp +++ b/TAO/TAO_IDL/be/be_visitor_tmplinst/arg_tmplinst.cpp @@ -55,7 +55,7 @@ be_visitor_arg_tmplinst::visit_interface (be_interface *node) switch (this->dir_) { - case _tao_INOUT: + case _tao_INOUT: *os << "," << this->linebreak_ << be_nl << "TAO::Objref_Traits<" << node->name () << ">"; break; diff --git a/TAO/TAO_IDL/be/be_visitor_tmplinst/tmplinst_cs.cpp b/TAO/TAO_IDL/be/be_visitor_tmplinst/tmplinst_cs.cpp index 0ed777bbb29..272b0e9783e 100644 --- a/TAO/TAO_IDL/be/be_visitor_tmplinst/tmplinst_cs.cpp +++ b/TAO/TAO_IDL/be/be_visitor_tmplinst/tmplinst_cs.cpp @@ -500,7 +500,7 @@ be_visitor_tmplinst_cs::visit_array (be_array *node) << "TAO_" << (fixed ? "Fixed" : "Var") << "Array_Var_T<" << this->linebreak_ << be_idt << be_idt_nl << fname << "," << this->linebreak_ << be_nl - << fname << "_slice" << this->linebreak_ << be_nl + << fname << "_slice" << this->linebreak_ << be_uidt_nl << ">" << this->suffix_ << be_uidt << be_uidt << be_uidt; *os << be_nl << be_nl @@ -508,7 +508,7 @@ be_visitor_tmplinst_cs::visit_array (be_array *node) << "TAO_Array_Out_T<" << this->linebreak_ << be_idt << be_idt_nl << fname << "," << this->linebreak_ << be_nl << fname << "_var," << this->linebreak_ << be_nl - << fname << "_slice" << this->linebreak_ << be_nl + << fname << "_slice" << this->linebreak_ << be_uidt_nl << ">" << this->suffix_ << be_uidt << be_uidt << be_uidt; *os << be_nl << be_nl @@ -516,7 +516,7 @@ be_visitor_tmplinst_cs::visit_array (be_array *node) << "TAO_Array_Var_Base_T<" << this->linebreak_ << be_idt << be_idt_nl << fname << "," << this->linebreak_ << be_nl - << fname << "_slice" << this->linebreak_ << be_nl + << fname << "_slice" << this->linebreak_ << be_uidt_nl << ">" << this->suffix_ << be_uidt << be_uidt << be_uidt; } @@ -524,7 +524,7 @@ be_visitor_tmplinst_cs::visit_array (be_array *node) << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl << "TAO_Array_Forany_T<" << this->linebreak_ << be_idt << be_idt_nl << fname << "," << this->linebreak_ << be_nl - << fname << "_slice" << this->linebreak_ << be_nl + << fname << "_slice" << this->linebreak_ << be_uidt_nl << ">" << this->suffix_ << be_uidt << be_uidt << be_uidt; // For Any impl template class. @@ -543,6 +543,54 @@ be_visitor_tmplinst_cs::visit_array (be_array *node) return 0; } +int +be_visitor_tmplinst_cs::visit_attribute (be_attribute *node) +{ + if (this->this_mode_generated (node) + || node->imported () + || node->is_local ()) + { + return 0; + } + + const char * S = ""; + + be_visitor_arg_tmplinst visitor (this->ctx_, + this->mode_, + this->prefix_, + this->suffix_, + this->linebreak_, + S); + be_type *bt = be_type::narrow_from_decl (node->field_type ()); + visitor.direction (); + + if (bt->accept (&visitor) != 0) + { + ACE_ERROR_RETURN ((LM_ERROR, + "(%N:%l) be_visitor_tmplinst_cs::" + "visit_attribute - " + "codegen for return type failed\n"), + -1); + } + + if (!node->readonly ()) + { + visitor.direction (AST_Argument::dir_IN); + + if (bt->accept (&visitor) != 0) + { + ACE_ERROR_RETURN ((LM_ERROR, + "(%N:%l) be_visitor_tmplinst_cs::" + "visit_attribute - " + "codegen for IN parameter failed\n"), + -1); + } + } + + this->this_mode_generated (node, I_TRUE); + return 0; +} + int be_visitor_tmplinst_cs::visit_enum (be_enum *node) { @@ -1029,7 +1077,42 @@ be_visitor_tmplinst_cs::gen_base_class_tmplinst (be_sequence *node) { TAO_OutStream *os = this->ctx_->stream (); - os->gen_ifdef_macro (node->flat_name (), "explicit"); + // A generated sequence is a unique class type for each IDL typedef, + // but the base template class may not be. So, when generating the + // explicit template instantiation of the base class, we use the + // unaliased element type and the bound (if any) in the #ifdef guard to + // prevent duplicates. + + be_type *bt = be_type::narrow_from_decl (node->base_type ()); + AST_Decl::NodeType nt = bt->node_type (); + + if (nt == AST_Decl::NT_typedef) + { + be_typedef *td = be_typedef::narrow_from_decl (bt); + bt = td->primitive_base_type (); + } + + static char ifdef_suffix [NAMEBUFSIZE]; + + ACE_OS::memset (ifdef_suffix, + '\0', + NAMEBUFSIZE); + + if (node->unbounded ()) + { + ACE_OS::sprintf (ifdef_suffix, + "%s", + "explicit"); + } + else + { + ACE_OS::sprintf (ifdef_suffix, + "%d_%s", + node->max_size ()->ev ()->u.ulval, + "explicit"); + } + + os->gen_ifdef_macro (bt->flat_name (), ifdef_suffix); *os << be_nl << be_nl << this->prefix_ << this->linebreak_ << be_idt << be_idt_nl; diff --git a/TAO/TAO_IDL/be/be_visitor_tmplinst/tmplinst_ss.cpp b/TAO/TAO_IDL/be/be_visitor_tmplinst/tmplinst_ss.cpp index f7409e89445..6ead20eafd3 100644 --- a/TAO/TAO_IDL/be/be_visitor_tmplinst/tmplinst_ss.cpp +++ b/TAO/TAO_IDL/be/be_visitor_tmplinst/tmplinst_ss.cpp @@ -297,6 +297,54 @@ be_visitor_tmplinst_ss::visit_array (be_array *node) return 0; } +int +be_visitor_tmplinst_ss::visit_attribute (be_attribute *node) +{ + if (this->this_mode_generated (node) + || node->imported () + || node->is_local ()) + { + return 0; + } + + const char * S = "S"; + + be_visitor_arg_tmplinst visitor (this->ctx_, + this->mode_, + this->prefix_, + this->suffix_, + this->linebreak_, + S); + be_type *bt = be_type::narrow_from_decl (node->field_type ()); + visitor.direction (); + + if (bt->accept (&visitor) != 0) + { + ACE_ERROR_RETURN ((LM_ERROR, + "(%N:%l) be_visitor_tmplinst_ss::" + "visit_attribute - " + "codegen for return type failed\n"), + -1); + } + + if (!node->readonly ()) + { + visitor.direction (AST_Argument::dir_IN); + + if (bt->accept (&visitor) != 0) + { + ACE_ERROR_RETURN ((LM_ERROR, + "(%N:%l) be_visitor_tmplinst_ss::" + "visit_attribute - " + "codegen for IN parameter failed\n"), + -1); + } + } + + this->this_mode_generated (node, I_TRUE); + return 0; +} + int be_visitor_tmplinst_ss::visit_enum (be_enum *node) { diff --git a/TAO/TAO_IDL/be/be_visitor_union/any_op_cs.cpp b/TAO/TAO_IDL/be/be_visitor_union/any_op_cs.cpp index fc97c9ea7c3..a46c29adf36 100644 --- a/TAO/TAO_IDL/be/be_visitor_union/any_op_cs.cpp +++ b/TAO/TAO_IDL/be/be_visitor_union/any_op_cs.cpp @@ -115,6 +115,35 @@ be_visitor_union_any_op_cs::visit_union (be_union *node) << ");" << be_uidt << be_uidt << be_uidt_nl << "}"; + // Since we don't generate CDR stream operators for types that + // explicitly contain a local interface (at some level), we + // must override these Any template class methods to avoid + // calling the non-existent operators. The zero return value + // will eventually cause CORBA::MARSHAL to be raised if this + // type is inserted into an Any and then marshaled. + if (node->is_local ()) + { + TAO_OutStream *os = this->ctx_->stream (); + + *os << be_nl << be_nl + << "ACE_TEMPLATE_SPECIALIZATION" << be_nl + << "CORBA::Boolean" << be_nl + << "TAO::Any_Dual_Impl_T<" << node->name () + << ">::marshal_value (TAO_OutputCDR &)" << be_nl + << "{" << be_idt_nl + << "return 0;" << be_uidt_nl + << "}"; + + *os << be_nl << be_nl + << "ACE_TEMPLATE_SPECIALIZATION" << be_nl + << "CORBA::Boolean" << be_nl + << "TAO::Any_Dual_Impl_T<" << node->name () + << ">::demarshal_value (TAO_InputCDR &)" << be_nl + << "{" << be_idt_nl + << "return 0;" << be_uidt_nl + << "}"; + } + // All we have to do is to visit the scope and generate code. if (this->visit_scope (node) == -1) { diff --git a/TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_cs.cpp b/TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_cs.cpp index 974ea63e59b..e6cc0c561e9 100644 --- a/TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_cs.cpp +++ b/TAO/TAO_IDL/be/be_visitor_valuetype/valuetype_cs.cpp @@ -105,7 +105,7 @@ be_visitor_valuetype_cs::visit_valuetype (be_valuetype *node) << node->name () << "::_tao_obv_repository_id (void) const" << be_nl << "{" << be_idt_nl << "return this->_tao_obv_static_repository_id ();" << be_uidt_nl - << "}" << be_nl; + << "}" << be_nl << be_nl; if (be_global->any_support ()) { diff --git a/TAO/TAO_IDL/be_include/be_visitor_tmplinst/tmplinst_cs.h b/TAO/TAO_IDL/be_include/be_visitor_tmplinst/tmplinst_cs.h index 46266b4a5cb..295e6bb032c 100644 --- a/TAO/TAO_IDL/be_include/be_visitor_tmplinst/tmplinst_cs.h +++ b/TAO/TAO_IDL/be_include/be_visitor_tmplinst/tmplinst_cs.h @@ -30,6 +30,8 @@ public: virtual int visit_array (be_array *node); + virtual int visit_attribute (be_attribute *node); + virtual int visit_enum (be_enum *node); virtual int visit_interface (be_interface *node); diff --git a/TAO/TAO_IDL/be_include/be_visitor_tmplinst/tmplinst_ss.h b/TAO/TAO_IDL/be_include/be_visitor_tmplinst/tmplinst_ss.h index 38764460355..c5e8aa00fb2 100644 --- a/TAO/TAO_IDL/be_include/be_visitor_tmplinst/tmplinst_ss.h +++ b/TAO/TAO_IDL/be_include/be_visitor_tmplinst/tmplinst_ss.h @@ -30,6 +30,8 @@ public: virtual int visit_array (be_array *node); + virtual int visit_attribute (be_attribute *node); + virtual int visit_enum (be_enum *node); virtual int visit_interface (be_interface *node); diff --git a/TAO/tao/Any.cpp b/TAO/tao/Any.cpp index 77bdf3e1b43..904116eed11 100644 --- a/TAO/tao/Any.cpp +++ b/TAO/tao/Any.cpp @@ -774,11 +774,26 @@ template class TAO::Any_Impl_T; template class TAO::Any_Impl_T; template class TAO::Arg_Traits; -/*template class TAO::Var_Size_Arg_Traits_T; -*/ - +template class TAO::In_Var_Size_Argument_T; +template class TAO::Inout_Var_Size_Argument_T; +template class TAO::Out_Var_Size_Argument_T; +template class TAO::Ret_Var_Size_Argument_T; + +template class TAO::SArg_Traits; +template class TAO::Var_Size_SArg_Traits_T; +template class TAO::In_Var_Size_SArgument_T; +template class TAO::Inout_Var_Size_SArgument_T; +template class TAO::Out_Var_Size_SArgument_T; +template class TAO::Ret_Var_Size_SArgument_T; #elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) #pragma instantiate TAO::Any_Special_Impl_T< @@ -799,12 +814,27 @@ template class TAO::Arg_Traits; #pragma instantiate TAO::Any_Impl_T #pragma instantiate TAO::Any_Impl_T #pragma instantiate TAO::Any_Impl_T -#pragma instantiate TAO::Any_Impl_T -#pragma instantiate TAO::Any_Impl_T #pragma instantiate TAO::Arg_Traits -#pragma instantiate TAO::Var_Size_Arg_Traits_T +#pragma instantiate TAO::Var_Size_Arg_Traits_T +#pragma instantiate TAO::In_Var_Size_Argument_T +#pragma instantiate TAO::Inout_Var_Size_Argument_T +#pragma instantiate TAO::Out_Var_Size_Argument_T +#pragma instantiate TAO::Ret_Var_Size_Argument_T + +#pragma instantiate TAO::SArg_Traits +#pragma instantiate TAO::Var_Size_SArg_Traits_T +#pragma instantiate TAO::In_Var_Size_SArgument_T +#pragma instantiate TAO::Inout_Var_Size_SArgument_T +#pragma instantiate TAO::Out_Var_Size_SArgument_T +#pragma instantiate TAO::Ret_Var_Size_SArgument_T #endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ diff --git a/TAO/tao/Object.cpp b/TAO/tao/Object.cpp index 4dc3f55b3d5..62158c09569 100644 --- a/TAO/tao/Object.cpp +++ b/TAO/tao/Object.cpp @@ -996,19 +996,69 @@ TAO::Object_Proxy_Broker * (*_TAO_Object_Proxy_Broker_Factory_function_pointer) template class TAO_Pseudo_Var_T; template class TAO_Pseudo_Out_T; + template class TAO::Arg_Traits; -template class TAO::Object_Arg_Traits_T >; +template class + TAO::Object_Arg_Traits_T >; +template class TAO::In_Object_Argument_T; +template class + TAO::Inout_Object_Argument_T >; +template class TAO::Out_Object_Argument_T; +template class TAO::Ret_Object_Argument_T; + +template class TAO::SArg_Traits; +template class TAO::Object_SArg_Traits_T; +template class TAO::In_Object_SArgument_T; +template class TAO::Inout_Object_SArgument_T; +template class TAO::Out_Object_SArgument_T; +template class TAO::Ret_Object_SArgument_T; #elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) #pragma instantiate TAO_Pseudo_Var_T #pragma instantiate TAO_Pseudo_Out_T + +#pragma instantiate TAO::Objref_Traits #pragma instantiate TAO::Arg_Traits -#pragma instantiate TAO::Object_Arg_Traits_T; +#pragma instantiate \ + TAO::Object_Arg_Traits_T > +#pragma instantiate TAO::In_Object_Argument_T +#pragma instantiate \ + TAO::Inout_Object_Argument_T > +#pragma instantiate TAO::Out_Object_Argument_T +#pragma instantiate TAO::Ret_Object_Argument_T + +#pragma instantiate TAO::SArg_Traits +#pragma instantiate TAO::Object_SArg_Traits_T +#pragma instantiate TAO::In_Object_SArgument_T +#pragma instantiate TAO::Inout_Object_SArgument_T +#pragma instantiate TAO::Out_Object_SArgument_T +#pragma instantiate TAO::Ret_Object_SArgument_T #endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ diff --git a/TAO/tao/PortableServer/Default_ORTC.cpp b/TAO/tao/PortableServer/Default_ORTC.cpp index 6225b1976ca..4f9deaae657 100644 --- a/TAO/tao/PortableServer/Default_ORTC.cpp +++ b/TAO/tao/PortableServer/Default_ORTC.cpp @@ -123,7 +123,7 @@ TAO_Default_ORT::ObjectReferenceTemplate::_downcast (CORBA::ValueBase *v) return 0; } - return (ObjectReferenceTemplate *) v->_tao_obv_narrow ((ptrdiff_t) &_downcast); + return dynamic_cast (v); } const char * @@ -132,40 +132,6 @@ TAO_Default_ORT::ObjectReferenceTemplate::_tao_obv_repository_id (void) const return this->_tao_obv_static_repository_id (); } -void * -#if defined (_MSC_VER) -TAO_Default_ORT::ObjectReferenceTemplate::TAO_Default_ORT_ObjectReferenceTemplate_tao_obv_narrow (ptrdiff_t type_id) -#else -TAO_Default_ORT::ObjectReferenceTemplate::_tao_obv_narrow (ptrdiff_t type_id) -#endif /* _MSC_VER */ -{ - if (type_id == (ptrdiff_t) &_downcast) - { - return this; - } - - void *rval = 0; - - if (rval == 0) - { -#if defined (_MSC_VER) - rval = this->PortableInterceptor_ObjectReferenceTemplate_tao_obv_narrow (type_id); -#else - rval = this->PortableInterceptor::ObjectReferenceTemplate::_tao_obv_narrow (type_id); -#endif /* _MSC_VER */ - } - - return rval; -} - -#if defined (_MSC_VER) -void * -TAO_Default_ORT::ObjectReferenceTemplate::_tao_obv_narrow (ptrdiff_t type_id) -{ - return this->TAO_Default_ORT_ObjectReferenceTemplate_tao_obv_narrow (type_id); -} -#endif /* _MSC_VER */ - void TAO_Default_ORT::ObjectReferenceTemplate::_tao_any_destructor (void *_tao_void_pointer) { diff --git a/TAO/tao/PortableServer/Default_ORTC.h b/TAO/tao/PortableServer/Default_ORTC.h index e1e134d5a0f..f90e1b000f6 100644 --- a/TAO/tao/PortableServer/Default_ORTC.h +++ b/TAO/tao/PortableServer/Default_ORTC.h @@ -134,10 +134,6 @@ namespace TAO_Default_ORT ObjectReferenceTemplate (void); virtual ~ObjectReferenceTemplate (void); - virtual void *_tao_obv_narrow (ptrdiff_t); -#if defined (_MSC_VER) - virtual void *TAO_Default_ORT_ObjectReferenceTemplate_tao_obv_narrow (ptrdiff_t); -#endif /* _MSC_VER */ virtual CORBA::Boolean _tao_marshal_v (TAO_OutputCDR &); virtual CORBA::Boolean _tao_unmarshal_v (TAO_InputCDR &); diff --git a/TAO/tao/PortableServer/PortableServerC.cpp b/TAO/tao/PortableServer/PortableServerC.cpp index 3c4e9ebd545..5e843e2f973 100644 --- a/TAO/tao/PortableServer/PortableServerC.cpp +++ b/TAO/tao/PortableServer/PortableServerC.cpp @@ -28,7 +28,6 @@ // TAO_IDL - Generated from // W:\ACE_wrappers\TAO\TAO_IDL\be\be_codegen.cpp:301 - #include "PortableServerC.h" #include "tao/Stub.h" #include "tao/Invocation_Adapter.h" @@ -2942,6 +2941,56 @@ static CORBA::TypeCode _tc_TAO_tc_PortableServer_POAManager_AdapterInactive ( ::CORBA::TypeCode_ptr PortableServer::POAManager::_tc_AdapterInactive = &_tc_TAO_tc_PortableServer_POAManager_AdapterInactive; +// TAO_IDL - Generated from +// W:\ACE_wrappers\TAO\TAO_IDL\be\be_visitor_typecode/typecode_defn.cpp:284 + +static const CORBA::Long _oc_PortableServer_POAManager_State[] = +{ + TAO_ENCAP_BYTE_ORDER, // byte order + 48, + ACE_NTOHL (0x49444c3a), + ACE_NTOHL (0x6f6d672e), + ACE_NTOHL (0x6f72672f), + ACE_NTOHL (0x506f7274), + ACE_NTOHL (0x61626c65), + ACE_NTOHL (0x53657276), + ACE_NTOHL (0x65722f50), + ACE_NTOHL (0x4f414d61), + ACE_NTOHL (0x6e616765), + ACE_NTOHL (0x722f5374), + ACE_NTOHL (0x6174653a), + ACE_NTOHL (0x322e3300), // repository ID = IDL:omg.org/PortableServer/POAManager/State:2.3 + 6, + ACE_NTOHL (0x53746174), + ACE_NTOHL (0x65000000), // name = State + 4, // member count + 8, + ACE_NTOHL (0x484f4c44), + ACE_NTOHL (0x494e4700), // name = HOLDING + 7, + ACE_NTOHL (0x41435449), + ACE_NTOHL (0x56450000), // name = ACTIVE + 11, + ACE_NTOHL (0x44495343), + ACE_NTOHL (0x41524449), + ACE_NTOHL (0x4e470000), // name = DISCARDING + 9, + ACE_NTOHL (0x494e4143), + ACE_NTOHL (0x54495645), + ACE_NTOHL (0x0), // name = INACTIVE + }; + +static CORBA::TypeCode _tc_TAO_tc_PortableServer_POAManager_State ( + CORBA::tk_enum, + sizeof (_oc_PortableServer_POAManager_State), + (char *) &_oc_PortableServer_POAManager_State, + 0, + sizeof (PortableServer::POAManager::State) + ); + +::CORBA::TypeCode_ptr PortableServer::POAManager::_tc_State = + &_tc_TAO_tc_PortableServer_POAManager_State; + PortableServer::POAManager::POAManager (void) {} @@ -6618,6 +6667,120 @@ operator>>= ( #if (TAO_HAS_MINIMUM_POA == 0) +// TAO_IDL - Generated from +// W:\ACE_wrappers\TAO\TAO_IDL\be\be_visitor_exception/any_op_cs.cpp:50 + +// Copying insertion. +void operator<<= ( + CORBA::Any &_tao_any, + const PortableServer::POAManager::AdapterInactive &_tao_elem + ) +{ + TAO::Any_Dual_Impl_T::insert_copy ( + _tao_any, + PortableServer::POAManager::AdapterInactive::_tao_any_destructor, + PortableServer::POAManager::_tc_AdapterInactive, + _tao_elem + ); +} + +// Non-copying insertion. +void operator<<= ( + CORBA::Any &_tao_any, + PortableServer::POAManager::AdapterInactive *_tao_elem + ) +{ + TAO::Any_Dual_Impl_T::insert ( + _tao_any, + PortableServer::POAManager::AdapterInactive::_tao_any_destructor, + PortableServer::POAManager::_tc_AdapterInactive, + _tao_elem + ); +} + +// Extraction to non-const pointer (deprecated). +CORBA::Boolean operator>>= ( + const CORBA::Any &_tao_any, + PortableServer::POAManager::AdapterInactive *&_tao_elem + ) +{ + return _tao_any >>= ACE_const_cast ( + const PortableServer::POAManager::AdapterInactive *&, + _tao_elem + ); +} + +// Extraction to const pointer. +CORBA::Boolean operator>>= ( + const CORBA::Any &_tao_any, + const PortableServer::POAManager::AdapterInactive *&_tao_elem + ) +{ + return + TAO::Any_Dual_Impl_T::extract ( + _tao_any, + PortableServer::POAManager::AdapterInactive::_tao_any_destructor, + PortableServer::POAManager::_tc_AdapterInactive, + _tao_elem + ); +} + +ACE_TEMPLATE_SPECIALIZATION +CORBA::Boolean +TAO::Any_Dual_Impl_T::marshal_value (TAO_OutputCDR &) +{ + return 0; +} + +ACE_TEMPLATE_SPECIALIZATION +CORBA::Boolean +TAO::Any_Dual_Impl_T::demarshal_value (TAO_InputCDR &) +{ + return 0; +} + +// TAO_IDL - Generated from +// W:\ACE_wrappers\TAO\TAO_IDL\be\be_visitor_enum/any_op_cs.cpp:52 + +void operator<<= ( + CORBA::Any &_tao_any, + PortableServer::POAManager::State _tao_elem + ) +{ + TAO::Any_Basic_Impl_T::insert ( + _tao_any, + PortableServer::POAManager::_tc_State, + _tao_elem + ); +} + +CORBA::Boolean operator>>= ( + const CORBA::Any &_tao_any, + PortableServer::POAManager::State &_tao_elem + ) +{ + return + TAO::Any_Basic_Impl_T::extract ( + _tao_any, + PortableServer::POAManager::_tc_State, + _tao_elem + ); +} + +ACE_TEMPLATE_SPECIALIZATION +CORBA::Boolean +TAO::Any_Basic_Impl_T::marshal_value (TAO_OutputCDR &) +{ + return 0; +} + +ACE_TEMPLATE_SPECIALIZATION +CORBA::Boolean +TAO::Any_Basic_Impl_T::demarshal_value (TAO_InputCDR &) +{ + return 0; +} + // TAO_IDL - Generated from // W:\ACE_wrappers\TAO\TAO_IDL\be\be_visitor_interface/any_op_cs.cpp:50 ACE_TEMPLATE_SPECIALIZATION diff --git a/TAO/tao/Typecode.cpp b/TAO/tao/Typecode.cpp index fe7c5362d03..5c02dc74dc2 100644 --- a/TAO/tao/Typecode.cpp +++ b/TAO/tao/Typecode.cpp @@ -3789,9 +3789,8 @@ operator>> (TAO_InputCDR &strm, CORBA::TCKind &_tao_enumval) #if defined (ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION) -/*template class TAO_Pseudo_Object_Manager; -*/ template class ACE_Hash_Map_Entry *>; @@ -3822,11 +3821,35 @@ template class TAO_Pseudo_Var_T; template class TAO_Pseudo_Out_T; template class TAO::Objref_Traits; + template class TAO::Arg_Traits; -/*template class TAO::Object_Arg_Traits_T; -*/ +template class + TAO::Object_Arg_Traits_T >; +template class TAO::In_Object_Argument_T; +template class + TAO::Inout_Object_Argument_T >; +template class TAO::Out_Object_Argument_T; +template class TAO::Ret_Object_Argument_T; + +template class TAO::SArg_Traits; +template class TAO::Object_SArg_Traits_T; +template class TAO::In_Object_SArgument_T; +template class TAO::Inout_Object_SArgument_T; +template class TAO::Out_Object_SArgument_T; +template class TAO::Ret_Object_SArgument_T; #elif defined (ACE_HAS_TEMPLATE_INSTANTIATION_PRAGMA) @@ -3865,8 +3888,32 @@ template class TAO::Arg_Traits; #pragma instantiate TAO::Objref_Traits #pragma instantiate TAO::Arg_Traits -#pragma instantiate TAO::Object_Arg_Traits_T +#pragma instantiate \ + TAO::Object_Arg_Traits_T > +#pragma instantiate TAO::In_Object_Argument_T +#pragma instantiate \ + TAO::Inout_Object_Argument_T > +#pragma instantiate TAO::Out_Object_Argument_T +#pragma instantiate TAO::Ret_Object_Argument_T + +#pragma instantiate TAO::SArg_Traits +#pragma instantiate TAO::Object_SArg_Traits_T +#pragma instantiate TAO::In_Object_SArgument_T +#pragma instantiate TAO::Inout_Object_SArgument_T +#pragma instantiate TAO::Out_Object_SArgument_T +#pragma instantiate TAO::Ret_Object_SArgument_T #endif /* ACE_HAS_EXPLICIT_TEMPLATE_INSTANTIATION */ -- cgit v1.2.1