summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/be/be_visitor_sequence/gen_unbounded_obj_sequence_cs.cpp
diff options
context:
space:
mode:
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.cpp90
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 ();