summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_ci.cpp
diff options
context:
space:
mode:
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.cpp110
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