diff options
author | gokhale <gokhale@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1998-06-09 14:23:48 +0000 |
---|---|---|
committer | gokhale <gokhale@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 1998-06-09 14:23:48 +0000 |
commit | 88957da9d2c026e303706dc27d03f5d3a53c839e (patch) | |
tree | 28ad635bf547c38b6fd84a021d8288f9a6fb7841 /TAO | |
parent | c7bf789861a3521b204844bade22005cad19bdd0 (diff) | |
download | ATCD-88957da9d2c026e303706dc27d03f5d3a53c839e.tar.gz |
*** empty log message ***
Diffstat (limited to 'TAO')
-rw-r--r-- | TAO/ChangeLog-98c | 36 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_interpretive.cpp | 2 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_args.cpp | 359 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_enum.cpp | 6 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_exception.cpp | 9 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_interface.cpp | 13 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_operation.cpp | 52 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_sequence.cpp | 9 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_structure.cpp | 9 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_union.cpp | 9 | ||||
-rw-r--r-- | TAO/TAO_IDL/be_include/be_codegen.h | 4 | ||||
-rw-r--r-- | TAO/TAO_IDL/be_include/be_visitor_args.h | 32 |
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 + }; // ************************************************************ |