diff options
author | parsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2003-04-14 19:37:04 +0000 |
---|---|---|
committer | parsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2003-04-14 19:37:04 +0000 |
commit | 0b417dfa8184617128cd473cf27a508ff89f7ca9 (patch) | |
tree | 4d9c63d079e5416192e4ab6a7d7ec2784ddc9b29 | |
parent | ca1ccdb4a68244db43d249b9b66fa5eaadc714e2 (diff) | |
download | ATCD-0b417dfa8184617128cd473cf27a508ff89f7ca9.tar.gz |
ChangeLogTag: Mon Apr 14 14:33:48 2003 Jeff Parsons <j.parsons@vanderbilt.edu>
-rw-r--r-- | TAO/ChangeLog_ref | 16 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_sequence.cpp | 71 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_sequence/cdr_op_ch.cpp | 14 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_sequence/cdr_op_ci.cpp | 12 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_sequence/cdr_op_cs.cpp | 21 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_sequence/sequence_ch.cpp | 18 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_sequence/sequence_cs.cpp | 48 | ||||
-rw-r--r-- | TAO/tests/IDL_Test/sequence.idl | 12 |
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 |