summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorparsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2003-04-14 14:09:42 +0000
committerparsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2003-04-14 14:09:42 +0000
commit55624494f50a923e4e6a94576a3f828ae1d91ded (patch)
treeab132b226178b92dfb314a652089645d764232a0
parent01366c9907544bad718259c9820f65d1b5473ded (diff)
downloadATCD-55624494f50a923e4e6a94576a3f828ae1d91ded.tar.gz
ChangeLogTag: Mon Apr 14 09:06:22 2003 Jeff Parsons <j.parsons@vanderbilt.edu>
-rw-r--r--TAO/ChangeLog_ref10
-rw-r--r--TAO/TAO_IDL/be/be_sequence.cpp36
-rw-r--r--TAO/TAO_IDL/be/be_visitor_field/field_ch.cpp6
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp1
-rw-r--r--TAO/TAO_IDL/be_include/be_sequence.h8
5 files changed, 53 insertions, 8 deletions
diff --git a/TAO/ChangeLog_ref b/TAO/ChangeLog_ref
index ebddf8c0e55..089abefe826 100644
--- a/TAO/ChangeLog_ref
+++ b/TAO/ChangeLog_ref
@@ -1,3 +1,13 @@
+Mon Apr 14 09:06:22 2003 Jeff Parsons <j.parsons@vanderbilt.edu>
+
+ * TAO_IDL/be/be_sequence.cpp:
+ * TAO_IDL/be/be_visitor_field/field_ch.cpp:
+ * TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp:
+ * TAO_IDL/be_include/be_sequence.h:
+
+ Fixed problem with multiple members of the same anonymous
+ sequence type.
+
Sat Apr 12 02:52:03 2003 Jeff Parsons <j.parsons@vanderbilt.edu>
* TAO_IDL/be/be_type.cpp:
diff --git a/TAO/TAO_IDL/be/be_sequence.cpp b/TAO/TAO_IDL/be/be_sequence.cpp
index 744049d7efb..6639f57e6ad 100644
--- a/TAO/TAO_IDL/be/be_sequence.cpp
+++ b/TAO/TAO_IDL/be/be_sequence.cpp
@@ -24,6 +24,7 @@
#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"
@@ -36,7 +37,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);
@@ -67,7 +69,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);
@@ -78,7 +81,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,
@@ -97,6 +100,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.
@@ -122,15 +129,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).
@@ -620,6 +630,18 @@ be_sequence::gen_base_class_name (TAO_OutStream *os,
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;
+}
+
void
be_sequence::destroy (void)
{
diff --git a/TAO/TAO_IDL/be/be_visitor_field/field_ch.cpp b/TAO/TAO_IDL/be/be_visitor_field/field_ch.cpp
index 0b214f6e2b3..1631fe636ee 100644
--- a/TAO/TAO_IDL/be/be_visitor_field/field_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_field/field_ch.cpp
@@ -420,6 +420,12 @@ be_visitor_field_ch::visit_sequence (be_sequence *node)
if (!this->ctx_->alias ()
&& node->is_child (this->ctx_->scope ()))
{
+ // Put the field node into the (anonymous) sequence node, to be
+ // used later for unique name generation.
+ be_field *member_node =
+ be_field::narrow_from_decl (this->ctx_->node ());
+ node->field_node (member_node);
+
be_visitor_context ctx (*this->ctx_);
ctx.node (node);
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 1e61cb91bbc..c3500930c36 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp
@@ -174,7 +174,6 @@ int be_visitor_sequence_cs::visit_sequence (be_sequence *node)
<< "}";
}
- // If Any operators are generated, that code will take care of this.
if (!bt->seen_in_sequence ())
{
// This is a no-op unless our element is a managed type.
diff --git a/TAO/TAO_IDL/be_include/be_sequence.h b/TAO/TAO_IDL/be_include/be_sequence.h
index 4e0d86898a7..74f89274fbd 100644
--- a/TAO/TAO_IDL/be_include/be_sequence.h
+++ b/TAO/TAO_IDL/be_include/be_sequence.h
@@ -30,6 +30,7 @@ class AST_Expression;
class AST_Type;
class be_visitor;
class be_typedef;
+class be_field;
// A sequence in OMG IDL does not define a scoping construct just as a struct
// or union or an interface do. However, in the C++ mapping, a sequence becomes
@@ -94,6 +95,10 @@ public:
// Common code for generating the name and parameters of our
// template sequence base class.
+ be_field *field_node (void) const;
+ void field_node (be_field *node);
+ // Accessors for the member.
+
protected:
virtual char *gen_name (void);
// Helper to create_name.
@@ -101,6 +106,9 @@ protected:
private:
MANAGED_TYPE mt_;
// Our managed type.
+
+ be_field *field_node_;
+ // Used if we are an anonymous member, to help generate a unique name.
};
#endif