diff options
Diffstat (limited to 'TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_ci.cpp')
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_ci.cpp | 110 |
1 files changed, 76 insertions, 34 deletions
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_ci.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_ci.cpp index 6d0af4f55a4..9013e9e80c2 100644 --- a/TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_ci.cpp +++ b/TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_ci.cpp @@ -19,7 +19,7 @@ // Modifications by Aniruddha Gokhale // ============================================================================ -#include "be.h" +#include "be.h" #include "be_visitor_sequence.h" @@ -40,7 +40,7 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node) ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_visitor_sequence_ci::" "visit_sequence - " - "Bad element type\n"), + "Bad element type\n"), -1); } @@ -58,7 +58,7 @@ be_visitor_sequence_ci::gen_bounded_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; @@ -83,22 +83,22 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node) 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); } @@ -146,12 +146,18 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node) *os << "*[" << node->max_size () << "], 0);" << be_nl << be_nl - << "for (CORBA::ULong i = 0; i < " << node->max_size () + << "for (CORBA::ULong i = 0; i < " << node->max_size () << "; i++)" << be_idt_nl << "{" << be_idt_nl << "buf[i] = "; - if (bt_is_defined) + int is_valuetype = be_interface::narrow_from_decl (pt)->is_valuetype (); + + if (is_valuetype) + { + *os << "0;"; + } + else if (bt_is_defined) { bt->accept (visitor); @@ -175,12 +181,19 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node) *os << " **buffer)" << be_nl << "{" << be_idt_nl - << "for (CORBA::ULong i = 0; i < " << node->max_size () + << "for (CORBA::ULong i = 0; i < " << node->max_size () << "; ++i)" << be_idt_nl << "{" << be_idt_nl << "if (buffer[i] != "; - if (bt_is_defined) + if (is_valuetype) + { + *os << "0)" << be_idt_nl + << "{" << be_idt_nl + << "buffer[i]->_remove_ref ();" << be_nl + << "buffer[i] = 0;" << be_uidt_nl; + } + else if (bt_is_defined) { bt->accept (visitor); @@ -202,7 +215,7 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node) << "tao_" << pt->flat_name () << "_nil ();" << be_uidt_nl; } - *os << "}" << be_uidt << be_uidt_nl + *os << "}" << be_uidt << be_uidt_nl << "}" << be_uidt_nl << be_nl << "delete[] buffer;" << be_uidt_nl << "} " << be_nl @@ -228,7 +241,7 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node) *os <<"* *value," << be_nl << "CORBA::Boolean release)" << be_uidt_nl << "// Constructor from data." << be_nl - << " : TAO_Bounded_Base_Sequence (" << node->max_size () + << " : TAO_Bounded_Base_Sequence (" << node->max_size () << ", length, value, release)" << be_nl << "{" << be_nl << "}" << be_nl @@ -256,18 +269,27 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node) *os << "** ACE_CAST_CONST, rhs.buffer_);" << be_nl << "for (CORBA::ULong i = 0; i < rhs.length_; i++)" << be_idt_nl - << "{" << be_idt_nl - << "tmp1[i] = "; + << "{" << be_idt_nl; - if (bt_is_defined) + if (is_valuetype) { - bt->accept (visitor); - - *os << "::_duplicate (tmp2[i]);"; + *os << "if (tmp2[i] != 0)" << be_idt_nl + << "tmp2[i]->_add_ref ();" << be_uidt_nl + << "tmp1[i] = tmp2[i];"; } else { - *os << "tao_" << pt->flat_name () << "_duplicate (tmp2[i]);"; + *os << "tmp1[i] = "; + if (bt_is_defined) + { + bt->accept (visitor); + + *os << "::_duplicate (tmp2[i]);"; + } + else + { + *os << "tao_" << pt->flat_name () << "_duplicate (tmp2[i]);"; + } } *os << be_uidt_nl @@ -304,7 +326,13 @@ be_visitor_sequence_ci::gen_bounded_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] = "; @@ -324,7 +352,7 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node) << "}" << be_uidt << be_uidt_nl << "}" << be_nl << "else" << be_idt_nl - << "this->buffer_ = " << class_name + << "this->buffer_ = " << class_name << "::allocbuf (rhs.maximum_);" << be_uidt_nl << be_nl << "TAO_Bounded_Base_Sequence::operator= (rhs);" << be_nl @@ -346,18 +374,27 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node) *os << " ** ACE_CAST_CONST, rhs.buffer_);" << be_nl << "for (CORBA::ULong i=0; i < rhs.length_; ++i)" << be_idt_nl - << "{" << be_idt_nl - << "tmp1[i] = "; + << "{" << be_idt_nl; - if (bt_is_defined) + if (is_valuetype) { - bt->accept (visitor); - - *os << "::_duplicate (tmp2[i]);"; + *os << "if (tmp2[i] != 0)" << be_idt_nl + << "tmp2[i]->_add_ref ();" << be_uidt_nl + << "tmp1[i] = tmp2[i];"; } else { - *os << "tao_" << pt->flat_name () << "_duplicate (tmp2[i]);"; + *os << "tmp1[i] = "; + if (bt_is_defined) + { + bt->accept (visitor); + + *os << "::_duplicate (tmp2[i]);"; + } + else + { + *os << "tao_" << pt->flat_name () << "_duplicate (tmp2[i]);"; + } } *os << be_uidt_nl @@ -374,7 +411,6 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node) && prim && prim->pt () == AST_PredefinedType::PT_pseudo && ACE_OS::strcmp (prim->local_name ()->get_string (), "Object") != 0; - // operator[]. if (is_pseudo_object) { @@ -382,7 +418,10 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node) } else { - *os << "ACE_INLINE TAO_Object_Manager<"; + if (is_valuetype) + *os << "TAO_Valuetype_Manager<"; + else + *os << "ACE_INLINE TAO_Object_Manager<"; } *os << bt->name () << "," @@ -406,7 +445,10 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node) } else { - *os << "return TAO_Object_Manager<"; + if (is_valuetype) + *os << "return TAO_Valuetype_Manager<"; + else + *os << "return TAO_Object_Manager<"; } *os << bt->name () << "," @@ -421,7 +463,7 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node) bt->accept(visitor); *os << " **" << be_nl; - *os << full_class_name << "::get_buffer (CORBA::Boolean orphan)" + *os << full_class_name << "::get_buffer (CORBA::Boolean orphan)" << be_nl << "{" << be_idt_nl; @@ -433,7 +475,7 @@ be_visitor_sequence_ci::gen_bounded_obj_sequence (be_sequence *node) << "// We retain ownership." << be_nl << "if (this->buffer_ == 0)" << be_nl << "{" << be_idt_nl - << "result = " << class_name << "::allocbuf (this->maximum_);" + << "result = " << class_name << "::allocbuf (this->maximum_);" << be_nl << "this->buffer_ = result;" << be_nl << "this->release_ = 1;" << be_uidt_nl |