diff options
Diffstat (limited to 'TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_cs.cpp')
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_cs.cpp | 90 |
1 files changed, 57 insertions, 33 deletions
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_cs.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_cs.cpp index dc8289ec615..26e399ce6a2 100644 --- a/TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_cs.cpp +++ b/TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_cs.cpp @@ -19,7 +19,7 @@ // Modifications by Aniruddha Gokhale // ============================================================================ -#include "be.h" +#include "be.h" #include "be_visitor_sequence.h" @@ -57,7 +57,7 @@ be_visitor_sequence_cs::gen_unbounded_obj_sequence (be_sequence *node) pt = bt; } - const char *name = + const char *name = be_decl::narrow_from_decl (pt)->full_name (); idl_bool bt_is_defined; @@ -79,25 +79,27 @@ be_visitor_sequence_cs::gen_unbounded_obj_sequence (be_sequence *node) bt_is_defined = ibt->is_defined (); } + int is_valuetype = be_interface::narrow_from_decl (pt)->is_valuetype (); + const char * class_name = node->instance_name (); static char full_class_name [NAMEBUFSIZE]; - ACE_OS::memset (full_class_name, - '\0', + ACE_OS::memset (full_class_name, + '\0', NAMEBUFSIZE); if (node->is_nested ()) { be_scope *parent = be_scope::narrow_from_scope (node->defined_in ()); - ACE_OS::sprintf (full_class_name, + ACE_OS::sprintf (full_class_name, "%s::%s", parent->decl ()->full_name (), class_name); } else { - ACE_OS::sprintf (full_class_name, + ACE_OS::sprintf (full_class_name, "%s", class_name); } @@ -115,10 +117,10 @@ be_visitor_sequence_cs::gen_unbounded_obj_sequence (be_sequence *node) os->indent (); // allocate_buffer. - *os << "// The Base_Sequence functions, please see tao/Sequence.h" + *os << "// The Base_Sequence functions, please see tao/Sequence.h" << be_nl << "void" << be_nl - << full_class_name << "::_allocate_buffer (CORBA::ULong length)" + << full_class_name << "::_allocate_buffer (CORBA::ULong length)" << be_nl << "{" << be_idt_nl; @@ -140,30 +142,39 @@ be_visitor_sequence_cs::gen_unbounded_obj_sequence (be_sequence *node) << "for (CORBA::ULong i = 0; i < this->length_; ++i)" << be_idt_nl << "{" << be_idt_nl << "if (!this->release_)" << be_idt_nl - << "{" << be_idt_nl - << "tmp[i] = "; + << "{" << be_idt_nl; - if (bt_is_defined) + if (is_valuetype) { - bt->accept (visitor); - - *os << "::_duplicate (old[i]);"; + *os << "if (old[i] != 0)" << be_idt_nl + << "old[i]->_add_ref ();" << be_uidt_nl + << "tmp[i] = old[i];"; } else { - *os << "tao_" << pt->flat_name () << "_duplicate (old[i]);"; + *os << "tmp[i] = "; + if (bt_is_defined) + { + bt->accept (visitor); + + *os << "::_duplicate (old[i]);"; + } + else + { + *os << "tao_" << pt->flat_name () << "_duplicate (old[i]);"; + } } *os << be_uidt_nl << "}" << be_uidt_nl << "else" << be_idt_nl << "{" << be_idt_nl - << "tmp[i] = old[i];" << be_uidt_nl + << "tmp[i] = old[i];" << be_uidt_nl << "}" << be_uidt << be_uidt_nl << "}" << be_uidt_nl << be_nl << "if (this->release_)" << be_idt_nl << "{" << be_idt_nl - << "delete[] old;" << be_uidt_nl + << "delete[] old;" << be_uidt_nl << "}" << be_uidt << be_uidt_nl << "}" << be_nl << "this->buffer_ = tmp;" << be_uidt_nl @@ -187,7 +198,13 @@ be_visitor_sequence_cs::gen_unbounded_obj_sequence (be_sequence *node) << "for (CORBA::ULong i = 0; i < this->length_; ++i)" << be_idt_nl << "{" << be_idt_nl; - if (bt_is_defined) + if (is_valuetype) + { + *os << "if (tmp[i] != 0)" << be_idt_nl + << "tmp[i]->_remove_ref ();" << be_uidt_nl + << "tmp[i] = 0;"; + } + else if (bt_is_defined) { *os << "CORBA::release (tmp[i]);" << be_nl << "tmp[i] = "; @@ -219,7 +236,7 @@ be_visitor_sequence_cs::gen_unbounded_obj_sequence (be_sequence *node) // shrink_buffer. *os << "void" << be_nl - << full_class_name + << full_class_name << "::_shrink_buffer (CORBA::ULong nl, CORBA::ULong ol)" << be_nl << "{" << be_idt_nl; @@ -233,7 +250,13 @@ be_visitor_sequence_cs::gen_unbounded_obj_sequence (be_sequence *node) << "for (CORBA::ULong i = nl; i < ol; ++i)" << be_idt_nl << "{" << be_idt_nl; - if (bt_is_defined) + if (is_valuetype) + { + *os << "if (tmp[i] != 0)" << be_idt_nl + << "tmp[i]->_remove_ref ();" << be_uidt_nl + << "tmp[i] = 0;"; + } + else if (bt_is_defined) { *os << "CORBA::release (tmp[i]);" << be_nl << "tmp[i] = "; @@ -256,19 +279,20 @@ be_visitor_sequence_cs::gen_unbounded_obj_sequence (be_sequence *node) be_predefined_type *prim = be_predefined_type::narrow_from_decl (pt); - if ((pt->node_type () != AST_Decl::NT_pre_defined) || + if (! is_valuetype + && (pt->node_type () != AST_Decl::NT_pre_defined) || (prim && (prim->pt () == AST_PredefinedType::PT_pseudo) && (!ACE_OS::strcmp (prim->local_name ()->get_string (), "Object")))) { // Pseudo objects do not require these methods. *os << "void " << be_nl << full_class_name << "::_downcast (" << be_idt << be_idt_nl - << "void* target," << be_nl - << "CORBA_Object *src," << be_nl - << "CORBA_Environment &ACE_TRY_ENV" - << be_uidt_nl - << ")" << be_uidt_nl - << "{" << be_idt_nl; + << "void* target," << be_nl + << "CORBA_Object *src," << be_nl + << "CORBA_Environment &ACE_TRY_ENV" + << be_uidt_nl + << ")" << be_uidt_nl + << "{" << be_idt_nl; bt->accept (visitor); @@ -277,7 +301,7 @@ be_visitor_sequence_cs::gen_unbounded_obj_sequence (be_sequence *node) bt->accept (visitor); *os << "**, target);" << be_nl - << "*tmp = "; + << "*tmp = "; if (bt_is_defined) { @@ -287,17 +311,17 @@ be_visitor_sequence_cs::gen_unbounded_obj_sequence (be_sequence *node) } else { - *os << "tao_" << pt->flat_name () + *os << "tao_" << pt->flat_name () << "_narrow (src, ACE_TRY_ENV);"; } *os << be_nl << "ACE_CHECK;" << be_uidt_nl - << "}\n" << be_nl; + << "}\n" << be_nl; *os << "CORBA_Object*" << be_nl << full_class_name << "::_upcast (void *src) const" << be_nl - << "{" << be_idt_nl; + << "{" << be_idt_nl; if (bt_is_defined) { @@ -312,11 +336,11 @@ be_visitor_sequence_cs::gen_unbounded_obj_sequence (be_sequence *node) } else { - *os << "return tao_" << pt->flat_name () << "_upcast (src);"; + *os << "return tao_" << pt->flat_name () << "_upcast (src);"; } *os << be_uidt_nl - << "}" << be_nl; + << "}" << be_nl; } os->gen_endif (); |