diff options
Diffstat (limited to 'TAO/TAO_IDL/be/be_sequence.cpp')
-rw-r--r-- | TAO/TAO_IDL/be/be_sequence.cpp | 248 |
1 files changed, 229 insertions, 19 deletions
diff --git a/TAO/TAO_IDL/be/be_sequence.cpp b/TAO/TAO_IDL/be/be_sequence.cpp index 758d442bd1f..15d58887b74 100644 --- a/TAO/TAO_IDL/be/be_sequence.cpp +++ b/TAO/TAO_IDL/be/be_sequence.cpp @@ -24,9 +24,12 @@ #include "be_interface.h" #include "be_interface_fwd.h" #include "be_predefined_type.h" +#include "be_field.h" #include "be_visitor.h" +#include "be_helper.h" #include "utl_identifier.h" #include "idl_defines.h" +#include "nr_extern.h" #include "ace/Log_Msg.h" ACE_RCSID (be, @@ -35,7 +38,8 @@ ACE_RCSID (be, be_sequence::be_sequence (void) - : mt_ (be_sequence::MNG_UNKNOWN) + : mt_ (be_sequence::MNG_UNKNOWN), + field_node_ (0) { // Always the case. this->has_constructor (I_TRUE); @@ -66,7 +70,8 @@ be_sequence::be_sequence (AST_Expression *v, I_TRUE), COMMON_Base (t->is_local () || local, abstract), - mt_ (be_sequence::MNG_UNKNOWN) + mt_ (be_sequence::MNG_UNKNOWN), + field_node_ (0) { // Always the case. this->has_constructor (I_TRUE); @@ -77,7 +82,7 @@ char * be_sequence::gen_name (void) { char namebuf [NAMEBUFSIZE]; - be_type *bt = 0; // Base type. + be_type *bt = 0; // Reset the buffer. ACE_OS::memset (namebuf, @@ -96,6 +101,10 @@ be_sequence::gen_name (void) 0); } + // If this is non-zero, add its local name to the generated name, + // for uniqueness. + be_field *fn = this->field_node_; + if (bt->node_type () == AST_Decl::NT_sequence) { // Our base type is an anonymous sequence. @@ -110,8 +119,7 @@ be_sequence::gen_name (void) 0); } - // Some platforms define IDL sequences as template classes - // and some do not. If the nested sequence were defined in + // If the nested sequence were defined in // the scope of the enclosing sequence, we would have to // not only define the nested class in two places, but also // deal with the fact that, for the template classes, the @@ -122,15 +130,18 @@ be_sequence::gen_name (void) UTL_Scope *parent = this->defined_in (); seq->set_defined_in (parent); parent->add_sequence (seq); + ACE_OS::sprintf (namebuf, - "_tao_seq_%s", - seq->gen_name ()); + "_tao_seq_%s_%s", + seq->gen_name (), + fn ? fn->local_name ()->get_string () : ""); } else { ACE_OS::sprintf (namebuf, - "_tao_seq_%s", - bt->local_name ()->get_string ()); + "_tao_seq_%s_%s", + bt->local_name ()->get_string (), + fn ? fn->local_name ()->get_string () : ""); } // Append the size (if any). @@ -263,17 +274,20 @@ be_sequence::managed_type (void) be_predefined_type::narrow_from_decl (prim_type); AST_PredefinedType::PredefinedType pt = bpd->pt (); - if (pt == AST_PredefinedType::PT_pseudo) + switch (pt) { - this->mt_ = be_sequence::MNG_PSEUDO; - } - else if (pt == AST_PredefinedType::PT_object) - { - this->mt_ = be_sequence::MNG_OBJREF; - } - else - { - this->mt_ = be_sequence::MNG_NONE; + case AST_PredefinedType::PT_pseudo: + this->mt_ = be_sequence::MNG_PSEUDO; + break; + case AST_PredefinedType::PT_object: + this->mt_ = be_sequence::MNG_PSEUDO; + break; + case AST_PredefinedType::PT_value: + this->mt_ = be_sequence::MNG_VALUE; + break; + default: + this->mt_ = be_sequence::MNG_NONE; + break; } } break; @@ -460,6 +474,202 @@ be_sequence::instance_name () return namebuf; } +int +be_sequence::gen_base_class_name (TAO_OutStream *os, + AST_Decl *elem_scope) +{ + be_type *elem = be_type::narrow_from_decl (this->base_type ()); + + // Generate the appropriate base class type. + switch (this->managed_type ()) + { + case be_sequence::MNG_OBJREF: + if (this->unbounded ()) + { + *os << "TAO_Unbounded_Object_Sequence<" << be_idt << be_idt_nl + << elem->nested_type_name (elem_scope) << "," << be_nl; + *os << elem->nested_type_name (elem_scope, "_var") << "," << be_nl + << this->smart_fwd_helper_name (elem_scope, elem) + << "_life," << be_nl + << this->smart_fwd_helper_name (elem_scope, elem) + << "_cast" << be_uidt_nl + << ">" << be_uidt; + } + else + { + *os << "TAO_Bounded_Object_Sequence<" << be_idt << be_idt_nl + << elem->nested_type_name (elem_scope) << "," << be_nl; + *os << elem->nested_type_name (elem_scope, "_var") << "," << be_nl + << this->smart_fwd_helper_name (elem_scope, elem) + << "_life," << be_nl + << this->smart_fwd_helper_name (elem_scope, elem) + << "_cast," << be_nl + << this->max_size ()->ev ()->u.ulval << be_uidt_nl + << ">" << be_uidt; + } + + break; + case be_sequence::MNG_ABSTRACT: + if (this->unbounded ()) + { + *os << "TAO_Unbounded_Abstract_Sequence<" << be_idt << be_idt_nl + << elem->nested_type_name (elem_scope) << "," << be_nl; + *os << elem->nested_type_name (elem_scope, "_var") << "," << be_nl + << this->smart_fwd_helper_name (elem_scope, elem) + << "_life" << be_uidt_nl + << ">" << be_uidt; + } + else + { + *os << "TAO_Bounded_Abstract_Sequence<" << be_idt << be_idt_nl + << elem->nested_type_name (elem_scope) << "," << be_nl; + *os << elem->nested_type_name (elem_scope, "_var") << "," << be_nl + << this->smart_fwd_helper_name (elem_scope, elem) + << "_life," << be_nl + << this->max_size ()->ev ()->u.ulval << be_uidt_nl + << ">" << be_uidt; + } + + break; + case be_sequence::MNG_PSEUDO: + if (this->unbounded ()) + { + *os << "TAO_Unbounded_Pseudo_Sequence<" << be_idt << be_idt_nl + << elem->nested_type_name (elem_scope) << "," << be_nl + << elem->name () << "_var" << be_uidt_nl + << ">" << be_uidt; + } + else + { + *os << "TAO_Bounded_Pseudo_Sequence<" << be_idt << be_idt_nl + << elem->nested_type_name (elem_scope) << "," << be_nl + << elem->name () << "_var," << be_nl + << this->max_size ()->ev ()->u.ulval << be_uidt_nl + << ">" << be_uidt; + } + + break; + case be_sequence::MNG_VALUE: + if (this->unbounded ()) + { + *os << "TAO_Unbounded_Valuetype_Sequence<" << be_idt << be_idt_nl + << elem->nested_type_name (elem_scope) << "," << be_nl; + *os << elem->nested_type_name (elem_scope, "_var") << "," << be_nl + << this->smart_fwd_helper_name (elem_scope, elem) + << "_life" << be_uidt_nl + << ">" << be_uidt; + } + else + { + *os << "TAO_Bounded_Valuetype_Sequence<" << be_idt << be_idt_nl + << elem->nested_type_name (elem_scope) << "," << be_nl; + *os << elem->nested_type_name (elem_scope, "_var") << "," << be_nl + << this->smart_fwd_helper_name (elem_scope, elem) + << "_life," << be_nl + << this->max_size ()->ev ()->u.ulval << be_uidt_nl + << ">" << be_uidt; + } + + break; + case be_sequence::MNG_STRING: + if (this->unbounded ()) + { + *os << "TAO_Unbounded_String_Sequence"; + } + else + { + *os << "TAO_Bounded_String_Sequence<" + << this->max_size ()->ev ()->u.ulval << ">"; + } + + break; + case be_sequence::MNG_WSTRING: + if (this->unbounded ()) + { + *os << "TAO_Unbounded_WString_Sequence"; + } + else + { + *os << "TAO_Bounded_WString_Sequence<" + << this->max_size ()->ev ()->u.ulval << ">"; + } + + break; + default: // Not a managed type. + switch (elem->base_node_type ()) + { + case AST_Decl::NT_array: + if (this->unbounded ()) + { + *os << "TAO_Unbounded_Array_Sequence<" + << be_idt << be_idt_nl + << elem->nested_type_name (elem_scope) << "," << be_nl + << this->smart_fwd_helper_name (elem_scope, elem) + << "_life" << be_uidt_nl + << ">" << be_uidt; + } + else + { + *os << "TAO_Bounded_Array_Sequence<" + << be_idt << be_idt_nl + << elem->nested_type_name (elem_scope) << "," << be_nl + << this->smart_fwd_helper_name (elem_scope, elem) + << "_life," << be_nl + << this->max_size ()->ev ()->u.ulval << be_uidt_nl + << ">" << be_uidt; + } + + break; + default: + if (this->unbounded ()) + { + *os << "TAO_Unbounded_Sequence<" << be_idt << be_idt_nl + << elem->nested_type_name (elem_scope) << be_uidt_nl + << ">" << be_uidt; + } + else + { + *os << "TAO_Bounded_Sequence<" << be_idt << be_idt_nl + << elem->nested_type_name (elem_scope) << "," << be_nl + << this->max_size ()->ev ()->u.ulval << be_uidt_nl + << ">" << be_uidt; + } + + break; + } + + break; + } + + return 0; +} + +be_field * +be_sequence::field_node (void) const +{ + return this->field_node_; +} + +void +be_sequence::field_node (be_field *node) +{ + this->field_node_ = node; +} + +const char * +be_sequence::smart_fwd_helper_name (AST_Decl *elem_scope, + be_type *elem) +{ + if (ScopeAsDecl (this->defined_in ()) == elem_scope) + { + ACE_CString retval = "tao_"; + retval += elem->local_name ()->get_string (); + return retval.rep (); + } + + return elem->fwd_helper_name (); +} + void be_sequence::destroy (void) { |