summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL
diff options
context:
space:
mode:
authorparsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2000-03-01 23:31:06 +0000
committerparsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2000-03-01 23:31:06 +0000
commit1207e3a6d9741a11e78ff0c4dd0b22799c30ea7e (patch)
tree8cdc13fb72b900b67cfe88210aca40bbab8ddd71 /TAO/TAO_IDL
parente13d4a5ff91f1bd563c02c5c46372910ff80bbe4 (diff)
downloadATCD-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.cpp46
-rw-r--r--TAO/TAO_IDL/be/be_visitor_enum/any_op_cs.cpp36
-rw-r--r--TAO/TAO_IDL/be/be_visitor_exception/any_op_cs.cpp71
-rw-r--r--TAO/TAO_IDL/be/be_visitor_interface/any_op_cs.cpp32
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/any_op_cs.cpp81
-rw-r--r--TAO/TAO_IDL/be/be_visitor_structure/any_op_cs.cpp71
-rw-r--r--TAO/TAO_IDL/be/be_visitor_union/any_op_cs.cpp67
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