diff options
Diffstat (limited to 'TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_ci.cpp')
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_ci.cpp | 102 |
1 files changed, 68 insertions, 34 deletions
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_ci.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_ci.cpp index aefb0f1509a..43e94ab2b82 100644 --- a/TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_ci.cpp +++ b/TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_ci.cpp @@ -19,7 +19,7 @@ // Modifications by Aniruddha Gokhale // ============================================================================ -#include "be.h" +#include "be.h" #include "be_visitor_sequence.h" @@ -39,7 +39,7 @@ be_visitor_sequence_ci::gen_unbounded_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); } @@ -57,7 +57,7 @@ be_visitor_sequence_ci::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; @@ -82,22 +82,22 @@ be_visitor_sequence_ci::gen_unbounded_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); } @@ -147,7 +147,13 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node) << "{" << 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); @@ -158,7 +164,7 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node) *os << "tao_" << pt->flat_name () << "_nil ();"; } - *os << be_uidt_nl + *os << be_uidt_nl << "}" << be_uidt_nl << be_nl << "return buf;" << be_uidt_nl << "}" << be_nl << be_nl; @@ -186,7 +192,7 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node) // Constructor. *os << "ACE_INLINE" << be_nl - << full_class_name << "::" << class_name + << full_class_name << "::" << class_name << " (CORBA::ULong maximum)" << be_idt_nl << ": TAO_Unbounded_Base_Sequence (maximum, " << class_name << "::allocbuf (maximum))" << be_uidt_nl @@ -196,7 +202,7 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node) // Constructor. *os << "ACE_INLINE" << be_nl - << full_class_name << "::" << class_name + << full_class_name << "::" << class_name << " (CORBA::ULong maximum," << be_idt_nl << "CORBA::ULong length," << be_nl; @@ -221,7 +227,7 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node) bt->accept(visitor); - *os <<" **tmp1 = " << class_name << "::allocbuf (this->maximum_);" + *os <<" **tmp1 = " << class_name << "::allocbuf (this->maximum_);" << be_nl; bt->accept (visitor); @@ -233,18 +239,27 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node) *os << " ** ACE_CAST_CONST, rhs.buffer_);" << be_nl << 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 @@ -260,7 +275,7 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node) // Operator =. *os << "ACE_INLINE " << full_class_name << " &" << be_nl - << full_class_name << "::operator= (const " + << full_class_name << "::operator= (const " << class_name << " &rhs)" << be_nl << "{" << be_idt_nl << "if (this == &rhs)" << be_idt_nl @@ -280,7 +295,13 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node) << "for (CORBA::ULong i = 0; i < this->length_; ++i)" << be_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] = "; @@ -329,20 +350,28 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node) *os << " ** ACE_CAST_CONST, rhs.buffer_);" << be_nl << 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 << "}" << be_uidt_nl << be_nl << "return *this;" << be_uidt_nl @@ -356,19 +385,21 @@ be_visitor_sequence_ci::gen_unbounded_obj_sequence (be_sequence *node) && prim && prim->pt () == AST_PredefinedType::PT_pseudo && ACE_OS::strcmp (prim->local_name ()->get_string (), "Object") != 0; - if (is_pseudo_object) { *os << "ACE_INLINE TAO_Pseudo_Object_Manager<"; } else { - *os << "ACE_INLINE TAO_Object_Manager<"; + if (is_valuetype) + *os << "ACE_INLINE TAO_Valuetype_Manager<"; + else + *os << "ACE_INLINE TAO_Object_Manager<"; } *os << bt->name () << "," << bt->name () << "_var>" << be_nl - << full_class_name << "::operator[] (CORBA::ULong index) const" + << full_class_name << "::operator[] (CORBA::ULong index) const" << be_nl << "// read-write accessor" << be_nl << "{" << be_idt_nl @@ -388,7 +419,10 @@ be_visitor_sequence_ci::gen_unbounded_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 () << "," @@ -414,7 +448,7 @@ be_visitor_sequence_ci::gen_unbounded_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 |