diff options
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.cpp | 57 |
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 (); |