summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/be/be_sequence.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/TAO_IDL/be/be_sequence.cpp')
-rw-r--r--TAO/TAO_IDL/be/be_sequence.cpp248
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)
{