// ============================================================================ // // = LIBRARY // TAO IDL // // = FILENAME // be_state_argument.cpp // // = DESCRIPTION // state based code generation for arguments. // // = AUTHOR // Aniruddha Gokhale // // ============================================================================ #include "idl.h" #include "idl_extern.h" #include "be.h" // return type for argument be_state_argument::be_state_argument (void) { } // generate code for the mapping of the argument. // The different cases below have the following meaning: // TAO_ARGUMENT_CH // TAO_ARGUMENT_CS // TAO_ARGUMENT_SH -- all three generate the arguments in the signature of the // method . The CH case uses the ACE_NESTED_CLASS macro to // keep the MSVC++ compiler happy // The rest of the enumerated constants are self-explanatory // // There are 3 levels of nested switch statements // Level (1): The "type" of each argument, e.g., predefined, structure, ... // Level (2): The direction - in, inout, out // Level (3): The current state we are in int be_state_argument::gen_code (be_type *bt, be_decl *d, be_type *type) { TAO_OutStream *os = 0; // output stream TAO_NL nl; // end line TAO_CodeGen *cg = TAO_CODEGEN::instance (); be_argument *arg; // argument node be_interface *bif; // interface inside which the operation that uses this // argument was defined switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_CH: os = cg->client_header (); break; case TAO_CodeGen::TAO_ARGUMENT_CS: case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: os = cg->client_stubs (); break; case TAO_CodeGen::TAO_ARGUMENT_SH: os = cg->server_header (); break; case TAO_CodeGen::TAO_ARGUMENT_SS: case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: os = cg->server_skeletons (); break; } // retrieve the argument node arg = be_argument::narrow_from_decl (d); if (!arg) { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument.cpp - " "Bad argument\n"), -1); } // get the scope of the arg which is the operation. Its scope is the // interface node. We need this interface node for generating the // ACE_NESTED_CLASS macro bif = be_interface::narrow_from_scope (ScopeAsDecl (arg->defined_in ())->defined_in ()); if (!bif) { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument.cpp - " "Bad interface\n"), -1); } if (!type) // not a recursive call type = bt; else // recursively called thru a typedef. "type" will have the most primitive // base class of the typedef ACE_ASSERT (bt->node_type () == AST_Decl::NT_typedef); // find the direction of the argument. Depending on the direction and the // type, generate the mapping switch (type->node_type ()) // LEVEL (1) switch on node type of the "type" { case AST_Decl::NT_interface: // type is an obj reference case AST_Decl::NT_interface_fwd: // type is an obj reference { switch (arg->direction ()) { case AST_Argument::dir_IN: // what state are we in switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // assign to a CORBA::Object_ptr *os << "CORBA::Object_ptr _tao_base_" << arg->local_name () << " = " << arg->local_name () << "; // cast it" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { // pass the cast value *os << ", &_tao_base_" << arg->local_name (); } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { // nothing for in parameters } break; case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { // declare a variable *os << bt->name () << "_ptr "; *os << arg->local_name () << ";" << nl; // we also declare a corresponding CORBA::Object_ptr to be // passed to the decoder *os << "CORBA::Object_ptr _tao_base_" << arg->local_name () << ";" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", &_tao_base_" << arg->local_name () << "); // ORB does not own" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // convert from the CORBA::Object_ptr to the interface type // using a _narrow *os << arg->local_name () << " = " << bt->name () << "::_narrow (_tao_base_" << arg->local_name () << ", " << "_tao_environment);" << nl; *os << "if (_tao_environment.exception ()) return;" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // nothing for an in parameter } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { *os << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { // to keep the MSVC++ compiler happy *os << bt->nested_type_name (bif, "_ptr") << " " << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CS: case TAO_CodeGen::TAO_ARGUMENT_SH: { *os << bt->name () << "_ptr " << arg->local_name () << ", "; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // switch state break; case AST_Argument::dir_INOUT: // inout switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // assign to a CORBA::Object_ptr *os << "CORBA::Object_ptr _tao_base_" << arg->local_name () << " = " << arg->local_name () << ";" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { *os << ", &_tao_base_" << arg->local_name (); } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { // reassign to the inout parameter doing a _narrow *os << arg->local_name () << " = " << bt->name () << "::_narrow (_tao_base_" << arg->local_name () << ", env);" << nl; *os << "CORBA::release (_tao_base_" << arg->local_name () << ");" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { // declare a variable *os << bt->name () << "_ptr "; *os << arg->local_name () << ";" << nl; // we also declare a corresponding CORBA::Object_ptr to be // passed to the decoder *os << "CORBA::Object_ptr *_tao_base_" << arg->local_name () << " = new CORBA::Object_ptr;" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", _tao_base_" << arg->local_name () << ", 1); // ORB owns" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // convert from the CORBA::Object_ptr to the interface type // using a _narrow *os << arg->local_name () << " = " << bt->name () << "::_narrow (*_tao_base_" << arg->local_name () << ", " << "_tao_environment);" << nl; *os << "if (_tao_environment.exception ()) return;" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // assign modified interface obj ref to object_ptr *os << "*_tao_base_" << arg->local_name () << " = " << arg->local_name () << ";" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { *os << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { // to keep the MSVC++ compiler happy *os << bt->nested_type_name (bif, "_ptr") << " &" << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CS: case TAO_CodeGen::TAO_ARGUMENT_SH: { *os << bt->name () << "_ptr &" << arg->local_name () << ", "; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // end switch state break; case AST_Argument::dir_OUT: switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // assign to a CORBA::Object_ptr *os << "CORBA::Object_ptr _tao_base_" << arg->local_name () << ";" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { *os << ", &_tao_base_" << arg->local_name (); } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { // reassign to the inout parameter doing a _narrow *os << arg->local_name () << " = " << bt->name () << "::_narrow (_tao_base_" << arg->local_name () << ", env);" << nl; *os << "// free the Object_ptr" << nl; *os << "CORBA::release (_tao_base_" << arg->local_name () << ");" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { // declare a variable *os << bt->name () << "_ptr "; *os << arg->local_name () << ";" << nl; *os << bt->name () << "_out " << arg->local_name () << "_out (" << arg->local_name () << ");" << nl; // we also declare a corresponding CORBA::Object_ptr to be // passed to the decoder *os << "CORBA::Object_ptr *_tao_base_" << arg->local_name () << " = new CORBA::Object_ptr;" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", _tao_base_" << arg->local_name () << ", 1); // ORB owns" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // out parameter is cast to Object_ptr *os << "*_tao_base_" << arg->local_name () << " = " << arg->local_name () << "_out;" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { *os << arg->local_name () << "_out, "; } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { // to keep the MSVC++ compiler happy *os << bt->nested_type_name (bif, "_out") << " " << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CS: case TAO_CodeGen::TAO_ARGUMENT_SH: { *os << bt->name () << "_out " << arg->local_name () << ", "; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // end switch state break; } // end switch direction } // end of case interface/interface_fwd break; case AST_Decl::NT_pre_defined: // type is predefined type { be_predefined_type *bpd = be_predefined_type::narrow_from_decl (type); // check if the type is an any if (bpd->pt () == AST_PredefinedType::PT_any) { switch (arg->direction ()) { case AST_Argument::dir_IN: switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { *os << bt->name () << " "; // declare a variable *os << arg->local_name () << ";" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", &" << arg->local_name () << "); // ORB does not own" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // XXXASG - TODO } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { // XXXASG - TODO } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { // XXXASG - TODO } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { *os << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // XXXASG - TODO } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // XXXASG - TODO } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { // keep MSVC++ happy *os << "const " << bt->nested_type_name (bif) << " &" << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CS: case TAO_CodeGen::TAO_ARGUMENT_SH: { *os << "const " << bt->name () << " &" << arg->local_name () << ", "; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // end switch state break; case AST_Argument::dir_INOUT: switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { // declare a variable *os << bt->name () << " "; *os << arg->local_name () << ";" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", &" << arg->local_name () << ", 1); // ORB owns" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // XXXASG - TODO very similar to ObjRef } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { // XXXASG - TODO very similar to ObjRef } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { // XXXASG - TODO very similar to ObjRef } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { *os << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { *os << "const " << bt->nested_type_name (bif) << " &" << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CS: case TAO_CodeGen::TAO_ARGUMENT_SH: { *os << bt->name () << " &" << arg->local_name () << ", "; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // end switch state break; case AST_Argument::dir_OUT: switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { // declare a variable *os << bt->name () << " *"; *os << arg->local_name () << ";" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", " << arg->local_name () << ", 1); // ORB owns" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { *os << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { *os << bt->nested_type_name (bif, "_out") << " " << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CS: case TAO_CodeGen::TAO_ARGUMENT_SH: { *os << bt->name () << "_out " << arg->local_name () << ", "; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // end switch state break; } // end switch direction } // end of if else if (bpd->pt () == AST_PredefinedType::PT_pseudo) // e.g., CORBA::Object { switch (arg->direction ()) { case AST_Argument::dir_IN: switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { // declare a variable *os << bt->name () << "_ptr "; *os << arg->local_name () << ";" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", &" << arg->local_name () << "); // ORB does not own" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // no casting necessary as we already are object_ptr } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { *os << ", &" << arg->local_name (); } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { *os << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // nothing to be done as we are Object_ptr } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { *os << bt->nested_type_name (bif, "_ptr") << " " << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CS: case TAO_CodeGen::TAO_ARGUMENT_SH: { *os << bt->name () << "_ptr " << arg->local_name () << ", "; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // end of switch state break; case AST_Argument::dir_INOUT: switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { // declare a variable *os << bt->name () << "_ptr *" << arg->local_name () << " = new " << bt->name () << "_ptr;" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", " << arg->local_name () << ", 1); // ORB owns" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { *os << ", &" << arg->local_name (); } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { *os << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { *os << bt->nested_type_name (bif, "_ptr") << " &" << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CS: case TAO_CodeGen::TAO_ARGUMENT_SH: { *os << bt->name () << "_ptr &" << arg->local_name () << ", "; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // end switch state break; case AST_Argument::dir_OUT: switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { // declare a variable *os << bt->name () << "_ptr "; *os << arg->local_name () << ";" << nl; *os << bt->name () << "_out "; *os << arg->local_name () << "_out (" << arg->local_name () << ");" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", &" << arg->local_name () << ", 1); // ORB owns" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // declare a variable *os << bt->name () << "_ptr _tao_base_" << arg->local_name () << ";" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { *os << ", &_tao_base_" << arg->local_name (); } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { // assign to the _out parameter *os << arg->local_name () << " = _tao_base_" << arg->local_name () << ";" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { *os << arg->local_name () << "_out, "; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { *os << bt->nested_type_name (bif, "_out") << " " << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CS: case TAO_CodeGen::TAO_ARGUMENT_SH: { *os << bt->name () << "_out " << arg->local_name () << ", "; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // end switch state break; } // end switch direction } // end else if else // simple predefined types { switch (arg->direction ()) { case AST_Argument::dir_IN: switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { // declare a variable *os << bt->name () << " " << arg->local_name () << ";" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", &" << arg->local_name () << "); // ORB does not own" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { *os << ", &" << arg->local_name (); } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { *os << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { *os << bt->nested_type_name (bif) << " " << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CS: case TAO_CodeGen::TAO_ARGUMENT_SH: { *os << bt->name () << " " << arg->local_name () << ", "; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // end switch state break; case AST_Argument::dir_INOUT: switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { // declare a variable *os << bt->name () << " *" << arg->local_name () << " = new " << bt->name () << ";" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", " << arg->local_name () << "); // ORB owns " << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { *os << ", &" << arg->local_name (); } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { *os << "*" << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { *os << bt->nested_type_name (bif) << " &" << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CS: case TAO_CodeGen::TAO_ARGUMENT_SH: { *os << bt->name () << " &" << arg->local_name () << ", "; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // end switch state break; case AST_Argument::dir_OUT: switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { // declare a variable *os << bt->name () << " *" << arg->local_name () << " = new " << bt->name () << ";" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", " << arg->local_name () << ", 1); // ORB owns" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { *os << ", &" << arg->local_name (); } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { *os << "*" << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { *os << bt->nested_type_name (bif, "_out") << " " << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CS: case TAO_CodeGen::TAO_ARGUMENT_SH: { *os << bt->name () << "_out " << arg->local_name () << ", "; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // end of switch break; } // end switch direction } // end of else } // end of case predefined break; case AST_Decl::NT_string: // type is a string { switch (arg->direction ()) { case AST_Argument::dir_IN: switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { // declare a variable if (bt->node_type () == AST_Decl::NT_typedef) *os << bt->name (); else *os << "char *"; *os << " " << arg->local_name () << ";" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", &" << arg->local_name () << "); // ORB does not own" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { *os << ", &" << arg->local_name (); } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { *os << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { *os << "const "; if (bt->node_type () == AST_Decl::NT_typedef) *os << bt->nested_type_name (bif); else *os << "char *"; *os << " " << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_SH: case TAO_CodeGen::TAO_ARGUMENT_CS: { *os << "const "; if (bt->node_type () == AST_Decl::NT_typedef) *os << bt->name (); else *os << "char *"; *os << " " << arg->local_name () << ", "; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // end switch state break; case AST_Argument::dir_INOUT: switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { // declare a variable if (bt->node_type () == AST_Decl::NT_typedef) *os << bt->name (); else *os << "char *"; *os << " " << arg->local_name () << ";" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", &" << arg->local_name () << "); // ORB does not own" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { *os << ", &" << arg->local_name (); } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { *os << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { if (bt->node_type () == AST_Decl::NT_typedef) *os << bt->nested_type_name (bif); else *os << "char *"; *os << " " << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_SH: case TAO_CodeGen::TAO_ARGUMENT_CS: { if (bt->node_type () == AST_Decl::NT_typedef) *os << bt->name (); else *os << "char *"; *os << " " << arg->local_name () << ", "; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // end switch state break; case AST_Argument::dir_OUT: switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { // declare a variable if (bt->node_type () == AST_Decl::NT_typedef) *os << bt->name (); else *os << "char *"; *os << arg->local_name () << ";" << nl; if (bt->node_type () == AST_Decl::NT_typedef) *os << bt->name () << "_out"; else *os << "CORBA::String_out"; *os << " " << arg->local_name () << "_out (" << arg->local_name () << ");" << nl; // we also declare a corresponding char* // passed to the decoder *os << "char **_tao_base_" << arg->local_name () << " = new char*;" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", _tao_base_" << arg->local_name () << ", 1); // ORB owns" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // declare a string variable if (bt->node_type () == AST_Decl::NT_typedef) *os << bt->name (); else *os << "char *"; *os << " _tao_base_" << arg->local_name () << ";" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { *os << ", &_tao_base_" << arg->local_name (); } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { // assign the _tao_base_ variable to the out // parameter *os << arg->local_name () << " = _tao_base_" << arg->local_name () << ";" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { *os << arg->local_name () << "_out, "; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // out parameter is cast *os << "*_tao_base_" << arg->local_name () << " = " << arg->local_name () << "_out;" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { if (bt->node_type () == AST_Decl::NT_typedef) *os << bt->nested_type_name (bif, "_out"); else *os << "CORBA::String_out"; *os << " " << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CS: case TAO_CodeGen::TAO_ARGUMENT_SH: { if (bt->node_type () == AST_Decl::NT_typedef) *os << bt->name () << "_out"; else *os << "CORBA::String_out"; *os << " " << arg->local_name () << ", "; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // end switch state break; } // end switch direction } // end case string break; case AST_Decl::NT_array: // type is an array switch (arg->direction ()) { case AST_Argument::dir_IN: { switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { // declare a variable *os << bt->name () << " " << arg->local_name () << ";" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", " << arg->local_name () << "); // ORB does not own" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // XXXASG TODO } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { // XXXASG TODO } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { // XXXASG TODO } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { *os << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { // to keep the MSVC++ compiler happy *os << "const " << bt->nested_type_name (bif) << " " << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CS: case TAO_CodeGen::TAO_ARGUMENT_SH: { *os << "const " << bt->name () << " " << arg->local_name () << ", "; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // end switch state } // end case break; case AST_Argument::dir_INOUT: { switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { // declare a variable *os << bt->name (); if (bt->size_type () == be_decl::VARIABLE) { *os << "_slice *"; } *os << " " << arg->local_name () << ";" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", " << arg->local_name () << "); // ORB does not own" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // TODO XXXASG } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { // TODO XXXASG } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { // TODO XXXASG } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { *os << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { // to keep the MSVC++ compiler happy if (bt->size_type () == be_decl::VARIABLE) { *os << bt->nested_type_name (bif, "_slice") << " *" << arg->local_name () << ", "; } else { *os << bt->nested_type_name (bif) << " " << arg->local_name () << ", "; } } break; case TAO_CodeGen::TAO_ARGUMENT_CS: case TAO_CodeGen::TAO_ARGUMENT_SH: { *os << bt->name (); if (bt->size_type () == be_decl::VARIABLE) { *os << "_slice *"; } *os << arg->local_name () << ", "; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // end switch state } // end case break; case AST_Argument::dir_OUT: { switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { // declare a variable *os << bt->name () << "_slice *" << arg->local_name () << ";" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", " << arg->local_name () << ", 1); // ORB owns" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // TODO XXXASG } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { // TODO XXXASG } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { // TODO XXXASG } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { *os << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { // to keep the MSVC++ compiler happy *os << bt->nested_type_name (bif, "_out") << " " << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CS: case TAO_CodeGen::TAO_ARGUMENT_SH: { *os << bt->name () << "_out " << arg->local_name () << ", "; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // end switch state } break; } // end of switch direction break; case AST_Decl::NT_sequence: // type is a sequence case AST_Decl::NT_struct: // type is a struct case AST_Decl::NT_union: // type is a union switch (arg->direction ()) { case AST_Argument::dir_IN: { switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { // declare a variable *os << bt->name () << " " << arg->local_name () << ";" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", &" << arg->local_name () << "); // ORB does not own" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { *os << ", &" << arg->local_name (); } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { *os << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { // to keep the MSVC++ compiler happy *os << "const " << bt->nested_type_name (bif) << " &" << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CS: case TAO_CodeGen::TAO_ARGUMENT_SH: { *os << "const " << bt->name () << " &" << arg->local_name () << ", "; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // end switch state } break; case AST_Argument::dir_INOUT: { switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { // declare a variable *os << bt->name () << " " << arg->local_name () << ";" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", &" << arg->local_name () << "); // ORB does not own" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { *os << ", &" << arg->local_name (); } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { *os << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { // to keep the MSVC++ compiler happy *os << bt->nested_type_name (bif) << " &" << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CS: case TAO_CodeGen::TAO_ARGUMENT_SH: { *os << bt->name () << " &" << arg->local_name () << ", "; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // end switch state } // end case break; case AST_Argument::dir_OUT: { switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { if (bt->size_type () == be_decl::VARIABLE) { // declare a variable *os << bt->name () << " *" << arg->local_name () << ";" << nl; *os << bt->name () << "_out " << arg->local_name () << "_out (" << arg->local_name () << ");" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", " << arg->local_name () << ", 1); // ORB owns" << nl; } else { // declare a variable *os << bt->name () << " " << arg->local_name () << ";" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", &" << arg->local_name () << ", 1); // ORB owns" << nl; } // end else } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // declare a variable. We need this only if we are variable // sized. If we are fixed sized, we already know our size and // hence we have already been allocated if (bt->size_type () == be_decl::VARIABLE) { *os << bt->name () << " *_tao_base_" << arg->local_name () << " = new " << bt->name () << ";" << nl; } } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { if (bt->size_type () == be_decl::VARIABLE) { *os << ", _tao_base_" << arg->local_name (); } else { // simply pass our address *os << ", &" << arg->local_name (); } } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { if (bt->size_type () == be_decl::VARIABLE) { *os << arg->local_name () << " = _tao_base_" << arg->local_name () << ";" << nl; } } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { if (bt->size_type () == be_decl::VARIABLE) *os << arg->local_name () << "_out, "; else *os << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { // to keep the MSVC++ compiler happy *os << bt->nested_type_name (bif, "_out") << " " << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CS: case TAO_CodeGen::TAO_ARGUMENT_SH: { *os << bt->name () << "_out " << arg->local_name () << ", "; break; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // end switch state } // end case break; } // end switch direction break; case AST_Decl::NT_enum: // type is an enum switch (arg->direction ()) { case AST_Argument::dir_IN: { switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { // declare a variable *os << bt->name () << " " << arg->local_name () << ";" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", &" << arg->local_name () << "); // ORB does not own" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { *os << ", &" << arg->local_name (); } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { *os << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { // to keep the MSVC++ compiler happy *os << bt->nested_type_name (bif) << " " << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CS: case TAO_CodeGen::TAO_ARGUMENT_SH: { *os << bt->name () << " " << arg->local_name () << ", "; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // end of switch state } // end case break; case AST_Argument::dir_INOUT: { switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { // declare a variable *os << bt->name () << " " << arg->local_name () << ";" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", &" << arg->local_name () << "); // ORB does not own" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { *os << ", &" << arg->local_name (); } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { *os << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { // to keep the MSVC++ compiler happy *os << bt->nested_type_name (bif) << " &" << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CS: case TAO_CodeGen::TAO_ARGUMENT_SH: { *os << bt->name () << " &" << arg->local_name () << ", "; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // end switch state } // end case break; case AST_Argument::dir_OUT: { switch (cg->state ()) { case TAO_CodeGen::TAO_ARGUMENT_VARDECL_SS: { // declare a variable *os << bt->name () << " " << arg->local_name () << ";" << nl; // now define a NamedValue_ptr *os << "CORBA::NamedValue_ptr nv_" << arg->local_name () << ";" << nl; // declare an Any *os << "CORBA::Any \t any_" << arg->local_name () << " (" << bt->tc_name () << ", &" << arg->local_name () << "); // ORB does not own" << nl; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_DOCALL_CS: { *os << ", &" << arg->local_name (); } break; case TAO_CodeGen::TAO_ARGUMENT_POST_DOCALL_CS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_UPCALL_SS: { *os << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_PRE_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_POST_UPCALL_SS: { // nothing } break; case TAO_CodeGen::TAO_ARGUMENT_CH: { // to keep the MSVC++ compiler happy *os << bt->nested_type_name (bif, "_out") << " " << arg->local_name () << ", "; } break; case TAO_CodeGen::TAO_ARGUMENT_CS: case TAO_CodeGen::TAO_ARGUMENT_SH: { *os << bt->name () << "_out " << arg->local_name () << ", "; } break; default: { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_state_argument - unknown state\n"), -1); } } // end switch state } // end case break; } // end switch direction break; case AST_Decl::NT_except: // type is an exception { // XXXASG TODO: is this allowed ??? } break; case AST_Decl::NT_typedef: // type is a typedef { be_type *temp; be_typedef *t = be_typedef::narrow_from_decl (bt); if (!t) return -1; temp = t->primitive_base_type (); // make a recursive call return this->gen_code (t, d, temp); } // end of case break; } //end switch node type return 0; }