summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorparsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2003-04-14 19:37:04 +0000
committerparsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2003-04-14 19:37:04 +0000
commit0b417dfa8184617128cd473cf27a508ff89f7ca9 (patch)
tree4d9c63d079e5416192e4ab6a7d7ec2784ddc9b29
parentca1ccdb4a68244db43d249b9b66fa5eaadc714e2 (diff)
downloadATCD-0b417dfa8184617128cd473cf27a508ff89f7ca9.tar.gz
ChangeLogTag: Mon Apr 14 14:33:48 2003 Jeff Parsons <j.parsons@vanderbilt.edu>
-rw-r--r--TAO/ChangeLog_ref16
-rw-r--r--TAO/TAO_IDL/be/be_sequence.cpp71
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/cdr_op_ch.cpp14
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/cdr_op_ci.cpp12
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/cdr_op_cs.cpp21
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp18
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp48
-rw-r--r--TAO/tests/IDL_Test/sequence.idl12
8 files changed, 133 insertions, 79 deletions
diff --git a/TAO/ChangeLog_ref b/TAO/ChangeLog_ref
index cea450c6fcb..bd0caab4b1b 100644
--- a/TAO/ChangeLog_ref
+++ b/TAO/ChangeLog_ref
@@ -1,3 +1,19 @@
+Mon Apr 14 14:33:48 2003 Jeff Parsons <j.parsons@vanderbilt.edu>
+
+ * TAO_IDL/be/be_sequence.cpp:
+ * TAO_IDL/be/be_visitor_sequence/cdr_op_ch.cpp:
+ * TAO_IDL/be/be_visitor_sequence/cdr_op_ci.cpp:
+ * TAO_IDL/be/be_visitor_sequence/cdr_op_cs.cpp:
+ * TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp:
+ * TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp:
+
+ Fixed code generation to work with deeply nested and/or
+ anonymous sequence members.
+
+ * tests/IDL_Test/sequence.idl:
+
+ Modified test to check above use cases more thoroughly.
+
Mon Apr 14 09:16:35 2003 Jeff Parsons <j.parsons@vanderbilt.edu>
* tao/PortableServer/PortableServerC.cpp:
diff --git a/TAO/TAO_IDL/be/be_sequence.cpp b/TAO/TAO_IDL/be/be_sequence.cpp
index 6639f57e6ad..0ac64e7f27e 100644
--- a/TAO/TAO_IDL/be/be_sequence.cpp
+++ b/TAO/TAO_IDL/be/be_sequence.cpp
@@ -587,41 +587,44 @@ be_sequence::gen_base_class_name (TAO_OutStream *os,
break;
default: // Not a managed type.
- if (elem->base_node_type () == AST_Decl::NT_array)
+ switch (elem->base_node_type ())
{
- if (this->unbounded ())
- {
- *os << "TAO_Unbounded_Array_Sequence<"
- << be_idt << be_idt_nl
- << elem->nested_type_name (elem_scope) << "," << be_nl
- << elem->fwd_helper_name () << "_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
- << elem->fwd_helper_name () << "_life," << be_nl
- << this->max_size ()->ev ()->u.ulval << be_uidt_nl
- << ">" << be_uidt;
- }
- }
- else
- {
- 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;
- }
+ 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
+ << elem->fwd_helper_name () << "_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
+ << elem->fwd_helper_name () << "_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;
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/cdr_op_ch.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/cdr_op_ch.cpp
index 0515a6fbc2d..6d3e7c3f5fa 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/cdr_op_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/cdr_op_ch.cpp
@@ -48,6 +48,20 @@ be_visitor_sequence_cdr_op_ch::visit_sequence (be_sequence *node)
return 0;
}
+ be_type *base_type = be_type::narrow_from_decl (node->base_type ());
+
+ // If our base type is an anonymous sequence, generate code for it here.
+ if (base_type->node_type () == AST_Decl::NT_sequence)
+ {
+ if (base_type->accept (this) != 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "be_visitor_sequence_cdr_op_ch::visit_sequence -"
+ "codegen for nested anonymous sequence failed\n"),
+ -1);
+ }
+ }
+
TAO_OutStream *os = this->ctx_->stream ();
be_type *bt = be_type::narrow_from_decl (node);
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/cdr_op_ci.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/cdr_op_ci.cpp
index 9a37a785340..8464d60bc03 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/cdr_op_ci.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/cdr_op_ci.cpp
@@ -55,15 +55,13 @@ be_visitor_sequence_cdr_op_ci::visit_sequence (be_sequence *node)
// generate code for the sequence here.
// Retrieve the base type.
- AST_Type *base = node->base_type ();
+ be_type *base = be_type::narrow_from_decl(node->base_type ());
AST_Decl::NodeType nt = base->node_type ();
+ // If our base type is an anonymous sequence, generate code for it here.
if (nt == AST_Decl::NT_sequence && base->anonymous ())
{
- be_sequence *bs = be_sequence::narrow_from_decl (base);
- be_visitor_sequence_cdr_op_ci visitor (this->ctx_);
-
- if (bs->accept (&visitor) == -1)
+ if (base->accept (this) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"be_visitor_sequence_cdr_op_ci::"
@@ -73,8 +71,8 @@ be_visitor_sequence_cdr_op_ci::visit_sequence (be_sequence *node)
}
}
- // Sequences are *always* generated in the .cpp file, it doesn't
- // save all that time to generate them inline and this breaks
+ // Sequence CDR operators are always generated in the .cpp file, it doesn't
+ // save all that much time to generate them inline and this breaks
// the dependencies for recursive types.
be_type *bt = be_type::narrow_from_decl (node);
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/cdr_op_cs.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/cdr_op_cs.cpp
index 33e5cecfe69..8481ffa1788 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/cdr_op_cs.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/cdr_op_cs.cpp
@@ -68,27 +68,6 @@ be_visitor_sequence_cdr_op_cs::visit_sequence (be_sequence *node)
-1);
}
- // If our base type is anonymous sequence,
- // generate code for the base type sequence here.
-
- if (bt->node_type () == AST_Decl::NT_sequence)
- {
- int status =
- this->gen_anonymous_base_type (
- bt,
- TAO_CodeGen::TAO_ROOT_CDR_OP_CS
- );
-
- if (status == -1)
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_visitor_array_cdr_op_cs::"
- "visit_sequence - "
- "gen_anonymous_base_type failed\n"),
- -1);
- }
- }
-
// Generate the CDR << and >> operator defns.
// Save the sequence node for further use.
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp
index acc79270638..2a647df034c 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp
@@ -71,9 +71,25 @@ int be_visitor_sequence_ch::visit_sequence (be_sequence *node)
-1);
}
+ // If our base type is an anonymouse sequence, we must create a name
+ // and generate a class declaration for it as well.
+ if (bt->node_type () == AST_Decl::NT_sequence)
+ {
+ if (bt->accept (this) != 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_visitor_sequence_ch::"
+ "visit_sequence - "
+ "codegen for anonymous base type failed\n"),
+ -1);
+ }
+ }
+
*os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
<< "// " << __FILE__ << ":" << __LINE__;
+ os->gen_ifdef_macro (node->flat_name ());
+
if (this->ctx_->tdef () != 0)
{
*os << be_nl << be_nl
@@ -198,6 +214,8 @@ int be_visitor_sequence_ch::visit_sequence (be_sequence *node)
*os << be_uidt_nl
<< "};";
+ os->gen_endif ();
+
node->cli_hdr_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 c3500930c36..2a7ecee3e69 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp
@@ -50,11 +50,27 @@ int be_visitor_sequence_cs::visit_sequence (be_sequence *node)
return 0;
}
+ // If our base type is an anonymous sequence, generate code for it here.
+ if (bt->node_type () == AST_Decl::NT_sequence)
+ {
+ if (bt->accept (this) != 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_visitor_sequence_cs::"
+ "visit_sequence - "
+ "codegen for anonymous base type failed\n"),
+ -1);
+ }
+
+ }
+
TAO_OutStream *os = this->ctx_->stream ();
*os << be_nl << be_nl << "// TAO_IDL - Generated from " << be_nl
<< "// "__FILE__ << ":" << __LINE__;
+ os->gen_ifdef_macro (node->flat_name ());
+
// default constructor
*os << be_nl << be_nl
<< node->name () << "::" << node->local_name () << " (void)" << be_nl
@@ -64,9 +80,11 @@ int be_visitor_sequence_cs::visit_sequence (be_sequence *node)
if (node->unbounded ())
{
*os << be_nl << be_nl
- << node->name () << "::" << node->local_name ()
- << " (CORBA::ULong max)" << be_nl
- << " : " << be_idt << be_idt;
+ << node->name () << "::" << node->local_name () << " ("
+ << be_idt << be_idt_nl
+ << "CORBA::ULong max" << be_uidt_nl
+ << ")" << be_nl
+ << ": " << be_idt;
// Pass it to the base constructor.
if (node->gen_base_class_name (os, idl_global->root ()) == -1)
@@ -74,7 +92,7 @@ int be_visitor_sequence_cs::visit_sequence (be_sequence *node)
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_sequence_cs::"
"visit_sequence - "
- "codegen for base sequence class\n"),
+ "codegen for base sequence class failed\n"),
-1);
}
@@ -109,7 +127,7 @@ int be_visitor_sequence_cs::visit_sequence (be_sequence *node)
-1);
}
- *os << "* buffer," << be_nl
+ *os << " * buffer," << be_nl
<< "CORBA::Boolean release" << be_uidt_nl
<< ")" << be_uidt_nl
<< " : " << be_idt << be_idt;
@@ -137,8 +155,10 @@ int be_visitor_sequence_cs::visit_sequence (be_sequence *node)
// Copy constructor.
*os << be_nl << be_nl
<< node->name () << "::" << node->local_name ()
- << " (const " << node->local_name ()
- << " &seq)" << be_nl
+ << " (" << be_idt << be_idt_nl
+ << "const " << node->local_name ()
+ << " &seq" << be_uidt_nl
+ << ")" << be_uidt_nl
<< " : " << be_idt << be_idt;
// Pass it to the base constructor.
@@ -165,11 +185,15 @@ int be_visitor_sequence_cs::visit_sequence (be_sequence *node)
{
*os << be_nl << be_nl
<< "void "
- << node->name () << "::_tao_any_destructor (void *_tao_void_pointer)"
- << be_nl
+ << node->name () << "::_tao_any_destructor (" << be_idt << be_idt_nl
+ << "void * _tao_void_pointer" << be_uidt_nl
+ << ")" << be_uidt_nl
<< "{" << be_idt_nl
- << node->local_name () << " *tmp = ACE_static_cast ("
- << node->local_name () << "*, _tao_void_pointer);" << be_nl
+ << node->local_name () << " * tmp =" << be_idt_nl
+ << "ACE_static_cast (" << be_idt << be_idt_nl
+ << node->local_name () << " *," << be_nl
+ << "_tao_void_pointer" << be_uidt_nl
+ << ");" << be_uidt << be_uidt_nl
<< "delete tmp;" << be_uidt_nl
<< "}";
}
@@ -187,6 +211,8 @@ int be_visitor_sequence_cs::visit_sequence (be_sequence *node)
bt);
}
+ os->gen_endif ();
+
node->cli_stub_gen (1);
return 0;
}
diff --git a/TAO/tests/IDL_Test/sequence.idl b/TAO/tests/IDL_Test/sequence.idl
index 8b848db3e03..64205f886cf 100644
--- a/TAO/tests/IDL_Test/sequence.idl
+++ b/TAO/tests/IDL_Test/sequence.idl
@@ -30,14 +30,14 @@ interface seqTest
void send_dozen (inout dozens bouquets);
};
-// CDR operator declarations and definitions
-// for the sequences were getting generated
-// twice. Now there's an #if !defined guard
-// around them.
+// Anonymous sequence members must be unique types even if the
+// sequence itself is not, so the member name has been
+// incorported into the sequence class name. #if !defined guards
+// are generated around code for the inner anonymous sequences.
struct twinStruct
{
- sequence<short> and_;
- sequence<short> or_;
+ sequence<sequence<short> > and_;
+ sequence<sequence<short> > or_;
};
// Nested sequences