diff options
author | parsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2000-03-01 23:31:06 +0000 |
---|---|---|
committer | parsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2000-03-01 23:31:06 +0000 |
commit | 1207e3a6d9741a11e78ff0c4dd0b22799c30ea7e (patch) | |
tree | 8cdc13fb72b900b67cfe88210aca40bbab8ddd71 /TAO/TAO_IDL | |
parent | e13d4a5ff91f1bd563c02c5c46372910ff80bbe4 (diff) | |
download | ATCD-1207e3a6d9741a11e78ff0c4dd0b22799c30ea7e.tar.gz |
Removed all use of interpretive behavior in the generated Any operators.
Also added some memory cleanup if the CDR stream operation is not
successful.
Diffstat (limited to 'TAO/TAO_IDL')
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_array/any_op_cs.cpp | 46 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_enum/any_op_cs.cpp | 36 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_exception/any_op_cs.cpp | 71 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_interface/any_op_cs.cpp | 32 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_sequence/any_op_cs.cpp | 81 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_structure/any_op_cs.cpp | 71 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_union/any_op_cs.cpp | 67 |
7 files changed, 271 insertions, 133 deletions
diff --git a/TAO/TAO_IDL/be/be_visitor_array/any_op_cs.cpp b/TAO/TAO_IDL/be/be_visitor_array/any_op_cs.cpp index d9703f4c588..8d6da3795ab 100644 --- a/TAO/TAO_IDL/be/be_visitor_array/any_op_cs.cpp +++ b/TAO/TAO_IDL/be/be_visitor_array/any_op_cs.cpp @@ -59,14 +59,28 @@ be_visitor_array_any_op_cs::visit_array (be_array *node) << "{" << be_idt_nl << "ACE_TRY_NEW_ENV" << be_nl << "{" << be_idt_nl + << "TAO_OutputCDR stream;" << be_nl + << "stream << _tao_elem;" << be_nl << "if (_tao_elem.nocopy ()) // no copy" << be_idt_nl - << "_tao_any.replace (" << node->tc_name () << ", " - << "_tao_elem.in (), 1, ACE_TRY_ENV); // consume it" << be_uidt_nl - << "else // copy" << be_idt_nl - << "_tao_any.replace (" << node->tc_name () << ", " << node->name () - << "_dup (_tao_elem.in ()), 1, ACE_TRY_ENV);" << be_uidt_nl - << "ACE_TRY_CHECK;" << be_uidt_nl + << "_tao_any._tao_replace (" << be_idt << be_idt_nl + << node->tc_name () << "," << be_nl + << "TAO_ENCAP_BYTE_ORDER," << be_nl + << "stream.begin ()," << be_nl + << "1," << be_nl + << "(void *)_tao_elem.in ()," << be_nl + << "ACE_TRY_ENV" << be_uidt_nl + << ");" << be_uidt << be_uidt_nl + << "else // copy" << be_idt_nl + << "_tao_any._tao_replace (" << be_idt << be_idt_nl + << node->tc_name () << "," << be_nl + << "TAO_ENCAP_BYTE_ORDER," << be_nl + << "stream.begin ()," << be_nl + << "1," << be_nl + << node->name () << "_dup (_tao_elem.in ())," << be_nl + << "ACE_TRY_ENV" << be_uidt_nl + << ");" << be_uidt << be_uidt << be_uidt_nl << "}" << be_nl + << "ACE_TRY_CHECK;" << be_nl << "ACE_CATCHANY {}" << be_nl << "ACE_ENDTRY;" << be_uidt_nl << "}\n\n"; @@ -91,21 +105,25 @@ be_visitor_array_any_op_cs::visit_array (be_array *node) << "{" << be_idt_nl << "_tao_elem.out () = " << node->name () << "_alloc ();" << be_nl << "if (!_tao_elem.in ()) return 0;" << be_nl - << "TAO_InputCDR stream (" << be_idt << be_idt_nl << "_tao_any._tao_get_cdr ()," << be_nl << "_tao_any._tao_byte_order ()" << be_uidt_nl << ");" << be_uidt_nl - - << "if (stream.decode (" << node->tc_name () - << ", _tao_elem.inout (), 0, ACE_TRY_ENV)" << be_nl - << " == CORBA::TypeCode::TRAVERSE_CONTINUE)" << be_nl + << "if (stream >> _tao_elem)" << be_nl << "{" << be_idt_nl - << "((CORBA::Any *)&_tao_any)->replace (" - << node->tc_name () << ", _tao_elem.inout (), 1, ACE_TRY_ENV);" << be_nl + << "((CORBA::Any *)&_tao_any)->_tao_replace (" << be_idt << be_idt_nl + << node->tc_name () << "," << be_nl + << "1," << be_nl + << "_tao_elem.inout ()," << be_nl + << "ACE_TRY_ENV" << be_uidt_nl + << ");" << be_uidt_nl + << "ACE_TRY_CHECK;" << be_nl << "return 1;" << be_uidt_nl << "}" << be_nl - << "ACE_TRY_CHECK;" << be_uidt_nl + << "else" << be_nl + << "{" << be_idt_nl + << node->name () << "_free (_tao_elem._retn ());" << be_uidt_nl + << "}" << be_uidt_nl << "}" << be_uidt_nl << "}" << be_nl << "ACE_CATCHANY" << be_nl diff --git a/TAO/TAO_IDL/be/be_visitor_enum/any_op_cs.cpp b/TAO/TAO_IDL/be/be_visitor_enum/any_op_cs.cpp index 1f2acd05b8e..88d51dd2715 100644 --- a/TAO/TAO_IDL/be/be_visitor_enum/any_op_cs.cpp +++ b/TAO/TAO_IDL/be/be_visitor_enum/any_op_cs.cpp @@ -56,20 +56,28 @@ be_visitor_enum_any_op_cs::visit_enum (be_enum *node) *os << "void operator<<= (CORBA::Any &_tao_any, " << node->name () << " _tao_elem)" << be_nl << "{" << be_idt_nl - << node->name () << " *_any_val;" << be_nl - << "ACE_NEW (_any_val, " << node->name () + << node->name () << " *_tao_any_val;" << be_nl + << "ACE_NEW (_tao_any_val, " << node->name () << " (_tao_elem));" << be_nl - << "if (!_any_val) return;" << be_nl + << "if (!_tao_any_val) return;" << be_nl << "ACE_TRY_NEW_ENV" << be_nl << "{" << be_idt_nl - << "_tao_any.replace (" << node->tc_name () - << ", _any_val, 1, ACE_TRY_ENV);" << be_nl + << "TAO_OutputCDR stream;" << be_nl + << "stream << *_tao_any_val;" << be_nl + << "_tao_any._tao_replace (" << be_idt << be_idt_nl + << node->tc_name () << "," << be_nl + << "TAO_ENCAP_BYTE_ORDER," << be_nl + << "stream.begin ()," << be_nl + << "1," << be_nl + << "_tao_any_val," << be_nl + << "ACE_TRY_ENV" << be_uidt_nl + << ");" << be_uidt_nl << "ACE_TRY_CHECK;" << be_uidt_nl << "}" << be_nl << "ACE_CATCHANY" << be_nl << "{" << be_idt_nl << "// free allocated storage" << be_nl - << "delete _any_val;" << be_uidt_nl + << "delete _tao_any_val;" << be_uidt_nl << "}" << be_nl << "ACE_ENDTRY;" << be_uidt_nl << "}\n" << be_nl; @@ -81,19 +89,19 @@ be_visitor_enum_any_op_cs::visit_enum (be_enum *node) << "{" << be_idt_nl << "CORBA::TypeCode_var type = _tao_any.type ();" << be_nl << "if (!type->equivalent (" << node->tc_name () - << ", ACE_TRY_ENV)) return 0; // not equal" << be_nl + << ", ACE_TRY_ENV)) // not equal" << be_idt_nl + << "{" << be_idt_nl + << "return 0;" << be_uidt_nl + << "}" << be_uidt_nl << "ACE_TRY_CHECK;" << be_nl - << "TAO_InputCDR stream (" << be_idt << be_idt_nl << "_tao_any._tao_get_cdr ()," << be_nl << "_tao_any._tao_byte_order ()" << be_uidt_nl << ");" << be_uidt_nl - - << "if (stream.decode (" << node->tc_name () - << ", &_tao_elem, 0, ACE_TRY_ENV)" << be_nl - << " == CORBA::TypeCode::TRAVERSE_CONTINUE)" << be_nl - << " return 1;" << be_nl - << "ACE_TRY_CHECK;" << be_uidt_nl + << "if (stream >> _tao_elem)" << be_nl + << "{" << be_idt_nl + << "return 1;" << be_uidt_nl + << "}" << be_uidt_nl << "}" << be_nl << "ACE_CATCHANY" << be_nl << "{" << be_idt_nl diff --git a/TAO/TAO_IDL/be/be_visitor_exception/any_op_cs.cpp b/TAO/TAO_IDL/be/be_visitor_exception/any_op_cs.cpp index 16a95324ab8..3ac5c434f64 100644 --- a/TAO/TAO_IDL/be/be_visitor_exception/any_op_cs.cpp +++ b/TAO/TAO_IDL/be/be_visitor_exception/any_op_cs.cpp @@ -59,10 +59,19 @@ be_visitor_exception_any_op_cs::visit_exception (be_exception *node) << node->name () << " *_tao_any_val = 0;" << be_nl << "ACE_NEW (_tao_any_val, " << node->name () << " (_tao_elem));" << be_nl + << "if (!_tao_any_val) return;" << be_nl << "ACE_TRY_NEW_ENV" << be_nl << "{" << be_idt_nl - << "_tao_any.replace (" << node->tc_name () << ", _tao_any_val, " - << "1, ACE_TRY_ENV);" << be_nl + << "TAO_OutputCDR stream;" << be_nl + << "stream << *_tao_any_val;" << be_nl + << "_tao_any._tao_replace (" << be_idt << be_idt_nl + << node->tc_name () << "," << be_nl + << "TAO_ENCAP_BYTE_ORDER," << be_nl + << "stream.begin ()," << be_nl + << "1," << be_nl + << "_tao_any_val," << be_nl + << "ACE_TRY_ENV" << be_uidt_nl + << ");" << be_uidt_nl << "ACE_TRY_CHECK;" << be_uidt_nl << "}" << be_nl << "ACE_CATCHANY " << be_nl @@ -77,11 +86,23 @@ be_visitor_exception_any_op_cs::visit_exception (be_exception *node) << "{" << be_idt_nl << "ACE_TRY_NEW_ENV" << be_nl << "{" << be_idt_nl - << "_tao_any.replace (" << node->tc_name () << ", " - << "_tao_elem, 1, ACE_TRY_ENV); // consume it" << be_nl + << "TAO_OutputCDR stream;" << be_nl + << "stream << *_tao_elem;" << be_nl + << "_tao_any._tao_replace (" << be_idt << be_idt_nl + << node->tc_name () << "," << be_nl + << "TAO_ENCAP_BYTE_ORDER," << be_nl + << "stream.begin ()," << be_nl + << "1," << be_nl + << "_tao_elem," << be_nl + << "ACE_TRY_ENV" << be_uidt_nl + << ");" << be_uidt_nl << "ACE_TRY_CHECK;" << be_uidt_nl << "}" << be_nl - << "ACE_CATCHANY {}" << be_nl + << "ACE_CATCHANY" << be_nl + << "{" << be_idt_nl + << "delete _tao_elem;" << be_nl + << "_tao_elem = 0;" << be_uidt_nl + << "}" << be_nl << "ACE_ENDTRY;" << be_uidt_nl << "}\n" << be_nl; @@ -108,22 +129,22 @@ be_visitor_exception_any_op_cs::visit_exception (be_exception *node) << "{" << be_idt_nl << "ACE_NEW_RETURN (_tao_elem, " << node->name () << ", 0);" << be_nl - << "TAO_InputCDR stream (" << be_idt << be_idt_nl << "_tao_any._tao_get_cdr ()," << be_nl << "_tao_any._tao_byte_order ()" << be_uidt_nl << ");" << be_uidt_nl - - << "if (stream.decode (" << node->tc_name () - << ", _tao_elem, 0, ACE_TRY_ENV)" << be_nl - << " == CORBA::TypeCode::TRAVERSE_CONTINUE)" << be_nl + << "if (stream >> *_tao_elem)" << be_nl << "{" << be_idt_nl - << "((CORBA::Any *)&_tao_any)->replace (" - << node->tc_name () << ", _tao_elem, 1, ACE_TRY_ENV);" << be_nl + << "((CORBA::Any *)&_tao_any)->_tao_replace (" << be_idt << be_idt_nl + << node->tc_name () << "," << be_nl + << "1," << be_nl + << "ACE_reinterpret_cast (void *, _tao_elem)," << be_nl + << "ACE_TRY_ENV" << be_uidt_nl + << ");" << be_uidt_nl << "ACE_TRY_CHECK;" << be_nl << "return 1;" << be_uidt_nl << "}" << be_nl - << "else" << be_nl // decode failed + << "else" << be_nl << "{" << be_idt_nl << "delete _tao_elem;" << be_nl << "_tao_elem = 0;" << be_uidt_nl @@ -134,10 +155,9 @@ be_visitor_exception_any_op_cs::visit_exception (be_exception *node) << "{" << be_idt_nl << "delete _tao_elem;" << be_nl << "_tao_elem = 0;" << be_nl - << "return 0;" << be_uidt_nl + << "return 0; " << be_uidt_nl << "}" << be_nl << "ACE_ENDTRY;" << be_nl - << "_tao_elem = 0;" << be_nl << "return 0;" << be_uidt_nl << "}\n\n"; @@ -164,22 +184,24 @@ be_visitor_exception_any_op_cs::visit_exception (be_exception *node) << "{" << be_idt_nl << "ACE_NEW_RETURN (_tao_elem, " << node->name () << ", 0);" << be_nl - << "TAO_InputCDR stream (" << be_idt << be_idt_nl << "_tao_any._tao_get_cdr ()," << be_nl << "_tao_any._tao_byte_order ()" << be_uidt_nl << ");" << be_uidt_nl - - << "if (stream.decode (" << node->tc_name () - << ", _tao_elem, 0, ACE_TRY_ENV)" << be_nl - << " == CORBA::TypeCode::TRAVERSE_CONTINUE)" << be_nl + << "if (stream >> *(" << node->name () << " *)_tao_elem)" << be_nl << "{" << be_idt_nl - << "((CORBA::Any *)&_tao_any)->replace (" - << node->tc_name () << ", _tao_elem, 1, ACE_TRY_ENV);" << be_nl + << "((CORBA::Any *)&_tao_any)->_tao_replace (" + << be_idt << be_idt_nl + << node->tc_name () << "," << be_nl + << "1," << be_nl + << "ACE_reinterpret_cast (void *, ACE_const_cast (" + << node->name () << " *&, _tao_elem))," << be_nl + << "ACE_TRY_ENV" << be_uidt_nl + << ");" << be_uidt_nl << "ACE_TRY_CHECK;" << be_nl << "return 1;" << be_uidt_nl << "}" << be_nl - << "else" << be_nl // decode failed + << "else" << be_nl << "{" << be_idt_nl << "delete ACE_const_cast (" << node->name () << " *&, _tao_elem);" << be_nl @@ -192,10 +214,9 @@ be_visitor_exception_any_op_cs::visit_exception (be_exception *node) << "delete ACE_const_cast (" << node->name () << " *&, _tao_elem);" << be_nl << "_tao_elem = 0;" << be_nl - << "return 0;" << be_uidt_nl + << "return 0; " << be_uidt_nl << "}" << be_nl << "ACE_ENDTRY;" << be_nl - << "_tao_elem = 0;" << be_nl << "return 0;" << be_uidt_nl << "}\n\n"; diff --git a/TAO/TAO_IDL/be/be_visitor_interface/any_op_cs.cpp b/TAO/TAO_IDL/be/be_visitor_interface/any_op_cs.cpp index 8eedc6f6bfe..83070806014 100644 --- a/TAO/TAO_IDL/be/be_visitor_interface/any_op_cs.cpp +++ b/TAO/TAO_IDL/be/be_visitor_interface/any_op_cs.cpp @@ -76,10 +76,24 @@ be_visitor_interface_any_op_cs::visit_interface (be_interface *node) << "ACE_NEW (_tao_obj_ptr, CORBA::Object_ptr);" << be_nl << "*_tao_obj_ptr = " << node->full_name () << "::_duplicate (_tao_elem);" << be_nl - << "_tao_any.replace (" << node->tc_name () << ", " - << "_tao_obj_ptr, 1, ACE_TRY_ENV);" << be_nl + << "TAO_OutputCDR stream;" << be_nl + << "if (stream << *_tao_obj_ptr)" << be_nl + << "{" << be_idt_nl + << "_tao_any._tao_replace (" << be_idt << be_idt_nl + << node->tc_name () << ", " << be_nl + << "TAO_ENCAP_BYTE_ORDER," << be_nl + << "stream.begin ()," << be_nl + << "1," << be_nl + << "_tao_obj_ptr," << be_nl + << "ACE_TRY_ENV" << be_uidt_nl + << ");" << be_uidt_nl << "ACE_TRY_CHECK;" << be_uidt_nl << "}" << be_nl + << "else" << be_nl + << "{" << be_idt_nl + << "delete _tao_obj_ptr;" << be_uidt_nl + << "}" << be_uidt_nl + << "}" << be_nl << "ACE_CATCHANY" << be_nl << "{" << be_idt_nl << "delete _tao_obj_ptr;" << be_uidt_nl @@ -102,25 +116,25 @@ be_visitor_interface_any_op_cs::visit_interface (be_interface *node) << "return 0;" << be_uidt_nl << "}" << be_uidt_nl << "ACE_TRY_CHECK;" << be_nl - << "TAO_InputCDR stream (" << be_idt << be_idt_nl << "_tao_any._tao_get_cdr ()," << be_nl << "_tao_any._tao_byte_order ()" << be_uidt_nl << ");" << be_uidt_nl - << "CORBA::Object_var _tao_obj_var;" << be_nl << "ACE_NEW_RETURN (tmp, CORBA::Object_ptr, 0);" << be_nl - << "if (stream.decode (" << node->tc_name () - << ", &_tao_obj_var.out (), 0, ACE_TRY_ENV)" << be_nl - << " == CORBA::TypeCode::TRAVERSE_CONTINUE)" << be_nl + << "if (stream >> _tao_elem)" << be_nl << "{" << be_idt_nl << "_tao_elem = " << node->full_name () << "::_narrow (_tao_obj_var.in (), ACE_TRY_ENV);" << be_nl << "ACE_TRY_CHECK;" << be_nl << "*tmp = (CORBA::Object_ptr) _tao_elem; // any owns the object" << be_nl - << "((CORBA::Any *)&_tao_any)->replace (" - << node->tc_name () << ", tmp, 1, ACE_TRY_ENV);" << be_nl + << "((CORBA::Any *)&_tao_any)->_tao_replace (" << be_idt << be_idt_nl + << node->tc_name () << "," << be_nl + << "1," << be_nl + << "tmp," << be_nl + << "ACE_TRY_ENV" << be_uidt_nl + << ");" << be_uidt_nl << "ACE_TRY_CHECK;" << be_nl << "return 1;" << be_uidt_nl << "}" << be_nl diff --git a/TAO/TAO_IDL/be/be_visitor_sequence/any_op_cs.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/any_op_cs.cpp index b9a28f97d32..507ad37a2ed 100644 --- a/TAO/TAO_IDL/be/be_visitor_sequence/any_op_cs.cpp +++ b/TAO/TAO_IDL/be/be_visitor_sequence/any_op_cs.cpp @@ -63,11 +63,24 @@ be_visitor_sequence_any_op_cs::visit_sequence (be_sequence *node) << "if (!_tao_any_val) return;" << be_nl << "ACE_TRY_NEW_ENV" << be_nl << "{" << be_idt_nl - << "_tao_any.replace (" << node->tc_name () - << ", _tao_any_val, 1, ACE_TRY_ENV);" - << " // copy the value" << be_nl + << "TAO_OutputCDR stream;" << be_nl + << "if (stream << *_tao_any_val)" << be_nl + << "{" << be_idt_nl + << "_tao_any._tao_replace (" << be_idt << be_idt_nl + << node->tc_name () << "," << be_nl + << "TAO_ENCAP_BYTE_ORDER," << be_nl + << "stream.begin ()," << be_nl + << "1," << be_nl + << "_tao_any_val," << be_nl + << "ACE_TRY_ENV" << be_uidt_nl + << ");" << be_uidt_nl << "ACE_TRY_CHECK; " << be_uidt_nl << "}" << be_nl + << "else" << be_nl + << "{" << be_idt_nl + << "delete _tao_any_val;" << be_uidt_nl + << "}" << be_uidt_nl + << "}" << be_nl << "ACE_CATCHANY" << be_nl << "{" << be_idt_nl << "delete _tao_any_val;" << be_uidt_nl @@ -80,11 +93,23 @@ be_visitor_sequence_any_op_cs::visit_sequence (be_sequence *node) << "{" << be_idt_nl << "ACE_TRY_NEW_ENV" << be_nl << "{" << be_idt_nl - << "_tao_any.replace (" << node->tc_name () << ", " - << "_tao_elem, 0, ACE_TRY_ENV);" << be_nl + << "TAO_OutputCDR stream;" << be_nl + << "stream << *_tao_elem;" << be_nl + << "_tao_any._tao_replace (" << be_idt << be_idt_nl + << node->tc_name () << "," << be_nl + << "TAO_ENCAP_BYTE_ORDER," << be_nl + << "stream.begin ()," << be_nl + << "1," << be_nl + << "_tao_elem," << be_nl + << "ACE_TRY_ENV" << be_uidt_nl + << ");" << be_uidt_nl << "ACE_TRY_CHECK;" << be_uidt_nl << "}" << be_nl - << "ACE_CATCHANY {}" << be_nl + << "ACE_CATCHANY" << be_nl + << "{" << be_idt_nl + << "delete _tao_elem;" << be_nl + << "_tao_elem = 0;" << be_uidt_nl + << "}" << be_nl << "ACE_ENDTRY;" << be_uidt_nl << "}\n" << be_nl; @@ -111,23 +136,22 @@ be_visitor_sequence_any_op_cs::visit_sequence (be_sequence *node) << "{" << be_idt_nl << "ACE_NEW_RETURN (_tao_elem, " << node->name () << ", 0);" << be_nl - << "TAO_InputCDR stream (" << be_idt << be_idt_nl << "_tao_any._tao_get_cdr ()," << be_nl << "_tao_any._tao_byte_order ()" << be_uidt_nl << ");" << be_uidt_nl - - << "if (stream.decode (" << node->tc_name () - << ", _tao_elem, 0, ACE_TRY_ENV)" << be_nl - << " == CORBA::TypeCode::TRAVERSE_CONTINUE)" << be_nl + << "if (stream >> *_tao_elem)" << be_nl << "{" << be_idt_nl - << "((CORBA::Any *)&_tao_any)->replace (" - << node->tc_name () << ", _tao_elem, 1, ACE_TRY_ENV);" - << be_nl + << "((CORBA::Any *)&_tao_any)->_tao_replace (" << be_idt << be_idt_nl + << node->tc_name () << "," << be_nl + << "1," << be_nl + << "ACE_reinterpret_cast (void *, _tao_elem)," << be_nl + << "ACE_TRY_ENV" << be_uidt_nl + << ");" << be_uidt_nl << "ACE_TRY_CHECK;" << be_nl << "return 1;" << be_uidt_nl << "}" << be_nl - << "else" << be_nl // decode failed + << "else" << be_nl << "{" << be_idt_nl << "delete _tao_elem;" << be_nl << "_tao_elem = 0;" << be_uidt_nl @@ -138,10 +162,9 @@ be_visitor_sequence_any_op_cs::visit_sequence (be_sequence *node) << "{" << be_idt_nl << "delete _tao_elem;" << be_nl << "_tao_elem = 0;" << be_nl - << "return 0;" << be_uidt_nl + << "return 0; " << be_uidt_nl << "}" << be_nl << "ACE_ENDTRY;" << be_nl - << "_tao_elem = 0;" << be_nl << "return 0;" << be_uidt_nl << "}\n\n"; @@ -168,23 +191,24 @@ be_visitor_sequence_any_op_cs::visit_sequence (be_sequence *node) << "{" << be_idt_nl << "ACE_NEW_RETURN (_tao_elem, " << node->name () << ", 0);" << be_nl - << "TAO_InputCDR stream (" << be_idt << be_idt_nl << "_tao_any._tao_get_cdr ()," << be_nl << "_tao_any._tao_byte_order ()" << be_uidt_nl << ");" << be_uidt_nl - - << "if (stream.decode (" << node->tc_name () - << ", _tao_elem, 0, ACE_TRY_ENV)" << be_nl - << " == CORBA::TypeCode::TRAVERSE_CONTINUE)" << be_nl - << "{" << be_idt_nl - << "((CORBA::Any *)&_tao_any)->replace (" - << node->tc_name () << ", _tao_elem, 1, ACE_TRY_ENV);" - << be_nl + << "if (stream >> *(" << node->name () << " *)_tao_elem)" << be_nl + << "{" << be_idt_nl + << "((CORBA::Any *)&_tao_any)->_tao_replace (" + << be_idt << be_idt_nl + << node->tc_name () << "," << be_nl + << "1," << be_nl + << "ACE_reinterpret_cast (void *, ACE_const_cast (" + << node->name () << " *&, _tao_elem))," << be_nl + << "ACE_TRY_ENV" << be_uidt_nl + << ");" << be_uidt_nl << "ACE_TRY_CHECK;" << be_nl << "return 1;" << be_uidt_nl << "}" << be_nl - << "else" << be_nl // decode failed + << "else" << be_nl << "{" << be_idt_nl << "delete ACE_const_cast (" << node->name () << " *&, _tao_elem);" << be_nl @@ -197,10 +221,9 @@ be_visitor_sequence_any_op_cs::visit_sequence (be_sequence *node) << "delete ACE_const_cast (" << node->name () << " *&, _tao_elem);" << be_nl << "_tao_elem = 0;" << be_nl - << "return 0;" << be_uidt_nl + << "return 0; " << be_uidt_nl << "}" << be_nl << "ACE_ENDTRY;" << be_nl - << "_tao_elem = 0;" << be_nl << "return 0;" << be_uidt_nl << "}\n\n"; diff --git a/TAO/TAO_IDL/be/be_visitor_structure/any_op_cs.cpp b/TAO/TAO_IDL/be/be_visitor_structure/any_op_cs.cpp index 46955581f4b..7a14ec318b5 100644 --- a/TAO/TAO_IDL/be/be_visitor_structure/any_op_cs.cpp +++ b/TAO/TAO_IDL/be/be_visitor_structure/any_op_cs.cpp @@ -56,13 +56,22 @@ be_visitor_structure_any_op_cs::visit_structure (be_structure *node) *os << "void operator<<= (CORBA::Any &_tao_any, const " << node->name () << " &_tao_elem) // copying" << be_nl << "{" << be_idt_nl - << node->name () << " *_any_val;" << be_nl - << "ACE_NEW (_any_val, " << node->name () << " (_tao_elem));" << be_nl + << node->name () << " *_any_val = 0;" << be_nl + << "ACE_NEW (_any_val, " << node->name () + << " (_tao_elem));" << be_nl << "if (!_any_val) return;" << be_nl << "ACE_TRY_NEW_ENV" << be_nl << "{" << be_idt_nl - << "_tao_any.replace (" << node->tc_name () - << ", _any_val, 1, ACE_TRY_ENV);" << " // copy the value" << be_nl + << "TAO_OutputCDR stream;" << be_nl + << "stream << *_any_val;" << be_nl + << "_tao_any._tao_replace (" << be_idt << be_idt_nl + << node->tc_name () << "," << be_nl + << "TAO_ENCAP_BYTE_ORDER," << be_nl + << "stream.begin ()," << be_nl + << "1," << be_nl + << "_any_val," << be_nl + << "ACE_TRY_ENV" << be_uidt_nl + << ");" << be_uidt_nl << "ACE_TRY_CHECK;" << be_uidt_nl << "}" << be_nl << "ACE_CATCHANY" << be_nl @@ -77,11 +86,23 @@ be_visitor_structure_any_op_cs::visit_structure (be_structure *node) << "{" << be_idt_nl << "ACE_TRY_NEW_ENV" << be_nl << "{" << be_idt_nl - << "_tao_any.replace (" << node->tc_name () << ", " - << "_tao_elem, 1, ACE_TRY_ENV); // consume it" << be_nl + << "TAO_OutputCDR stream;" << be_nl + << "stream << *_tao_elem;" << be_nl + << "_tao_any._tao_replace (" << be_idt << be_idt_nl + << node->tc_name () << "," << be_nl + << "TAO_ENCAP_BYTE_ORDER," << be_nl + << "stream.begin ()," << be_nl + << "1," << be_nl + << "_tao_elem," << be_nl + << "ACE_TRY_ENV" << be_uidt_nl + << ");" << be_uidt_nl << "ACE_TRY_CHECK;" << be_uidt_nl << "}" << be_nl - << "ACE_CATCHANY {}" << be_nl + << "ACE_CATCHANY" << be_nl + << "{" << be_idt_nl + << "delete _tao_elem;" << be_nl + << "_tao_elem = 0;" << be_uidt_nl + << "}" << be_nl << "ACE_ENDTRY;" << be_uidt_nl << "}\n" << be_nl; @@ -102,24 +123,24 @@ be_visitor_structure_any_op_cs::visit_structure (be_structure *node) << "{" << be_idt_nl << "_tao_elem = (" << node->name () << " *)_tao_any.value ();" << be_nl - << "return 1;" << be_nl - << "}" << be_uidt_nl + << "return 1;" << be_uidt_nl + << "}" << be_nl << "else" << be_nl // else any does not own the data << "{" << be_idt_nl << "ACE_NEW_RETURN (_tao_elem, " << node->name () << ", 0);" << be_nl - << "TAO_InputCDR stream (" << be_idt << be_idt_nl << "_tao_any._tao_get_cdr ()," << be_nl << "_tao_any._tao_byte_order ()" << be_uidt_nl << ");" << be_uidt_nl - - << "if (stream.decode (" << node->tc_name () - << ", _tao_elem, 0, ACE_TRY_ENV)" << be_nl - << " == CORBA::TypeCode::TRAVERSE_CONTINUE)" << be_nl + << "if (stream >> *_tao_elem)" << be_nl << "{" << be_idt_nl - << "((CORBA::Any *)&_tao_any)->replace (" - << node->tc_name () << ", _tao_elem, 1, ACE_TRY_ENV);" << be_nl + << "((CORBA::Any *)&_tao_any)->_tao_replace (" << be_idt << be_idt_nl + << node->tc_name () << "," << be_nl + << "1," << be_nl + << "ACE_reinterpret_cast (void *, _tao_elem)," << be_nl + << "ACE_TRY_ENV" << be_uidt_nl + << ");" << be_uidt_nl << "ACE_TRY_CHECK;" << be_nl << "return 1;" << be_uidt_nl << "}" << be_nl @@ -137,7 +158,6 @@ be_visitor_structure_any_op_cs::visit_structure (be_structure *node) << "return 0; " << be_uidt_nl << "}" << be_nl << "ACE_ENDTRY;" << be_nl - << "_tao_elem = 0;" << be_nl << "return 0;" << be_uidt_nl << "}\n\n"; @@ -164,18 +184,20 @@ be_visitor_structure_any_op_cs::visit_structure (be_structure *node) << "{" << be_idt_nl << "ACE_NEW_RETURN (_tao_elem, " << node->name () << ", 0);" << be_nl - << "TAO_InputCDR stream (" << be_idt << be_idt_nl << "_tao_any._tao_get_cdr ()," << be_nl << "_tao_any._tao_byte_order ()" << be_uidt_nl << ");" << be_uidt_nl - - << "if (stream.decode (" << node->tc_name () - << ", _tao_elem, 0, ACE_TRY_ENV)" << be_nl - << " == CORBA::TypeCode::TRAVERSE_CONTINUE)" << be_nl + << "if (stream >> *(" << node->name () << " *)_tao_elem)" << be_nl << "{" << be_idt_nl - << "((CORBA::Any *)&_tao_any)->replace (" - << node->tc_name () << ", _tao_elem, 1, ACE_TRY_ENV);" << be_nl + << "((CORBA::Any *)&_tao_any)->_tao_replace (" + << be_idt << be_idt_nl + << node->tc_name () << "," << be_nl + << "1," << be_nl + << "ACE_reinterpret_cast (void *, ACE_const_cast (" + << node->name () << " *&, _tao_elem))," << be_nl + << "ACE_TRY_ENV" << be_uidt_nl + << ");" << be_uidt_nl << "ACE_TRY_CHECK;" << be_nl << "return 1;" << be_uidt_nl << "}" << be_nl @@ -195,7 +217,6 @@ be_visitor_structure_any_op_cs::visit_structure (be_structure *node) << "return 0; " << be_uidt_nl << "}" << be_nl << "ACE_ENDTRY;" << be_nl - << "_tao_elem = 0;" << be_nl << "return 0;" << be_uidt_nl << "}\n\n"; diff --git a/TAO/TAO_IDL/be/be_visitor_union/any_op_cs.cpp b/TAO/TAO_IDL/be/be_visitor_union/any_op_cs.cpp index 9cb6f624c52..d2086f0b3d7 100644 --- a/TAO/TAO_IDL/be/be_visitor_union/any_op_cs.cpp +++ b/TAO/TAO_IDL/be/be_visitor_union/any_op_cs.cpp @@ -57,7 +57,7 @@ be_visitor_union_any_op_cs::visit_union (be_union *node) << "const " << node->name () << " &_tao_elem" << be_uidt_nl << ")" << be_uidt_nl << "{" << be_idt_nl - << node->name () << " *_any_val;" << be_nl + << node->name () << " *_any_val = 0;" << be_nl << "ACE_NEW (_any_val, " << node->name () << " (_tao_elem));" << be_nl << "ACE_TRY_NEW_ENV" << be_nl @@ -86,7 +86,11 @@ be_visitor_union_any_op_cs::visit_union (be_union *node) return -1; *os << "}" << be_nl - << "ACE_CATCHANY {}" << be_nl + << "ACE_CATCHANY" << be_nl + << "{" << be_idt_nl + << "delete _tao_elem;" << be_nl + << "_tao_elem = 0;" << be_uidt_nl + << "}" << be_nl << "ACE_ENDTRY;" << be_uidt_nl << "}\n" << be_nl; @@ -124,8 +128,7 @@ be_visitor_union_any_op_cs::visit_union (be_union *node) if (this->gen_extraction (os, node) != 0) return -1; - *os << be_nl - << "return 1;" << be_uidt_nl + *os << be_uidt_nl << "}" << be_uidt_nl << "}" << be_nl << "ACE_CATCHANY" << be_nl @@ -171,8 +174,7 @@ be_visitor_union_any_op_cs::visit_union (be_union *node) if (this->gen_const_extraction (os, node) != 0) return -1; - *os << be_nl - << "return 1;" << be_uidt_nl + *os << be_uidt_nl << "}" << be_uidt_nl << "}" << be_nl << "ACE_CATCHANY" << be_nl @@ -235,10 +237,11 @@ be_visitor_union_any_op_compiled_cs (be_visitor_context *ctx) int be_visitor_union_any_op_compiled_cs:: gen_insertion (TAO_OutStream *os, - be_union *node) + be_union *node) { *os << "TAO_OutputCDR stream;" << be_nl - << "stream << *_any_val;" << be_nl + << "if (stream << *_any_val)" << be_nl + << "{" << be_idt_nl << "_tao_any._tao_replace (" << be_idt << be_idt_nl << node->tc_name () << "," << be_nl << "TAO_ENCAP_BYTE_ORDER," << be_nl @@ -247,7 +250,12 @@ gen_insertion (TAO_OutStream *os, << "_any_val," << be_nl << "ACE_TRY_ENV" << be_uidt_nl << ");" << be_uidt_nl - << "ACE_TRY_CHECK;" << be_uidt_nl; + << "ACE_TRY_CHECK;" << be_uidt_nl + << "}" << be_nl + << "else" << be_nl + << "{" << be_idt_nl + << "delete _any_val;" << be_uidt_nl + << "}" << be_uidt_nl; return 0; } @@ -257,7 +265,8 @@ gen_insertion_nocopy (TAO_OutStream *os, be_union *node) { *os << "TAO_OutputCDR stream;" << be_nl - << "stream << *_tao_elem;" << be_nl + << "if (stream << *_tao_elem)" << be_nl + << "{" << be_idt_nl << "_tao_any._tao_replace (" << be_idt << be_idt_nl << node->tc_name () << "," << be_nl << "TAO_ENCAP_BYTE_ORDER," << be_nl @@ -266,7 +275,12 @@ gen_insertion_nocopy (TAO_OutStream *os, << "_tao_elem," << be_nl << "ACE_TRY_ENV" << be_uidt_nl << ");" << be_uidt_nl - << "ACE_TRY_CHECK;" << be_uidt_nl; + << "ACE_TRY_CHECK;" << be_uidt_nl + << "}" << be_nl + << "else" << be_nl + << "{" << be_idt_nl + << "delete _tao_elem;" << be_uidt_nl + << "}" << be_uidt_nl; return 0; } @@ -275,14 +289,22 @@ be_visitor_union_any_op_compiled_cs:: gen_extraction (TAO_OutStream *os, be_union *node) { - *os << "stream >> *_tao_elem;" << be_nl + *os << be_nl << "if (stream >> *_tao_elem)" << be_nl + << "{" << be_idt_nl << "((CORBA::Any *)&_tao_any)->_tao_replace (" << be_idt << be_idt_nl << node->tc_name () << "," << be_nl << "1," << be_nl << "ACE_reinterpret_cast (void *, _tao_elem)," << be_nl << "ACE_TRY_ENV" << be_uidt_nl << ");" << be_uidt_nl - << "ACE_TRY_CHECK;" << be_nl; + << "ACE_TRY_CHECK;" << be_nl + << "return 1;" << be_uidt_nl + << "}" << be_nl + << "else" << be_nl + << "{" << be_idt_nl + << "delete _tao_elem;" << be_nl + << "_tao_elem = 0;" << be_uidt_nl + << "}"; return 0; } @@ -291,15 +313,26 @@ be_visitor_union_any_op_compiled_cs:: gen_const_extraction (TAO_OutStream *os, be_union *node) { - *os << "stream >> *(" << node->name () << " *)_tao_elem;" << be_nl - << "((CORBA::Any *)&_tao_any)->_tao_replace (" << be_idt << be_idt_nl + *os << be_nl << "if (stream >> *(" << node->name () + << " *)_tao_elem)" << be_nl + << "{" << be_idt_nl + << "((CORBA::Any *)&_tao_any)->_tao_replace (" + << be_idt << be_idt_nl << node->tc_name () << "," << be_nl << "1," << be_nl << "ACE_reinterpret_cast (void *, ACE_const_cast (" << node->name () << " *&, _tao_elem))," << be_nl << "ACE_TRY_ENV" << be_uidt_nl << ");" << be_uidt_nl - << "ACE_TRY_CHECK;" << be_nl; + << "ACE_TRY_CHECK;" << be_nl + << "return 1;" << be_uidt_nl + << "}" << be_nl + << "else" << be_nl + << "{" << be_idt_nl + << "delete ACE_const_cast (" << node->name () + << " *&, _tao_elem);" << be_nl + << "_tao_elem = 0;" << be_uidt_nl + << "}"; return 0; } @@ -314,7 +347,7 @@ be_visitor_union_any_op_interpretive_cs (be_visitor_context *ctx) int be_visitor_union_any_op_interpretive_cs:: gen_insertion (TAO_OutStream *os, - be_union *node) + be_union *node) { *os << "_tao_any.replace (" << node->tc_name () << ", _any_val, 1, ACE_TRY_ENV);" << " // copy the value" << be_nl |