summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorparsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2000-01-04 17:37:29 +0000
committerparsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2000-01-04 17:37:29 +0000
commitc151b96a98761929f5643db8cf3e4b7a27758b35 (patch)
tree0322ddbf0737e9ec44f3ab84b451350312211021
parent6106f67f49351cd212e688b0fe04875ba7b631c2 (diff)
downloadATCD-c151b96a98761929f5643db8cf3e4b7a27758b35.tar.gz
Added code generation for Any extraction to pointer
to const, as laid out in CORBA 2.3.1.
-rw-r--r--TAO/TAO_IDL/be/be_visitor_exception/any_op_ch.cpp3
-rw-r--r--TAO/TAO_IDL/be/be_visitor_exception/any_op_cs.cpp62
-rw-r--r--TAO/TAO_IDL/be/be_visitor_interface/any_op_cs.cpp8
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/any_op_ch.cpp3
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence/any_op_cs.cpp64
-rw-r--r--TAO/TAO_IDL/be/be_visitor_structure/any_op_ch.cpp3
-rw-r--r--TAO/TAO_IDL/be/be_visitor_structure/any_op_cs.cpp62
-rw-r--r--TAO/TAO_IDL/be/be_visitor_union/any_op_ch.cpp3
-rw-r--r--TAO/TAO_IDL/be/be_visitor_union/any_op_cs.cpp76
-rw-r--r--TAO/TAO_IDL/be_include/be_visitor_union/any_op_cs.h12
10 files changed, 284 insertions, 12 deletions
diff --git a/TAO/TAO_IDL/be/be_visitor_exception/any_op_ch.cpp b/TAO/TAO_IDL/be/be_visitor_exception/any_op_ch.cpp
index 6ec9a980815..74fd57808b7 100644
--- a/TAO/TAO_IDL/be/be_visitor_exception/any_op_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_exception/any_op_ch.cpp
@@ -59,6 +59,9 @@ be_visitor_exception_any_op_ch::visit_exception (be_exception *node)
<< "*); // noncopying version" << be_nl;
*os << idl_global->stub_export_macro () << " CORBA::Boolean"
<< " operator>>= (const CORBA::Any &, "
+ << node->name () << " *&); // deprecated\n";
+ *os << idl_global->stub_export_macro () << " CORBA::Boolean"
+ << " operator>>= (const CORBA::Any &, const "
<< node->name () << " *&);\n";
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 8a0a28951fa..3dbc8d114cb 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
@@ -92,7 +92,11 @@ be_visitor_exception_any_op_cs::visit_exception (be_exception *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
+ << "_tao_elem = 0;" << be_nl
+ << "return 0;" << be_uidt_nl
+ << "}" << be_uidt_nl
<< "ACE_TRY_CHECK;" << be_nl
<< "if (_tao_any.any_owns_data ())" << be_nl
<< "{" << be_idt_nl
@@ -117,19 +121,73 @@ be_visitor_exception_any_op_cs::visit_exception (be_exception *node)
<< "}" << be_nl
<< "else" << be_nl // decode failed
<< "{" << be_idt_nl
- << "delete _tao_elem;" << be_uidt_nl
+ << "delete _tao_elem;" << be_nl
+ << "_tao_elem = 0;" << be_uidt_nl
<< "}" << be_uidt_nl
<< "}" << be_uidt_nl
<< "}" << be_nl
<< "ACE_CATCHANY" << be_nl
<< "{" << be_idt_nl
<< "delete _tao_elem;" << be_nl
+ << "_tao_elem = 0;" << be_nl
<< "return 0;" << be_uidt_nl
<< "}" << be_nl
<< "ACE_ENDTRY;" << be_nl
+ << "_tao_elem = 0;" << be_nl
<< "return 0;" << be_uidt_nl
<< "}\n\n";
+ *os << "CORBA::Boolean operator>>= (const CORBA::Any &_tao_any, const "
+ << node->name () << " *&_tao_elem)" << be_nl
+ << "{" << be_idt_nl
+ << "ACE_TRY_NEW_ENV" << be_nl
+ << "{" << be_idt_nl
+ << "CORBA::TypeCode_var type = _tao_any.type ();" << be_nl
+ << "if (!type->equivalent (" << node->tc_name ()
+ << ", ACE_TRY_ENV)) // not equal" << be_idt_nl
+ << "{" << be_idt_nl
+ << "_tao_elem = 0;" << be_nl
+ << "return 0;" << be_uidt_nl
+ << "}" << be_uidt_nl
+ << "ACE_TRY_CHECK;" << be_nl
+ << "if (_tao_any.any_owns_data ())" << be_nl
+ << "{" << be_idt_nl
+ << "_tao_elem = (" << node->name () << " *)_tao_any.value ();"
+ << be_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 (_tao_any._tao_get_cdr ());"
+ << be_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
+ << "ACE_TRY_CHECK;" << be_nl
+ << "return 1;" << be_uidt_nl
+ << "}" << be_nl
+ << "else" << be_nl // decode failed
+ << "{" << be_idt_nl
+ << "delete _tao_elem;" << be_nl
+ << "_tao_elem = 0;" << be_uidt_nl
+ << "}" << be_uidt_nl
+ << "}" << be_uidt_nl
+ << "}" << be_nl
+ << "ACE_CATCHANY" << be_nl
+ << "{" << be_idt_nl
+ << "delete _tao_elem;" << be_nl
+ << "_tao_elem = 0;" << be_nl
+ << "return 0;" << be_uidt_nl
+ << "}" << be_nl
+ << "ACE_ENDTRY;" << be_nl
+ << "_tao_elem = 0;" << be_nl
+ << "return 0;" << be_uidt_nl
+ << "}\n\n";
// all we have to do is to visit the scope and generate code
if (this->visit_scope (node) == -1)
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 9c93cab7faa..1f697456c65 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
@@ -96,7 +96,11 @@ be_visitor_interface_any_op_cs::visit_interface (be_interface *node)
<< "_tao_elem = " << node->full_name () << "::_nil ();" << be_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
+ << "_tao_elem = 0;" << be_nl
+ << "return 0;" << be_uidt_nl
+ << "}" << be_uidt_nl
<< "ACE_TRY_CHECK;" << be_nl
<< "TAO_InputCDR stream (_tao_any._tao_get_cdr ());"
<< be_nl
@@ -121,9 +125,11 @@ be_visitor_interface_any_op_cs::visit_interface (be_interface *node)
<< "ACE_CATCHANY" << be_nl
<< "{" << be_idt_nl
<< "delete tmp;" << be_nl
+ << "_tao_elem = 0;" << be_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_sequence/any_op_ch.cpp b/TAO/TAO_IDL/be/be_visitor_sequence/any_op_ch.cpp
index e1cc5797613..fd62fd6a241 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence/any_op_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence/any_op_ch.cpp
@@ -59,6 +59,9 @@ be_visitor_sequence_any_op_ch::visit_sequence (be_sequence *node)
<< "*); // noncopying version" << be_nl;
*os << idl_global->stub_export_macro () << " CORBA::Boolean"
<< " operator>>= (const CORBA::Any &, "
+ << node->name () << " *&); // deprecated\n";
+ *os << idl_global->stub_export_macro () << " CORBA::Boolean"
+ << " operator>>= (const CORBA::Any &, const "
<< node->name () << " *&);\n";
node->cli_hdr_any_op_gen (1);
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 a1a8125bb97..47cd0921ec4 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
@@ -95,7 +95,11 @@ be_visitor_sequence_any_op_cs::visit_sequence (be_sequence *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
+ << "_tao_elem = 0;" << be_nl
+ << "return 0;" << be_uidt_nl
+ << "}" << be_uidt_nl
<< "ACE_TRY_CHECK;" << be_nl
<< "if (_tao_any.any_owns_data ())" << be_nl
<< "{" << be_idt_nl
@@ -121,16 +125,72 @@ be_visitor_sequence_any_op_cs::visit_sequence (be_sequence *node)
<< "}" << be_nl
<< "else" << be_nl // decode failed
<< "{" << be_idt_nl
- << "delete _tao_elem;" << be_uidt_nl
+ << "delete _tao_elem;" << be_nl
+ << "_tao_elem = 0;" << be_uidt_nl
+ << "}" << be_uidt_nl
+ << "}" << be_uidt_nl
+ << "}" << be_nl
+ << "ACE_CATCHANY" << be_nl
+ << "{" << be_idt_nl
+ << "delete _tao_elem;" << be_nl
+ << "_tao_elem = 0;" << be_nl
+ << "return 0;" << be_uidt_nl
+ << "}" << be_nl
+ << "ACE_ENDTRY;" << be_nl
+ << "_tao_elem = 0;" << be_nl
+ << "return 0;" << be_uidt_nl
+ << "}\n\n";
+
+ *os << "CORBA::Boolean operator>>= (const CORBA::Any &_tao_any, const "
+ << node->name () << " *&_tao_elem)" << be_nl
+ << "{" << be_idt_nl
+ << "ACE_TRY_NEW_ENV" << be_nl
+ << "{" << be_idt_nl
+ << "CORBA::TypeCode_var type = _tao_any.type ();" << be_nl
+ << "if (!type->equivalent (" << node->tc_name ()
+ << ", ACE_TRY_ENV)) // not equal" << be_idt_nl
+ << "{" << be_idt_nl
+ << "_tao_elem = 0;" << be_nl
+ << "return 0;" << be_uidt_nl
+ << "}" << be_uidt_nl
+ << "ACE_TRY_CHECK;" << be_nl
+ << "if (_tao_any.any_owns_data ())" << be_nl
+ << "{" << be_idt_nl
+ << "_tao_elem = (" << node->name () << " *)_tao_any.value ();"
+ << be_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 (_tao_any._tao_get_cdr ());"
+ << be_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
+ << "ACE_TRY_CHECK;" << be_nl
+ << "return 1;" << be_uidt_nl
+ << "}" << be_nl
+ << "else" << be_nl // decode failed
+ << "{" << be_idt_nl
+ << "delete _tao_elem;" << be_nl
+ << "_tao_elem = 0;" << be_uidt_nl
<< "}" << be_uidt_nl
<< "}" << be_uidt_nl
<< "}" << be_nl
<< "ACE_CATCHANY" << be_nl
<< "{" << be_idt_nl
<< "delete _tao_elem;" << be_nl
+ << "_tao_elem = 0;" << be_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_ch.cpp b/TAO/TAO_IDL/be/be_visitor_structure/any_op_ch.cpp
index 38cb0e10549..77311da083d 100644
--- a/TAO/TAO_IDL/be/be_visitor_structure/any_op_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_structure/any_op_ch.cpp
@@ -59,6 +59,9 @@ be_visitor_structure_any_op_ch::visit_structure (be_structure *node)
<< "*); // noncopying version" << be_nl;
*os << idl_global->stub_export_macro () << " CORBA::Boolean"
<< " operator>>= (const CORBA::Any &, "
+ << node->name () << " *&); // deprecated\n";
+ *os << idl_global->stub_export_macro () << " CORBA::Boolean"
+ << " operator>>= (const CORBA::Any &, const "
<< node->name () << " *&);\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 9f5533b0264..6f78e77f1f4 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
@@ -92,7 +92,11 @@ be_visitor_structure_any_op_cs::visit_structure (be_structure *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
+ << "_tao_elem = 0;" << be_nl
+ << "return 0;" << be_uidt_nl
+ << "}" << be_uidt_nl
<< "ACE_TRY_CHECK;" << be_nl
<< "if (_tao_any.any_owns_data ())" << be_nl
<< "{" << be_idt_nl
@@ -117,19 +121,73 @@ be_visitor_structure_any_op_cs::visit_structure (be_structure *node)
<< "}" << be_nl
<< "else" << be_nl
<< "{" << be_idt_nl
- << "delete _tao_elem;" << be_uidt_nl
+ << "delete _tao_elem;" << be_nl
+ << "_tao_elem = 0;" << be_uidt_nl
<< "}" << be_uidt_nl
<< "}" << be_uidt_nl
<< "}" << be_nl
<< "ACE_CATCHANY" << be_nl
<< "{" << be_idt_nl
<< "delete _tao_elem;" << be_nl
+ << "_tao_elem = 0;" << be_nl
<< "return 0; " << be_uidt_nl
<< "}" << be_nl
<< "ACE_ENDTRY;" << be_nl
+ << "_tao_elem = 0;" << be_nl
<< "return 0;" << be_uidt_nl
<< "}\n\n";
+ *os << "CORBA::Boolean operator>>= (const CORBA::Any &_tao_any, const "
+ << node->name () << " *&_tao_elem)" << be_nl
+ << "{" << be_idt_nl
+ << "ACE_TRY_NEW_ENV" << be_nl
+ << "{" << be_idt_nl
+ << "CORBA::TypeCode_var type = _tao_any.type ();" << be_nl
+ << "if (!type->equivalent (" << node->tc_name ()
+ << ", ACE_TRY_ENV)) // not equal" << be_idt_nl
+ << "{" << be_idt_nl
+ << "_tao_elem = 0;" << be_nl
+ << "return 0;" << be_uidt_nl
+ << "}" << be_uidt_nl
+ << "ACE_TRY_CHECK;" << be_nl
+ << "if (_tao_any.any_owns_data ())" << be_nl
+ << "{" << be_idt_nl
+ << "_tao_elem = (" << node->name () << " *)_tao_any.value ();"
+ << be_nl
+ << "return 1;" << be_nl
+ << "}" << be_uidt_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 (_tao_any._tao_get_cdr ());"
+ << be_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
+ << "ACE_TRY_CHECK;" << be_nl
+ << "return 1;" << be_uidt_nl
+ << "}" << be_nl
+ << "else" << be_nl
+ << "{" << be_idt_nl
+ << "delete (" << node->name () << " *)_tao_elem;" << be_nl
+ << "_tao_elem = 0;" << be_uidt_nl
+ << "}" << be_uidt_nl
+ << "}" << be_uidt_nl
+ << "}" << be_nl
+ << "ACE_CATCHANY" << be_nl
+ << "{" << be_idt_nl
+ << "delete (" << node->name () << " *)_tao_elem;" << be_nl
+ << "_tao_elem = 0;" << be_nl
+ << "return 0; " << be_uidt_nl
+ << "}" << be_nl
+ << "ACE_ENDTRY;" << be_nl
+ << "_tao_elem = 0;" << be_nl
+ << "return 0;" << be_uidt_nl
+ << "}\n\n";
// all we have to do is to visit the scope and generate code
if (this->visit_scope (node) == -1)
diff --git a/TAO/TAO_IDL/be/be_visitor_union/any_op_ch.cpp b/TAO/TAO_IDL/be/be_visitor_union/any_op_ch.cpp
index 5c7d3656e72..b2ead4bea61 100644
--- a/TAO/TAO_IDL/be/be_visitor_union/any_op_ch.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_union/any_op_ch.cpp
@@ -59,6 +59,9 @@ be_visitor_union_any_op_ch::visit_union (be_union *node)
<< "*); // noncopying version" << be_nl;
*os << idl_global->stub_export_macro () << " CORBA::Boolean"
<< " operator>>= (const CORBA::Any &, "
+ << node->name () << " *&); // deprecated\n";
+ *os << idl_global->stub_export_macro () << " CORBA::Boolean"
+ << " operator>>= (const CORBA::Any &, const "
<< node->name () << " *&);\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 ef0c0b1ec06..2e42074c48d 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
@@ -99,8 +99,11 @@ be_visitor_union_any_op_cs::visit_union (be_union *node)
<< "{" << be_idt_nl
<< "CORBA::TypeCode_var type = _tao_any.type ();" << be_nl
<< "if (!type->equivalent (" << node->tc_name ()
- << ", ACE_TRY_ENV))" << be_idt_nl
+ << ", ACE_TRY_ENV)) // not equal" << be_idt_nl
+ << "{" << be_idt_nl
+ << "_tao_elem = 0;" << be_nl
<< "return 0;" << be_uidt_nl
+ << "}" << be_uidt_nl
<< "ACE_TRY_CHECK;" << be_nl
<< "if (_tao_any.any_owns_data ())" << be_nl
<< "{" << be_idt_nl
@@ -123,12 +126,55 @@ be_visitor_union_any_op_cs::visit_union (be_union *node)
<< "}" << be_nl
<< "ACE_CATCHANY" << be_nl
<< "{" << be_idt_nl
- << "delete _tao_elem;" << be_uidt_nl
+ << "delete _tao_elem;" << be_nl
+ << "_tao_elem = 0;" << be_uidt_nl
<< "}" << be_nl
<< "ACE_ENDTRY;" << be_nl
<< "return 0;" << be_uidt_nl
<< "}\n\n";
+ *os << "CORBA::Boolean operator>>= (" << be_idt << be_idt_nl
+ << "const CORBA::Any &_tao_any, const " << be_nl
+ << node->name () << " *&_tao_elem" << be_uidt_nl
+ << ")" << be_uidt_nl
+ << "{" << be_idt_nl
+ << "ACE_TRY_NEW_ENV" << be_nl
+ << "{" << be_idt_nl
+ << "CORBA::TypeCode_var type = _tao_any.type ();" << be_nl
+ << "if (!type->equivalent (" << node->tc_name ()
+ << ", ACE_TRY_ENV)) // not equal" << be_idt_nl
+ << "{" << be_idt_nl
+ << "_tao_elem = 0;" << be_nl
+ << "return 0;" << be_uidt_nl
+ << "}" << be_uidt_nl
+ << "ACE_TRY_CHECK;" << be_nl
+ << "if (_tao_any.any_owns_data ())" << be_nl
+ << "{" << be_idt_nl
+ << "_tao_elem = (" << node->name () << " *)_tao_any.value ();"
+ << be_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 (_tao_any._tao_get_cdr ());" << be_nl;
+
+ if (this->gen_const_extraction (os, node) != 0)
+ return -1;
+
+ *os << be_nl
+ << "return 1;" << be_uidt_nl
+ << "}" << be_uidt_nl
+ << "}" << 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_nl
+ << "return 0;" << be_uidt_nl
+ << "}\n\n";
// all we have to do is to visit the scope and generate code
if (this->visit_scope (node) == -1)
@@ -229,6 +275,22 @@ gen_extraction (TAO_OutStream *os,
return 0;
}
+int
+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
+ << 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 0;
+}
+
// ****************************************************************
be_visitor_union_any_op_interpretive_cs::
@@ -274,3 +336,13 @@ gen_extraction (TAO_OutStream *os,
<< "}";
return 0;
}
+
+int
+be_visitor_union_any_op_interpretive_cs::
+gen_const_extraction (TAO_OutStream *os,
+ be_union *node)
+{
+ return this->gen_extraction (os,
+ node);
+}
+
diff --git a/TAO/TAO_IDL/be_include/be_visitor_union/any_op_cs.h b/TAO/TAO_IDL/be_include/be_visitor_union/any_op_cs.h
index 05e6192d346..630fae55433 100644
--- a/TAO/TAO_IDL/be_include/be_visitor_union/any_op_cs.h
+++ b/TAO/TAO_IDL/be_include/be_visitor_union/any_op_cs.h
@@ -51,6 +51,8 @@ public:
be_union *node) = 0;
virtual int gen_extraction (TAO_OutStream* os,
be_union *node) = 0;
+ virtual int gen_const_extraction (TAO_OutStream *os,
+ be_union *node) = 0;
// = The be_visitor methods.
virtual int visit_union (be_union *node);
@@ -73,12 +75,14 @@ public:
// constructor
// = See be_visitor_union_any_op_cs
- virtual int gen_insertion (TAO_OutStream* os,
+ virtual int gen_insertion (TAO_OutStream *os,
be_union *node);
- virtual int gen_insertion_nocopy (TAO_OutStream* os,
+ virtual int gen_insertion_nocopy (TAO_OutStream *os,
be_union *node);
- virtual int gen_extraction (TAO_OutStream* os,
+ virtual int gen_extraction (TAO_OutStream *os,
be_union *node);
+ virtual int gen_const_extraction (TAO_OutStream *os,
+ be_union *node);
};
class be_visitor_union_any_op_interpretive_cs : public be_visitor_union_any_op_cs
@@ -103,6 +107,8 @@ public:
be_union *node);
virtual int gen_extraction (TAO_OutStream* os,
be_union *node);
+ virtual int gen_const_extraction (TAO_OutStream *os,
+ be_union *node);
};
#endif /* _BE_VISITOR_UNION_ANY_OP_CS_H_ */