summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_cs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_cs.cpp')
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_cs.cpp57
1 files changed, 33 insertions, 24 deletions
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_cs.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_cs.cpp
index 22459a78dae..782985e5741 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_cs.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/gen_bounded_obj_sequence_cs.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_cs::gen_bounded_obj_sequence (be_sequence *node)
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_sequence_cs::"
"visit_sequence - "
- "Bad element type\n"),
+ "Bad element type\n"),
-1);
}
@@ -58,7 +58,7 @@ be_visitor_sequence_cs::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;
@@ -80,25 +80,27 @@ be_visitor_sequence_cs::gen_bounded_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);
}
@@ -129,7 +131,7 @@ be_visitor_sequence_cs::gen_bounded_obj_sequence (be_sequence *node)
<< "// For this class memory is never reallocated so the implementation"
<< be_nl
<< "// is *really* simple." << be_nl
- << "this->buffer_ = " << class_name << "::allocbuf (length);"
+ << "this->buffer_ = " << class_name << "::allocbuf (length);"
<< be_uidt_nl
<< "}" << be_nl
<< be_nl;
@@ -163,7 +165,7 @@ be_visitor_sequence_cs::gen_bounded_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;
@@ -179,7 +181,13 @@ be_visitor_sequence_cs::gen_bounded_obj_sequence (be_sequence *node)
<< "for (CORBA::ULong i = nl; i < ol; ++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] = ";
@@ -201,19 +209,20 @@ be_visitor_sequence_cs::gen_bounded_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)
- || (prim
- && (prim->pt () == AST_PredefinedType::PT_pseudo)
+ 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);
@@ -222,7 +231,7 @@ be_visitor_sequence_cs::gen_bounded_obj_sequence (be_sequence *node)
bt->accept (visitor);
*os << "**, target);" << be_nl
- << "*tmp = ";
+ << "*tmp = ";
if (bt_is_defined)
{
@@ -232,17 +241,17 @@ be_visitor_sequence_cs::gen_bounded_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)
{
@@ -257,11 +266,11 @@ be_visitor_sequence_cs::gen_bounded_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 ();