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