summaryrefslogtreecommitdiff
path: root/TAO
diff options
context:
space:
mode:
authorgokhale <gokhale@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1998-06-09 14:23:48 +0000
committergokhale <gokhale@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1998-06-09 14:23:48 +0000
commit88957da9d2c026e303706dc27d03f5d3a53c839e (patch)
tree28ad635bf547c38b6fd84a021d8288f9a6fb7841 /TAO
parentc7bf789861a3521b204844bade22005cad19bdd0 (diff)
downloadATCD-88957da9d2c026e303706dc27d03f5d3a53c839e.tar.gz
*** empty log message ***
Diffstat (limited to 'TAO')
-rw-r--r--TAO/ChangeLog-98c36
-rw-r--r--TAO/TAO_IDL/be/be_interpretive.cpp2
-rw-r--r--TAO/TAO_IDL/be/be_visitor_args.cpp359
-rw-r--r--TAO/TAO_IDL/be/be_visitor_enum.cpp6
-rw-r--r--TAO/TAO_IDL/be/be_visitor_exception.cpp9
-rw-r--r--TAO/TAO_IDL/be/be_visitor_interface.cpp13
-rw-r--r--TAO/TAO_IDL/be/be_visitor_operation.cpp52
-rw-r--r--TAO/TAO_IDL/be/be_visitor_sequence.cpp9
-rw-r--r--TAO/TAO_IDL/be/be_visitor_structure.cpp9
-rw-r--r--TAO/TAO_IDL/be/be_visitor_union.cpp9
-rw-r--r--TAO/TAO_IDL/be_include/be_codegen.h4
-rw-r--r--TAO/TAO_IDL/be_include/be_visitor_args.h32
12 files changed, 455 insertions, 85 deletions
diff --git a/TAO/ChangeLog-98c b/TAO/ChangeLog-98c
index 1b8aee79707..e9cbb25a349 100644
--- a/TAO/ChangeLog-98c
+++ b/TAO/ChangeLog-98c
@@ -1,3 +1,39 @@
+Tue Jun 9 08:53:30 1998 Aniruddha Gokhale <gokhale@mambo.cs.wustl.edu>
+
+ * TAO_IDL/be_include/be_codegen.h: Added two states (but no new
+ visitors) for argument passing to the upcall for the collocated
+ case. This was necessary since in this case, the argument is
+ passed as it is. In the skeleton case, we may have _var variables,
+ and hence we may have to pass the .in () or .inout () of those
+ _var variables.
+
+ * TAO_IDL/be/{be_visitor_enum, be_visitor_exception,
+ be_visitor_interface, be_visitor_sequence, be_visitor_structure,
+ be_visitor_typedef, be_visitor_union}.cpp:
+
+ Once again, due to the compulsions of the MSVC++ compiler and the
+ DLLs, we require the export/import macros for all the <<= and >>=
+ operators so that they are visible outside.
+
+ * TAO_IDL/be/be_visitor_args.cpp:
+ TAO_IDL/be_include/be_visitor_args.cpp (be_visitor_upcall_ss):
+
+ We were using _var variables to make sure that allocated memory
+ was released after the marshaling is done and the skeleton has
+ returned. However, for objrefs and strings, we ended up passing
+ the .in () values of these _var parameters. The expected value was
+ a pointer to the in () value. This is now corrected.
+
+ Also dealt with the collocated case, where we simply pass the
+ argument from the parameter list to the upcall as it is.
+
+ Due to these two differences, we had to add a bunch of visit_*
+ methods to the upcall_ss visitor.
+
+ * TAO_IDL/be/be_visitor_operation.cpp: The same reasoning (case 1)
+ given for be_visitor_args.cpp holds here too for the return value
+ case.
+
1998-06-08 Torben Worm <tworm@cumbia.cs.wustl.edu>
* Updated orbsvcs/tests/Concurrency/CC_command.cpp because of an
diff --git a/TAO/TAO_IDL/be/be_interpretive.cpp b/TAO/TAO_IDL/be/be_interpretive.cpp
index e45d1817853..346c4b5e039 100644
--- a/TAO/TAO_IDL/be/be_interpretive.cpp
+++ b/TAO/TAO_IDL/be/be_interpretive.cpp
@@ -266,6 +266,7 @@ TAO_Interpretive_Visitor_Factory::make_visitor (be_visitor_context *ctx)
case TAO_CodeGen::TAO_OPERATION_ARG_POST_DOCALL_CS:
case TAO_CodeGen::TAO_OPERATION_ARG_PRE_UPCALL_SS:
case TAO_CodeGen::TAO_OPERATION_ARG_UPCALL_SS:
+ case TAO_CodeGen::TAO_OPERATION_COLLOCATED_ARG_UPCALL_SS:
case TAO_CodeGen::TAO_OPERATION_ARG_POST_UPCALL_SS:
case TAO_CodeGen::TAO_OPERATION_ARG_DECL_SS:
case TAO_CodeGen::TAO_OPERATION_ARG_DEMARSHAL_SS:
@@ -291,6 +292,7 @@ TAO_Interpretive_Visitor_Factory::make_visitor (be_visitor_context *ctx)
case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS:
return new be_visitor_args_pre_upcall_ss (new_ctx);
case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS:
+ case TAO_CodeGen::TAO_ARGUMENT_COLLOCATED_UPCALL_SS:
return new be_visitor_args_upcall_ss (new_ctx);
case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS:
return new be_visitor_args_post_upcall_ss (new_ctx);
diff --git a/TAO/TAO_IDL/be/be_visitor_args.cpp b/TAO/TAO_IDL/be/be_visitor_args.cpp
index 13ae621228c..55abdb3057e 100644
--- a/TAO/TAO_IDL/be/be_visitor_args.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_args.cpp
@@ -1202,8 +1202,10 @@ int be_visitor_args_vardecl_ss::visit_array (be_array *node)
{
*os << bt->name () << "_var _tao_var_"
<< arg->local_name () << ";" << be_nl;
+ *os << bt->name () << " *&_tao_ptr_" << arg->local_name ()
+ << " = _tao_var_" << arg->local_name () << ".out ();" << be_nl;
*os << bt->name () << "_out " << arg->local_name ()
- << " (_tao_var_" << arg->local_name () << ".out ());\n";
+ << " (_tao_ptr_" << arg->local_name () << ");\n";
}
else
*os << bt->name () << " " << arg->local_name () << ";\n";
@@ -1253,15 +1255,18 @@ int be_visitor_args_vardecl_ss::visit_interface (be_interface *node)
case AST_Argument::dir_IN:
case AST_Argument::dir_INOUT:
os->indent ();
- *os << bt->name () << "_ptr " << arg->local_name () << ";" << be_nl;
- *os << "CORBA::Object_ptr _tao_base_" << arg->local_name () << ";\n";
+ *os << bt->name () << "_var " << arg->local_name () << ";" << be_nl;
+ *os << "CORBA::Object_var _tao_base_var_" << arg->local_name ()
+ << ";" << be_nl;
+ *os << "CORBA::Object_ptr &_tao_base_ptr_" << arg->local_name ()
+ << " = _tao_base_var_" << arg->local_name () << ".out ();\n";
break;
case AST_Argument::dir_OUT:
os->indent ();
- *os << "CORBA::Object_ptr _tao_base_"
- << arg->local_name () << ";" << be_nl;
*os << bt->name () << "_var _tao_var_"
<< arg->local_name () << ";" << be_nl;
+ *os << "CORBA::Object_ptr _tao_base_ptr_"
+ << arg->local_name () << ";" << be_nl;
*os << bt->name () << "_out " << arg->local_name ()
<< " (_tao_var_" << arg->local_name () << ".out ());\n";
break;
@@ -1286,15 +1291,18 @@ int be_visitor_args_vardecl_ss::visit_interface_fwd (be_interface_fwd *node)
case AST_Argument::dir_IN:
case AST_Argument::dir_INOUT:
os->indent ();
- *os << bt->name () << "_ptr " << arg->local_name () << ";" << be_nl;
- *os << "CORBA::Object_ptr _tao_base_" << arg->local_name () << ";\n";
+ *os << bt->name () << "_var " << arg->local_name () << ";" << be_nl;
+ *os << "CORBA::Object_var _tao_base_var_" << arg->local_name ()
+ << ";" << be_nl;
+ *os << "CORBA::Object_ptr &_tao_base_ptr_" << arg->local_name ()
+ << " = _tao_base_var_" << arg->local_name () << ".out ();\n";
break;
case AST_Argument::dir_OUT:
os->indent ();
- *os << "CORBA::Object_ptr _tao_base_"
- << arg->local_name () << ";" << be_nl;
*os << bt->name () << "_var _tao_var_"
<< arg->local_name () << ";" << be_nl;
+ *os << "CORBA::Object_ptr _tao_base_ptr_"
+ << arg->local_name () << ";" << be_nl;
*os << bt->name () << "_out " << arg->local_name ()
<< " (_tao_var_" << arg->local_name () << ".out ());\n";
break;
@@ -1328,8 +1336,10 @@ int be_visitor_args_vardecl_ss::visit_predefined_type (be_predefined_type *node)
os->indent ();
*os << bt->name () << "_var _tao_var_"
<< arg->local_name () << ";" << be_nl;
+ *os << bt->name () << "_ptr &_tao_ptr_" << arg->local_name ()
+ << " = _tao_var_" << arg->local_name () << ".out ();" << be_nl;
*os << bt->name () << "_out " << arg->local_name ()
- << " (_tao_var_" << arg->local_name () << ".out ());\n";
+ << " (_tao_ptr_" << arg->local_name () << ");\n";
break;
} // end switch direction
} // end of if
@@ -1340,14 +1350,19 @@ int be_visitor_args_vardecl_ss::visit_predefined_type (be_predefined_type *node)
case AST_Argument::dir_IN:
case AST_Argument::dir_INOUT:
os->indent ();
- *os << bt->name () << "_ptr " << arg->local_name () << ";\n";
+ *os << bt->name () << "_var " << arg->local_name ()
+ << ";" << be_nl;
+ *os << bt->name () << "_ptr &_tao_ptr_" << arg->local_name ()
+ << " = " << arg->local_name () << ".out ();\n";
break;
case AST_Argument::dir_OUT:
os->indent ();
*os << bt->name () << "_var _tao_var_"
<< arg->local_name () << ";" << be_nl;
+ *os << bt->name () << "_ptr _tao_ptr_" << arg->local_name ()
+ << ";" << be_nl;
*os << bt->name () << "_out " << arg->local_name ()
- << " (_tao_var_" << arg->local_name () << ".out ());\n";
+ << " (_tao_var_" << arg->local_name () << ".out ());" << be_nl;
break;
} // end switch direction
} // end else if
@@ -1390,8 +1405,10 @@ int be_visitor_args_vardecl_ss::visit_sequence (be_sequence *node)
os->indent ();
*os << bt->name () << "_var _tao_var_"
<< arg->local_name () << ";" << be_nl;
+ *os << bt->name () << " *&_tao_ptr_" << arg->local_name ()
+ << " = _tao_var_" << arg->local_name () << ".out ();" << be_nl;
*os << bt->name () << "_out " << arg->local_name ()
- << " (_tao_var_" << arg->local_name () << ".out () );\n";
+ << " (_tao_ptr_" << arg->local_name () << ");\n";
break;
}
return 0;
@@ -1414,8 +1431,10 @@ int be_visitor_args_vardecl_ss::visit_string (be_string *)
os->indent ();
*os << "CORBA::String_var _tao_var_"
<< arg->local_name () << ";" << be_nl;
+ *os << "char *&_tao_ptr_" << arg->local_name () << " = _tao_var_"
+ << arg->local_name () << ".out ();" << be_nl;
*os << "CORBA::String_out " << arg->local_name ()
- << " (_tao_var_" << arg->local_name () << ".out ());\n";
+ << " (_tao_ptr_" << arg->local_name () << ");\n";
break;
}
return 0;
@@ -1447,8 +1466,10 @@ int be_visitor_args_vardecl_ss::visit_structure (be_structure *node)
{
*os << bt->name () << "_var _tao_var_"
<< arg->local_name () << ";" << be_nl;
+ *os << bt->name () << " *&_tao_ptr_" << arg->local_name ()
+ << " = _tao_var_" << arg->local_name () << ".out ();" << be_nl;
*os << bt->name () << "_out " << arg->local_name ()
- << " (_tao_var_" << arg->local_name () << ".out ());\n";
+ << " (_tao_ptr_" << arg->local_name () << ");\n";
}
else
*os << bt->name () << " " << arg->local_name () << ";\n";
@@ -1483,8 +1504,10 @@ int be_visitor_args_vardecl_ss::visit_union (be_union *node)
{
*os << bt->name () << "_var _tao_var_"
<< arg->local_name () << ";" << be_nl;
+ *os << bt->name () << " *&_tao_ptr_" << arg->local_name ()
+ << " = _tao_var_" << arg->local_name () << ".out ();" << be_nl;
*os << bt->name () << "_out " << arg->local_name ()
- << " (_tao_var_" << arg->local_name () << ". ptr());\n";
+ << " (_tao_ptr_" << arg->local_name () << ");\n";
}
else
*os << bt->name () << " " << arg->local_name () << ";\n";
@@ -1601,7 +1624,7 @@ int be_visitor_args_marshal_ss::visit_interface (be_interface *)
case AST_Argument::dir_INOUT:
case AST_Argument::dir_OUT:
os->indent ();
- *os << "&_tao_base_" << arg->local_name ();
+ *os << "&_tao_base_ptr_" << arg->local_name ();
break;
}
return 0;
@@ -1618,7 +1641,7 @@ int be_visitor_args_marshal_ss::visit_interface_fwd (be_interface_fwd *)
case AST_Argument::dir_INOUT:
case AST_Argument::dir_OUT:
os->indent ();
- *os << "&_tao_base_" << arg->local_name ();
+ *os << "&_tao_base_ptr_" << arg->local_name ();
break;
}
return 0;
@@ -1642,7 +1665,7 @@ int be_visitor_args_marshal_ss::visit_predefined_type (be_predefined_type *node)
break;
case AST_Argument::dir_OUT:
os->indent ();
- *os << "&" << arg->local_name () << ".ptr ()";
+ *os << "_tao_ptr_" << arg->local_name ();
break;
} // end switch direction
} // end of if
@@ -1652,12 +1675,9 @@ int be_visitor_args_marshal_ss::visit_predefined_type (be_predefined_type *node)
{
case AST_Argument::dir_IN:
case AST_Argument::dir_INOUT:
- os->indent ();
- *os << "&" << arg->local_name ();
- break;
case AST_Argument::dir_OUT:
os->indent ();
- *os << "_tao_var_" << arg->local_name () << ".ptr ()";
+ *os << "&_tao_ptr_" << arg->local_name ();
break;
} // end switch direction
} // end else if
@@ -1692,7 +1712,7 @@ int be_visitor_args_marshal_ss::visit_sequence (be_sequence *)
break;
case AST_Argument::dir_OUT:
os->indent ();
- *os << "_tao_var_" << arg->local_name () << ".ptr ()";
+ *os << "_tao_ptr_" << arg->local_name ();
break;
}
return 0;
@@ -1713,7 +1733,7 @@ int be_visitor_args_marshal_ss::visit_string (be_string *)
break;
case AST_Argument::dir_OUT:
os->indent ();
- *os << "&" << arg->local_name () << ".ptr ()";
+ *os << "&_tao_ptr_" << arg->local_name ();
break;
}
return 0;
@@ -1735,7 +1755,7 @@ int be_visitor_args_marshal_ss::visit_structure (be_structure *node)
case AST_Argument::dir_OUT:
os->indent ();
if (node->size_type () == be_type::VARIABLE)
- *os << "_tao_var_" << arg->local_name () << ".ptr ()";
+ *os << "_tao_ptr_" << arg->local_name ();
else
*os << "&" << arg->local_name ();
break;
@@ -1759,7 +1779,7 @@ int be_visitor_args_marshal_ss::visit_union (be_union *node)
case AST_Argument::dir_OUT:
os->indent ();
if (node->size_type () == be_type::VARIABLE)
- *os << "_tao_var_" << arg->local_name () << ".ptr ()";
+ *os << "_tao_ptr_" << arg->local_name ();
else
*os << "&" << arg->local_name ();
break;
@@ -1870,8 +1890,8 @@ int be_visitor_args_pre_upcall_ss::visit_interface (be_interface *node)
case AST_Argument::dir_INOUT: // inout
os->indent ();
*os << arg->local_name () << " = " << node->name ()
- << "::_narrow (_tao_base_" << arg->local_name ()
- << ", _tao_environment);\n";
+ << "::_narrow (_tao_base_var_" << arg->local_name ()
+ << ".in (), _tao_environment);\n";
break;
case AST_Argument::dir_OUT:
break;
@@ -1891,8 +1911,8 @@ int be_visitor_args_pre_upcall_ss::visit_interface_fwd (be_interface_fwd *node)
case AST_Argument::dir_INOUT: // inout
os->indent ();
*os << arg->local_name () << " = " << node->name ()
- << "::_narrow (_tao_base_" << arg->local_name ()
- << "_tao_environment);\n";
+ << "::_narrow (_tao_base_var_" << arg->local_name ()
+ << ".in (), _tao_environment);\n";
break;
case AST_Argument::dir_OUT:
break;
@@ -2042,17 +2062,268 @@ int be_visitor_args_upcall_ss::visit_argument (be_argument *node)
TAO_OutStream *os = this->ctx_->stream (); // get output stream
this->ctx_->node (node); // save the argument node
- switch (node->direction ())
+ // retrieve the type
+ be_type *bt = be_type::narrow_from_decl (node->field_type ());
+ if (!bt)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "be_visitor_args_upcall_ss::"
+ "visit_argument - "
+ "Bad argument type\n"),
+ -1);
+ }
+
+ // Different types have different mappings when used as in/out or
+ // inout parameters. Let this visitor deal with the type
+
+ if (bt->accept (this) == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "be_visitor_args_upcall_ss::"
+ "visit_argument - "
+ "cannot accept visitor\n"),
+ -1);
+ }
+
+ return 0;
+}
+
+int be_visitor_args_upcall_ss::visit_array (be_array *node)
+{
+ TAO_OutStream *os = this->ctx_->stream (); // get output stream
+ be_argument *arg = this->ctx_->be_node_as_argument (); // get the argument
+ // node
+
+ os->indent ();
+ switch (this->direction ())
{
case AST_Argument::dir_IN:
case AST_Argument::dir_INOUT:
case AST_Argument::dir_OUT:
- os->indent ();
- *os << node->local_name ();
+ *os << arg->local_name ();
+ break;
+ }
+ return 0;
+}
+
+int be_visitor_args_upcall_ss::visit_enum (be_enum *node)
+{
+ TAO_OutStream *os = this->ctx_->stream (); // get output stream
+ be_argument *arg = this->ctx_->be_node_as_argument (); // get the argument
+ // node
+
+ os->indent ();
+ switch (this->direction ())
+ {
+ case AST_Argument::dir_IN:
+ case AST_Argument::dir_INOUT:
+ case AST_Argument::dir_OUT:
+ *os << arg->local_name ();
break;
}
return 0;
+}
+int be_visitor_args_upcall_ss::visit_interface (be_interface *node)
+{
+ TAO_OutStream *os = this->ctx_->stream (); // get output stream
+ be_argument *arg = this->ctx_->be_node_as_argument (); // get the argument
+ // node
+ os->indent ();
+ switch (this->direction ())
+ {
+ case AST_Argument::dir_IN:
+ if (this->ctx_->state ()
+ == TAO_CodeGen::TAO_ARGUMENT_COLLOCATED_UPCALL_SS)
+ *os << arg->local_name ();
+ else
+ *os << arg->local_name () << ".in ()";
+ break;
+ case AST_Argument::dir_INOUT:
+ if (this->ctx_->state ()
+ == TAO_CodeGen::TAO_ARGUMENT_COLLOCATED_UPCALL_SS)
+ *os << arg->local_name ();
+ else
+ *os << arg->local_name () << ".inout ()";
+ break;
+ case AST_Argument::dir_OUT:
+ *os << arg->local_name ();
+ break;
+ }
+ return 0;
+}
+
+int be_visitor_args_upcall_ss::visit_interface_fwd (be_interface_fwd *node)
+{
+ TAO_OutStream *os = this->ctx_->stream (); // get output stream
+ be_argument *arg = this->ctx_->be_node_as_argument (); // get the argument
+ // node
+ os->indent ();
+ switch (this->direction ())
+ {
+ case AST_Argument::dir_IN:
+ if (this->ctx_->state ()
+ == TAO_CodeGen::TAO_ARGUMENT_COLLOCATED_UPCALL_SS)
+ *os << arg->local_name ();
+ else
+ *os << arg->local_name () << ".in ()";
+ break;
+ case AST_Argument::dir_INOUT:
+ if (this->ctx_->state ()
+ == TAO_CodeGen::TAO_ARGUMENT_COLLOCATED_UPCALL_SS)
+ *os << arg->local_name ();
+ else
+ *os << arg->local_name () << ".inout ()";
+ break;
+ case AST_Argument::dir_OUT:
+ *os << arg->local_name ();
+ break;
+ }
+ return 0;
+}
+
+int be_visitor_args_upcall_ss::visit_predefined_type (be_predefined_type *node)
+{
+ TAO_OutStream *os = this->ctx_->stream (); // get output stream
+ be_argument *arg = this->ctx_->be_node_as_argument (); // get the argument
+ // node
+
+ os->indent ();
+ // check if the type is an any
+ if (node->pt () == AST_PredefinedType::PT_any)
+ {
+ switch (this->direction ())
+ {
+ case AST_Argument::dir_IN:
+ case AST_Argument::dir_INOUT:
+ case AST_Argument::dir_OUT:
+ *os << arg->local_name ();
+ break;
+ } // end switch direction
+ } // end of if
+ else if (node->pt () == AST_PredefinedType::PT_pseudo) // e.g., CORBA::Object
+ {
+ switch (this->direction ())
+ {
+ case AST_Argument::dir_IN:
+ if (this->ctx_->state ()
+ == TAO_CodeGen::TAO_ARGUMENT_COLLOCATED_UPCALL_SS)
+ *os << arg->local_name ();
+ else
+ *os << arg->local_name () << ".in ()";
+ break;
+ case AST_Argument::dir_INOUT:
+ if (this->ctx_->state ()
+ == TAO_CodeGen::TAO_ARGUMENT_COLLOCATED_UPCALL_SS)
+ *os << arg->local_name ();
+ else
+ *os << arg->local_name () << ".inout ()";
+ break;
+ case AST_Argument::dir_OUT:
+ *os << arg->local_name ();
+ break;
+ } // end switch direction
+ } // end else if
+ else // simple predefined types
+ {
+ switch (this->direction ())
+ {
+ case AST_Argument::dir_IN:
+ case AST_Argument::dir_INOUT:
+ case AST_Argument::dir_OUT:
+ *os << arg->local_name ();
+ break;
+ } // end switch direction
+ } // end of else
+
+ return 0;
+}
+
+int be_visitor_args_upcall_ss::visit_sequence (be_sequence *node)
+{
+ TAO_OutStream *os = this->ctx_->stream (); // get the stream
+ be_argument *arg = this->ctx_->be_node_as_argument (); // get the argument
+ // node
+
+ os->indent ();
+ switch (this->direction ())
+ {
+ case AST_Argument::dir_IN:
+ case AST_Argument::dir_INOUT:
+ case AST_Argument::dir_OUT:
+ *os << arg->local_name ();
+ break;
+ }
+ return 0;
+}
+
+int be_visitor_args_upcall_ss::visit_string (be_string *)
+{
+ TAO_OutStream *os = this->ctx_->stream (); // get the stream
+ be_argument *arg = this->ctx_->be_node_as_argument (); // get the argument
+ // node
+
+ os->indent ();
+ switch (this->direction ())
+ {
+ case AST_Argument::dir_IN:
+ case AST_Argument::dir_INOUT:
+ case AST_Argument::dir_OUT:
+ *os << arg->local_name ();
+ break;
+ }
+ return 0;
+}
+
+int be_visitor_args_upcall_ss::visit_structure (be_structure *node)
+{
+ TAO_OutStream *os = this->ctx_->stream (); // get the stream
+ be_argument *arg = this->ctx_->be_node_as_argument (); // get the argument
+ // node
+
+ os->indent ();
+ switch (this->direction ())
+ {
+ case AST_Argument::dir_IN:
+ case AST_Argument::dir_INOUT:
+ case AST_Argument::dir_OUT:
+ *os << arg->local_name ();
+ break;
+ }
+ return 0;
+}
+
+int be_visitor_args_upcall_ss::visit_union (be_union *node)
+{
+ TAO_OutStream *os = this->ctx_->stream (); // get the stream
+ be_argument *arg = this->ctx_->be_node_as_argument (); // get the argument
+ // node
+
+ os->indent ();
+ switch (this->direction ())
+ {
+ case AST_Argument::dir_IN:
+ case AST_Argument::dir_INOUT:
+ case AST_Argument::dir_OUT:
+ *os << arg->local_name ();
+ break;
+ }
+ return 0;
+}
+
+int be_visitor_args_upcall_ss::visit_typedef (be_typedef *node)
+{
+ this->ctx_->alias (node);
+ if (node->primitive_base_type ()->accept (this) == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "be_visitor_args_upcall_ss::"
+ "visit_typedef - "
+ "accept on primitive type failed\n"),
+ -1);
+ }
+ this->ctx_->alias (0);
+ return 0;
}
// ************************************************************************
@@ -2142,14 +2413,12 @@ int be_visitor_args_post_upcall_ss::visit_interface (be_interface *node)
break;
case AST_Argument::dir_INOUT: // inout
os->indent ();
- *os << "CORBA::release (_tao_base_" << arg->local_name () << ");"
- << be_nl;
- *os << "_tao_base_" << arg->local_name ()
- << " = " << arg->local_name () << ";\n";
+ *os << "_tao_base_ptr_" << arg->local_name ()
+ << " = " << arg->local_name () << ".in ();\n";
break;
case AST_Argument::dir_OUT:
os->indent ();
- *os << "_tao_base_" << arg->local_name () << " = _tao_var_"
+ *os << "_tao_base_ptr_" << arg->local_name () << " = _tao_var_"
<< arg->local_name () << ".in ();\n";
break;
}
@@ -2167,14 +2436,12 @@ int be_visitor_args_post_upcall_ss::visit_interface_fwd (be_interface_fwd *node)
break;
case AST_Argument::dir_INOUT: // inout
os->indent ();
- *os << "CORBA::release (_tao_base_" << arg->local_name () << ");"
- << be_nl;
- *os << "_tao_base_" << arg->local_name () << " = " << arg->local_name ()
- << ";\n";
+ *os << "_tao_base_ptr_" << arg->local_name () << " = "
+ << arg->local_name () << ".in ();\n";
break;
case AST_Argument::dir_OUT:
os->indent ();
- *os << "_tao_base_" << arg->local_name () << " = _tao_var_"
+ *os << "_tao_base_ptr_" << arg->local_name () << " = _tao_var_"
<< arg->local_name () << ".in ();\n";
break;
}
@@ -2392,8 +2659,6 @@ int be_visitor_args_post_marshal_ss::visit_interface (be_interface *node)
case AST_Argument::dir_IN:
case AST_Argument::dir_INOUT: // inout
case AST_Argument::dir_OUT:
- os->indent ();
- *os << "CORBA::release (_tao_base_" << arg->local_name () << ");\n";
break;
}
return 0;
@@ -2410,8 +2675,6 @@ int be_visitor_args_post_marshal_ss::visit_interface_fwd (be_interface_fwd *node
case AST_Argument::dir_IN:
case AST_Argument::dir_INOUT: // inout
case AST_Argument::dir_OUT:
- os->indent ();
- *os << "CORBA::release (_tao_base_" << arg->local_name () << ");\n";
break;
}
return 0;
diff --git a/TAO/TAO_IDL/be/be_visitor_enum.cpp b/TAO/TAO_IDL/be/be_visitor_enum.cpp
index 4b2944dac17..a9ea5665410 100644
--- a/TAO/TAO_IDL/be/be_visitor_enum.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_enum.cpp
@@ -175,9 +175,11 @@ be_visitor_enum_any_op_ch::visit_enum (be_enum *node)
// generate the Any <<= and >>= operators
os->indent ();
- *os << "void operator<<= (CORBA::Any &, " << node->name ()
+ *os << "void " << idl_global->export_macro ()
+ << " operator<<= (CORBA::Any &, " << node->name ()
<< ");" << be_nl;
- *os << "CORBA::Boolean operator>>= (const CORBA::Any &, "
+ *os << "CORBA::Boolean " << idl_global->export_macro ()
+ << " operator>>= (const CORBA::Any &, "
<< node->name () << " &);\n";
node->cli_hdr_any_op_gen (1);
diff --git a/TAO/TAO_IDL/be/be_visitor_exception.cpp b/TAO/TAO_IDL/be/be_visitor_exception.cpp
index ca8fcd5b813..dc9bd2458cd 100644
--- a/TAO/TAO_IDL/be/be_visitor_exception.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_exception.cpp
@@ -1010,11 +1010,14 @@ be_visitor_exception_any_op_ch::visit_exception (be_exception *node)
// generate the Any <<= and >>= operator declarations
os->indent ();
- *os << "void operator<<= (CORBA::Any &, const " << node->name ()
+ *os << "void " << idl_global->export_macro ()
+ << " operator<<= (CORBA::Any &, const " << node->name ()
<< " &); // copying version" << be_nl;
- *os << "void operator<<= (CORBA::Any &, " << node->name ()
+ *os << "void " << idl_global->export_macro ()
+ << " operator<<= (CORBA::Any &, " << node->name ()
<< "*); // noncopying version" << be_nl;
- *os << "CORBA::Boolean operator>>= (const CORBA::Any &, "
+ *os << "CORBA::Boolean " << idl_global->export_macro ()
+ << " operator>>= (const CORBA::Any &, "
<< node->name () << " *&);\n";
diff --git a/TAO/TAO_IDL/be/be_visitor_interface.cpp b/TAO/TAO_IDL/be/be_visitor_interface.cpp
index 955c56937e6..a70e554e0d2 100644
--- a/TAO/TAO_IDL/be/be_visitor_interface.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_interface.cpp
@@ -1389,8 +1389,8 @@ be_visitor_interface_ss::visit_interface (be_interface *node)
<< "&_tao_value" << be_uidt_nl
<< ");" << be_nl;
*os << "if (_tao_environment.exception () != 0) return;" << be_nl;
- *os << "_tao_retval = _tao_impl->_is_a (_tao_value, _tao_skel_environment);"
- << be_nl;
+ *os << "_tao_retval = _tao_impl->_is_a (_tao_value, "
+ << "_tao_skel_environment);" << be_nl;
*os << "_tao_server_request.marshal (" << be_idt_nl
<< "_tao_environment, " << be_nl
<< "_tao_skel_environment," << be_nl
@@ -1901,11 +1901,14 @@ be_visitor_interface_any_op_ch::visit_interface (be_interface *node)
// generate the Any <<= and >>= operator declarations
os->indent ();
*os << "// Any operators for interface " << node->name () << be_nl;
- *os << "void operator<<= (CORBA::Any &, const " << node->name ()
+ *os << "void " << idl_global->export_macro ()
+ << " operator<<= (CORBA::Any &, const " << node->name ()
<< " &); // copying version" << be_nl;
- *os << "void operator<<= (CORBA::Any &, " << node->name ()
+ *os << "void " << idl_global->export_macro ()
+ << " operator<<= (CORBA::Any &, " << node->name ()
<< "*); // noncopying version" << be_nl;
- *os << "CORBA::Boolean operator>>= (const CORBA::Any &, "
+ *os << "CORBA::Boolean " << idl_global->export_macro ()
+ << " operator>>= (const CORBA::Any &, "
<< node->name () << " *&);\n";
// all we have to do is to visit the scope and generate code
diff --git a/TAO/TAO_IDL/be/be_visitor_operation.cpp b/TAO/TAO_IDL/be/be_visitor_operation.cpp
index 94b60e8711b..ade034dcf9f 100644
--- a/TAO/TAO_IDL/be/be_visitor_operation.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_operation.cpp
@@ -1351,7 +1351,7 @@ int be_visitor_operation_collocated_ss::visit_operation (be_operation *node)
*os << "this->servant_->" << node->local_name () << " (" << be_idt << "\n";
ctx = *this->ctx_;
- ctx.state (TAO_CodeGen::TAO_OPERATION_ARG_UPCALL_SS);
+ ctx.state (TAO_CodeGen::TAO_OPERATION_COLLOCATED_ARG_UPCALL_SS);
visitor = tao_cg->make_visitor (&ctx);
if (!visitor || (node->accept (visitor) == -1))
{
@@ -2448,7 +2448,8 @@ be_visitor_operation_rettype_vardecl_ss::visit_interface (be_interface *)
// address of the objref to the marshaling routine, we use the base
// CORBA::Object_ptr as the type for the return value even though the actual
// return type may be some derived class
- *os << "CORBA::Object_var _tao_retval = CORBA::Object::_nil ();\n";
+ *os << "CORBA::Object_var _tao_retval = CORBA::Object::_nil ();" << be_nl;
+ *os << "CORBA::Object_ptr &_tao_ptr_retval = _tao_retval.out ();\n";
return 0;
}
@@ -2463,7 +2464,8 @@ visit_interface_fwd (be_interface_fwd *)
// address of the objref to the marshaling routine, we use the base
// CORBA::Object_ptr as the type for the return value even though the actual
// return type may be some derived class
- *os << "CORBA::Object_var _tao_retval;\n";
+ *os << "CORBA::Object_var _tao_retval = CORBA::Object::_nil ();" << be_nl;
+ *os << "CORBA::Object_ptr &_tao_ptr_retval = _tao_retval.out ();\n";
return 0;
}
@@ -2483,11 +2485,13 @@ visit_predefined_type (be_predefined_type *node)
{
case AST_PredefinedType::PT_pseudo:
os->indent ();
- *os << bt->name () << "_var _tao_retval;\n";
+ *os << bt->name () << "_var _tao_retval;" << be_nl;
+ *os << bt->name () << "_ptr &_tao_ptr_retval = _tao_retval.out ();\n";
break;
case AST_PredefinedType::PT_any:
os->indent ();
- *os << bt->name () << "_var _tao_retval;\n";
+ *os << bt->name () << "_var _tao_retval;" << be_nl;
+ *os << bt->name () << "_ptr _tao_ptr_retval = _tao_retval.out ();\n";
break;
case AST_PredefinedType::PT_void:
break;
@@ -2513,7 +2517,8 @@ be_visitor_operation_rettype_vardecl_ss::visit_sequence (be_sequence *node)
bt = node;
os->indent ();
- *os << bt->name () << "_var _tao_retval;\n";
+ *os << bt->name () << "_var _tao_retval;" << be_nl;
+ *os << bt->name () << " *&_tao_ptr_retval = _tao_retval.out ();\n";
return 0;
}
@@ -2523,7 +2528,8 @@ be_visitor_operation_rettype_vardecl_ss::visit_string (be_string * /* node*/)
TAO_OutStream *os = this->ctx_->stream (); // grab the out stream
os->indent ();
- *os << "CORBA::String_var _tao_retval;\n";
+ *os << "CORBA::String_var _tao_retval = 0;" << be_nl;
+ *os << "char *&_tao_ptr_retval = _tao_retval.out ();\n";
return 0;
}
@@ -2542,7 +2548,10 @@ be_visitor_operation_rettype_vardecl_ss::visit_structure (be_structure *node)
// based on whether we are variable or not, we return a pointer or the
// aggregate type
if (node->size_type () == be_decl::VARIABLE)
- *os << bt->name () << "_var _tao_retval;\n";
+ {
+ *os << bt->name () << "_var _tao_retval;" << be_nl;
+ *os << bt->name () << " *&_tao_ptr_retval = _tao_retval.out ();\n";
+ }
else
*os << bt->name () << " _tao_retval;\n";
return 0;
@@ -2579,7 +2588,10 @@ be_visitor_operation_rettype_vardecl_ss::visit_union (be_union *node)
// based on whether we are variable or not, we return a pointer or the
// aggregate type
if (node->size_type () == be_decl::VARIABLE)
- *os << bt->name () << "_var _tao_retval;\n";
+ {
+ *os << bt->name () << "_var _tao_retval;" << be_nl;
+ *os << bt->name () << " *&_tao_ptr_retval = _tao_retval.out ();\n";
+ }
else
*os << bt->name () << " _tao_retval;\n";
return 0;
@@ -2606,7 +2618,7 @@ be_visitor_operation_rettype_marshal_ss::visit_array (be_array *)
TAO_OutStream *os = this->ctx_->stream (); // grab the out stream
os->indent ();
- *os << "_tao_retval.ptr ()";
+ *os << "_tao_ptr_retval";
return 0;
}
@@ -2627,7 +2639,7 @@ be_visitor_operation_rettype_marshal_ss::visit_interface (be_interface *)
TAO_OutStream *os = this->ctx_->stream (); // grab the out stream
os->indent ();
- *os << "_tao_retval.ptr ()";
+ *os << "&_tao_ptr_retval";
return 0;
}
@@ -2639,7 +2651,7 @@ visit_interface_fwd (be_interface_fwd *)
TAO_OutStream *os = this->ctx_->stream (); // grab the out stream
os->indent ();
- *os << "_tao_retval.ptr ()";
+ *os << "&_tao_ptr_retval";
return 0;
}
@@ -2658,11 +2670,11 @@ visit_predefined_type (be_predefined_type *node)
break;
case AST_PredefinedType::PT_pseudo:
os->indent ();
- *os << "_tao_retval.in ()";
+ *os << "&_tao_ptr_retval";
break;
case AST_PredefinedType::PT_any:
os->indent ();
- *os << "&_tao_retval.in ()";
+ *os << "_tao_ptr_retval";
break;
default:
os->indent ();
@@ -2678,7 +2690,7 @@ be_visitor_operation_rettype_marshal_ss::visit_sequence (be_sequence *)
TAO_OutStream *os = this->ctx_->stream (); // grab the out stream
os->indent ();
- *os << "_tao_retval.ptr ()";
+ *os << "_tao_ptr_retval";
return 0;
}
@@ -2689,7 +2701,7 @@ be_visitor_operation_rettype_marshal_ss::visit_string (be_string * /* node*/)
TAO_OutStream *os = this->ctx_->stream (); // grab the out stream
os->indent ();
- *os << "_tao_retval.in ()";
+ *os << "&_tao_ptr_retval";
return 0;
}
@@ -2701,7 +2713,7 @@ be_visitor_operation_rettype_marshal_ss::visit_structure (be_structure *node)
os->indent ();
if (node->size_type () == be_type::VARIABLE)
- *os << "_tao_retval.ptr ()";
+ *os << "_tao_ptr_retval";
else
*os << "&_tao_retval";
@@ -2731,7 +2743,7 @@ be_visitor_operation_rettype_marshal_ss::visit_union (be_union *node)
os->indent ();
if (node->size_type () == be_type::VARIABLE)
- *os << "_tao_retval.ptr ()";
+ *os << "_tao_ptr_retval";
else
*os << "&_tao_retval";
@@ -2984,6 +2996,7 @@ be_visitor_operation_argument::post_process (void)
{
case TAO_CodeGen::TAO_OPERATION_ARG_DOCALL_CS:
case TAO_CodeGen::TAO_OPERATION_ARG_UPCALL_SS:
+ case TAO_CodeGen::TAO_OPERATION_COLLOCATED_ARG_UPCALL_SS:
case TAO_CodeGen::TAO_OPERATION_ARG_DEMARSHAL_SS:
case TAO_CodeGen::TAO_OPERATION_ARG_MARSHAL_SS:
*os << ",\n";
@@ -3072,6 +3085,9 @@ be_visitor_operation_argument::visit_argument (be_argument *node)
case TAO_CodeGen::TAO_OPERATION_ARG_PRE_UPCALL_SS:
ctx.state (TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS);
break;
+ case TAO_CodeGen::TAO_OPERATION_COLLOCATED_ARG_UPCALL_SS:
+ ctx.state (TAO_CodeGen::TAO_ARGUMENT_COLLOCATED_UPCALL_SS);
+ break;
case TAO_CodeGen::TAO_OPERATION_ARG_UPCALL_SS:
ctx.state (TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS);
break;
diff --git a/TAO/TAO_IDL/be/be_visitor_sequence.cpp b/TAO/TAO_IDL/be/be_visitor_sequence.cpp
index 208274ceef1..dd13ee27f05 100644
--- a/TAO/TAO_IDL/be/be_visitor_sequence.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_sequence.cpp
@@ -1575,11 +1575,14 @@ be_visitor_sequence_any_op_ch::visit_sequence (be_sequence *node)
// generate the Any <<= and >>= operators
os->indent ();
- *os << "void operator<<= (CORBA::Any &, const " << node->name ()
+ *os << "void " << idl_global->export_macro ()
+ << " operator<<= (CORBA::Any &, const " << node->name ()
<< " &); // copying version" << be_nl;
- *os << "void operator<<= (CORBA::Any &, " << node->name ()
+ *os << "void " << idl_global->export_macro ()
+ << " operator<<= (CORBA::Any &, " << node->name ()
<< "*); // noncopying version" << be_nl;
- *os << "CORBA::Boolean operator>>= (const CORBA::Any &, "
+ *os << "CORBA::Boolean " << idl_global->export_macro ()
+ << " operator>>= (const CORBA::Any &, "
<< node->name () << " *&);\n";
node->cli_hdr_any_op_gen (1);
diff --git a/TAO/TAO_IDL/be/be_visitor_structure.cpp b/TAO/TAO_IDL/be/be_visitor_structure.cpp
index 6b20ba8c433..a988f291b24 100644
--- a/TAO/TAO_IDL/be/be_visitor_structure.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_structure.cpp
@@ -309,11 +309,14 @@ be_visitor_structure_any_op_ch::visit_structure (be_structure *node)
// generate the Any <<= and >>= operator declarations
os->indent ();
- *os << "void operator<<= (CORBA::Any &, const " << node->name ()
+ *os << "void " << idl_global->export_macro ()
+ << " operator<<= (CORBA::Any &, const " << node->name ()
<< " &); // copying version" << be_nl;
- *os << "void operator<<= (CORBA::Any &, " << node->name ()
+ *os << "void " << idl_global->export_macro ()
+ << " operator<<= (CORBA::Any &, " << node->name ()
<< "*); // noncopying version" << be_nl;
- *os << "CORBA::Boolean operator>>= (const CORBA::Any &, "
+ *os << "CORBA::Boolean " << idl_global->export_macro ()
+ << " operator>>= (const CORBA::Any &, "
<< node->name () << " *&);\n";
diff --git a/TAO/TAO_IDL/be/be_visitor_union.cpp b/TAO/TAO_IDL/be/be_visitor_union.cpp
index 13bdcc72fe8..9e7b6e43e08 100644
--- a/TAO/TAO_IDL/be/be_visitor_union.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_union.cpp
@@ -869,11 +869,14 @@ be_visitor_union_any_op_ch::visit_union (be_union *node)
// generate the Any <<= and >>= operator declarations
os->indent ();
- *os << "void operator<<= (CORBA::Any &, const " << node->name ()
+ *os << "void " << idl_global->export_macro ()
+ << " operator<<= (CORBA::Any &, const " << node->name ()
<< " &); // copying version" << be_nl;
- *os << "void operator<<= (CORBA::Any &, " << node->name ()
+ *os << "void " << idl_global->export_macro ()
+ << " operator<<= (CORBA::Any &, " << node->name ()
<< "*); // noncopying version" << be_nl;
- *os << "CORBA::Boolean operator>>= (const CORBA::Any &, "
+ *os << "CORBA::Boolean " << idl_global->export_macro ()
+ << " operator>>= (const CORBA::Any &, "
<< node->name () << " *&);\n";
diff --git a/TAO/TAO_IDL/be_include/be_codegen.h b/TAO/TAO_IDL/be_include/be_codegen.h
index 97e4de413f3..aafbadc5ddc 100644
--- a/TAO/TAO_IDL/be_include/be_codegen.h
+++ b/TAO/TAO_IDL/be_include/be_codegen.h
@@ -74,6 +74,8 @@ public:
TAO_ARGUMENT_PRE_UPCALL_SS, // preprocessing of argument
// variable before upcall
TAO_ARGUMENT_UPCALL_SS, // passing argument variable to upcall
+ TAO_ARGUMENT_COLLOCATED_UPCALL_SS, // passing argument
+ // variable to upcall
TAO_ARGUMENT_POST_UPCALL_SS, // postprocessing of argument
// variable after upcall
@@ -236,6 +238,8 @@ public:
TAO_OPERATION_ARG_PRE_UPCALL_SS, // pre upcall processing
TAO_OPERATION_RETVAL_UPCALL_SS, // passing return type var and argument
TAO_OPERATION_ARG_UPCALL_SS, // variables to upcall
+ TAO_OPERATION_COLLOCATED_ARG_UPCALL_SS, // variables to upcall for
+ // collocated op
TAO_OPERATION_RETVAL_POST_UPCALL_SS, // post upcall processing for
TAO_OPERATION_ARG_POST_UPCALL_SS, // return and argument variables
TAO_OPERATION_RESULT_SS, // XXXASG rm?
diff --git a/TAO/TAO_IDL/be_include/be_visitor_args.h b/TAO/TAO_IDL/be_include/be_visitor_args.h
index 78ceb5b70b2..95772b59119 100644
--- a/TAO/TAO_IDL/be_include/be_visitor_args.h
+++ b/TAO/TAO_IDL/be_include/be_visitor_args.h
@@ -401,6 +401,38 @@ public:
virtual int visit_argument (be_argument *node);
// visit the argument node
+ // =visit all the nodes that can be the types for the argument
+
+ virtual int visit_array (be_array *node);
+ // visit array type
+
+ virtual int visit_enum (be_enum *node);
+ // visit the enum node
+
+ virtual int visit_interface (be_interface *node);
+ // visit interface
+
+ virtual int visit_interface_fwd (be_interface_fwd *node);
+ // visit interface forward
+
+ virtual int visit_predefined_type (be_predefined_type *node);
+ // visit predefined type
+
+ virtual int visit_sequence (be_sequence *node);
+ // visit sequence type
+
+ virtual int visit_string (be_string *node);
+ // visit string type
+
+ virtual int visit_structure (be_structure *node);
+ // visit structure type
+
+ virtual int visit_union (be_union *node);
+ // visit union type
+
+ virtual int visit_typedef (be_typedef *node);
+ // visit the typedef type
+
};
// ************************************************************