summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/be/be_attribute.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/TAO_IDL/be/be_attribute.cpp')
-rw-r--r--TAO/TAO_IDL/be/be_attribute.cpp662
1 files changed, 0 insertions, 662 deletions
diff --git a/TAO/TAO_IDL/be/be_attribute.cpp b/TAO/TAO_IDL/be/be_attribute.cpp
deleted file mode 100644
index fa87112369b..00000000000
--- a/TAO/TAO_IDL/be/be_attribute.cpp
+++ /dev/null
@@ -1,662 +0,0 @@
-// ============================================================================
-//
-// = LIBRARY
-// TAO IDL
-//
-// = FILENAME
-// be_attribute.cpp
-//
-// = DESCRIPTION
-// Extension of class AST_Attribute that provides additional means for C++
-// mapping.
-//
-// = AUTHOR
-// Copyright 1994-1995 by Sun Microsystems, Inc.
-// and
-// Aniruddha Gokhale
-//
-// ============================================================================
-
-#include "idl.h"
-#include "idl_extern.h"
-#include "be.h"
-
-/*
- * BE_Attribute
- */
-be_attribute::be_attribute (void)
-{
-}
-
-be_attribute::be_attribute (idl_bool ro, AST_Type *ft, UTL_ScopedName *n,
- UTL_StrList *p)
- : AST_Attribute (ro, ft, n, p),
- AST_Field (AST_Decl::NT_attr, ft, n, p),
- AST_Decl (AST_Decl::NT_attr, n, p)
-{
-}
-
-// Handling attributes is very similar to operations. Attributes are mapped to
-// two methods - one to set the value and one to get the value. For a readonly
-// attribute we only have the method that retrieves the value. For the "set"
-// method we pass an in parameter which is of the type of the attribute. So the
-// handling here is exactly like the "in" parameters for arguments. The
-// handling of the "get" method is exactly like the return values of
-// operations.
-
-int
-be_attribute::gen_client_header (void)
-{
- TAO_OutStream *ch; // output stream
- be_type *bt; // type node
- be_state *s; // state based code gen object
-
- // retrieve a singleton instance of the code generator
- TAO_CodeGen *cg = TAO_CODEGEN::instance ();
- ch = cg->client_header ();
-
- ch->indent (); // start with the current indentation level
-
- bt = be_type::narrow_from_decl (this->field_type ());
- if (!bt)
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_attribute::gen_client_header - "
- "bad type\n"),
- -1);
- }
-
-
- // first the "get" method
-
- // the retrieve method is defined virtual
- *ch << "virtual ";
-
- // first generate the return type
- cg->push (TAO_CodeGen::TAO_ATTRIBUTE_RETURN_TYPE_CH); // we are now generating
- // an attribute "get"
- // definition with the
- // return type first
-
- s = cg->make_state (); // retrieve state based object
-
- if (!s || (s->gen_code (bt, this) == -1))
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_attribute::gen_client_header - "
- "return type generation failure\n"),
- -1);
- }
- cg->pop (); // restore previous state
-
- // generate the operation name
- // additional argument in the form of CORBA::Environment since TAO does not
- // yet support C++ style Exceptions. However, we can have an option to the
- // "tao" IDL compiler to ask it to generate code for exceptions. This will be
- // handled in a later release.
- *ch << " " << this->local_name () << " (CORBA::Environment &env);\n";
-
- // now the set method. However, this is not defined if we are readonly
- if (!this->readonly ())
- {
- ch->indent ();
- *ch << "virtual void " << this->local_name () << "(";
-
- // we pass the type as an "in" parameter
- cg->push (TAO_CodeGen::TAO_ATTRIBUTE_INPARAM_TYPE_CH);
-
- s = cg->make_state (); // retrieve state based object
-
- if (!s || !bt || (s->gen_code (bt, this) == -1))
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_attribute::gen_client_header - "
- "in param type generation failure\n"),
- -1);
- }
- cg->pop (); // restore previous state
- *ch << ", CORBA::Environment &env);\n";
- }
-
- return 0;
-}
-
-int
-be_attribute::gen_client_stubs (void)
-{
- TAO_OutStream *cs; // output stream
- TAO_NL nl; // end line
- be_type *bt; // type node
- be_state *s; // state based code gen object
-
-
- // retrieve a singleton instance of the code generator
- TAO_CodeGen *cg = TAO_CODEGEN::instance ();
-
- cs = cg->client_stubs ();
-
- // retrieve the type
- bt = be_type::narrow_from_decl (this->field_type ());
- if (!bt)
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_attribute::gen_client_stubs - "
- "bad type\n"),
- -1);
- }
-
- // first the retrieve method
- cs->indent (); // start with current indentation level
-
- // generate the TAO_Param_Data table for the "get" method
- *cs << "static const TAO_Param_Data _get_" << this->flatname () <<
- "_paramdata [] = " << nl;
- *cs << "{\n";
- cs->incr_indent ();
-
- // entry for the return type
- *cs << "{" << bt->tc_name () << ", PARAM_RETURN, 0}";
- cs->decr_indent ();
- *cs << "};\n\n";
-
- // now generate the calldata table
-
- cs->indent ();
- *cs << "static const TAO_Call_Data _get_" << this->flatname () << "_calldata = "
- << nl;
- *cs << "{";
- // prepend a "_get_"
- *cs << "\"_get_" << this->local_name () << "\", ";
- *cs << "1, "; // always a twoway call
- *cs << "1, "; // size is 1
- // insert the address of the paramdata table
- *cs << "_get_" << this->flatname () << "_paramdata, ";
- // XXXASG - Exception list goes here (if it exists) - TODO
- *cs << "0, 0};\n\n";
-
- // now generate the actual stub
-
- // first generate the return type
- cs->indent ();
- cg->push (TAO_CodeGen::TAO_ATTRIBUTE_RETURN_TYPE_CS); // declare a return
- // type of the stub
- s = cg->make_state ();
- if (!s || (s->gen_code (bt, this) == -1))
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_attribute::gen_client_stubs - "
- "return type generation failure\n"),
- -1);
- }
- cg->pop ();
-
- // generate the operation name
- *cs << " " << this->name () << "(CORBA::Environment &env)" << nl;
- *cs << "{\n";
- cs->incr_indent ();
-
- // declare a return type
- cg->push (TAO_CodeGen::TAO_ATTRIBUTE_RETVAL_DECL_CS);
- s = cg->make_state ();
- if (!s || (s->gen_code (bt, this) == -1))
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_attribute::gen_client_stubs - "
- "retval declaration failure\n"),
- -1);
- }
- cg->pop ();
-
- // generate code that calls QueryInterface
- *cs << "STUB_Object *istub;\n\n";
- cs->indent ();
- *cs << "if (this->QueryInterface (IID_STUB_Object, " <<
- "(void **)&istub) != NOERROR)" << nl;
- *cs << "{\n";
- cs->incr_indent ();
- *cs << "env.exception (new CORBA::DATA_CONVERSION (CORBA::COMPLETED_NO));" <<
- nl;
-
- // return the appropriate error value on exception
- cg->push (TAO_CodeGen::TAO_ATTRIBUTE_RETVAL_EXCEPTION_CS);
- s = cg->make_state ();
- if (!s || (s->gen_code (bt, this) == -1))
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_attribute::gen_client_stubs - "
- "failure returning from exception\n"),
- -1);
- }
- cg->pop ();
-
- cs->decr_indent ();
- *cs << "}" << nl;
- *cs << "this->Release (); // QueryInterface has bumped up our refcount" << nl;
-
- // call do_call with appropriate number of arguments
- *cs << "istub->do_call (env, &_get_" << this->flatname () <<
- "_calldata, &retval);" << nl;
-
- // return the retval
- cg->push (TAO_CodeGen::TAO_ATTRIBUTE_RETVAL_RETURN_CS);
- s = cg->make_state ();
- if (!s || (s->gen_code (bt, this) == -1))
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_operation::gen_client_stubs\n"
- "return val return generation failure\n"),
- -1);
- return -1;
- }
- cg->pop ();
-
- cs->decr_indent (0);
- *cs << "\n}\n\n";
-
- if (this->readonly ())
- return 0; // we were readonly, nothing else to do.
-
- // Now generate the stub for the "set" method
- cs->indent (); // start with current indentation level
-
- // generate the TAO_Param_Data table for the "set" method
- *cs << "static const TAO_Param_Data _set_" << this->flatname () <<
- "_paramdata [] = " << nl;
- *cs << "{\n";
- cs->incr_indent ();
-
- // entry for the return type
- *cs << "{CORBA::_tc_void, PARAM_RETURN, 0}," << nl;
- *cs << "{" << bt->tc_name () << ", PARAM_IN, 0}\n";
- cs->decr_indent ();
- *cs << "};\n\n";
-
- // now generate the calldata table
-
- cs->indent ();
- *cs << "static const TAO_Call_Data _set_" << this->flatname () << "_calldata = "
- << nl;
- *cs << "{";
- // prepend a "_set_"
- *cs << "\"_set_" << this->local_name () << "\", ";
- *cs << "1, "; // always a twoway call
- *cs << "2, "; // size is 2
- // insert the address of the paramdata table
- *cs << "_get_" << this->flatname () << "_paramdata, ";
- // XXXASG - Exception list goes here (if it exists) - TODO
- *cs << "0, 0};\n\n";
-
- // now generate the actual stub
-
- cs->indent ();
- *cs << "void " << this->name () << "(";
- // generate the in parameter
- cg->push (TAO_CodeGen::TAO_ATTRIBUTE_INPARAM_TYPE_CS);
- s = cg->make_state ();
- if (!s || (s->gen_code (bt, this) == -1))
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_operation::gen_client_stubs - "
- "failure in argument generation in signature\n"),
- -1);
- }
- cg->pop ();
-
- // last argument - is always CORBA::Environment
- *cs << ", CORBA::Environment &env)" << nl;
- *cs << "{\n";
- cs->incr_indent ();
-
- // generate code that calls QueryInterface
- *cs << "STUB_Object *istub;\n\n";
- cs->indent ();
- *cs << "if (this->QueryInterface (IID_STUB_Object, " <<
- "(void **)&istub) != NOERROR)" << nl;
- *cs << "{\n";
- cs->incr_indent ();
- *cs << "env.exception (new CORBA::DATA_CONVERSION (CORBA::COMPLETED_NO));" <<
- nl;
- *cs << "return;\n";
- cs->decr_indent ();
- *cs << "}" << nl;
- *cs << "this->Release (); // QueryInterface has bumped up our refcount" << nl;
-
- // do any pre do_call stuff with the lone IN parameter
- cg->push (TAO_CodeGen::TAO_ATTRIBUTE_PRE_DOCALL_CS);
- if (!s || (s->gen_code (bt, this) == -1))
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_atribute::gen_client_stubs - "
- "failure generating pre docall stuff\n"),
- -1);
- }
- cg->pop ();
-
- // call do_call with appropriate number of arguments
- *cs << "istub->do_call (env, &_set_" << this->flatname () <<
- "_calldata, 0"; // no return value
-
- cg->push (TAO_CodeGen::TAO_ATTRIBUTE_DOCALL_CS);
- s = cg->make_state ();
- if (!s || (s->gen_code (bt, this) == -1))
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_attribute::gen_client_stubs - "
- "in param in docall generation failure\n"),
- -1);
- return -1;
- }
- cg->pop ();
- *cs << ");" << nl;
-
- // do any post do_call processing
- cg->push (TAO_CodeGen::TAO_ATTRIBUTE_POST_DOCALL_CS);
- s = cg->make_state ();
- if (!s || !bt || (s->gen_code (bt, this) == -1))
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_attribute::gen_client_stubs\n"
- "post docall generation failure\n"),
- -1);
- return -1;
- }
- cg->pop ();
-
- cs->decr_indent (0);
- *cs << "\n}\n\n";
-
- return 0;
-}
-
-int
-be_attribute::gen_server_header (void)
-{
- TAO_OutStream *sh; // output stream
- be_type *bt; // type node
- be_state *s; // state based code generator object
- TAO_NL nl; // newline generator
-
- // retrieve a singleton instance of the code generator
- TAO_CodeGen *cg = TAO_CODEGEN::instance ();
-
- sh = cg->server_header ();
-
- // first retrieve the type
- bt = be_type::narrow_from_decl (this->field_type ());
- if (!bt)
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_attribute::gen_server_header - "
- "bad type\n"),
- -1);
- }
-
- // first the "get" method
-
- sh->indent (); // start with the current indentation level
-
- // the retrieve method is defined pure virtual
- *sh << "virtual ";
- cg->push (TAO_CodeGen::TAO_ATTRIBUTE_RETURN_TYPE_SH); // we are now generating
- // an operation
- // definition with the
- // return type first
-
- s = cg->make_state (); // retrieve state based object
-
- if (!s || (s->gen_code (bt, this) == -1))
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_attribute::gen_server_header - "
- "return type generation failure\n"),
- -1);
- }
- cg->pop (); // restore previous state
-
- *sh << " " << this->local_name () << " (CORBA::Environment &env) = 0;" << nl;
-
- // generate the static method corresponding to the method
- *sh << "static void _get_" << this->local_name () <<
- "_skel (CORBA::ServerRequest &req, " <<
- "CORBA::Object_ptr obj, CORBA::Environment &env);\n\n";
-
-
- // now the set method. However, this is not defined if we are readonly
- if (this->readonly ())
- return 0;
-
- sh->indent ();
- *sh << "virtual void " << this->local_name () << "(";
-
- // we pass the type as an "in" parameter
- cg->push (TAO_CodeGen::TAO_ATTRIBUTE_INPARAM_TYPE_SH);
-
- s = cg->make_state (); // retrieve state based object
-
- if (!s || (s->gen_code (bt, this) == -1))
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_attribute::gen_server_header - "
- "in param type generation failure\n"),
- -1);
- }
- cg->pop (); // restore previous state
- *sh << ", CORBA::Environment &env) = 0;" << nl;
-
- // generate the static method corresponding to the method
- *sh << "static void _set_" << this->local_name () <<
- "_skel (CORBA::ServerRequest &req, " <<
- "CORBA::Object_ptr obj, CORBA::Environment &env);\n\n";
-
-
- return 0;
-}
-
-int
-be_attribute::gen_server_skeletons (void)
-{
- TAO_OutStream *ss; // output stream
- TAO_NL nl; // end line
- be_type *bt; // type node
- be_state *s; // state based code gen object
- be_interface *intf; // enclosing interface node
-
- // retrieve a singleton instance of the code generator
- TAO_CodeGen *cg = TAO_CODEGEN::instance ();
- ss = cg->server_skeletons ();
-
- ss->indent (); // start with the current indentation level
-
- // retrieve our type
- bt = be_type::narrow_from_decl (this->field_type ());
- if (!bt)
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_attribute::gen_server_skeletons - "
- "bad type\n"),
- -1);
- }
-
- // retrieve our enclosing interface decl
- intf = be_interface::narrow_from_decl (ScopeAsDecl (this->defined_in ()));
- if (!intf)
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_attribute::gen_server_skeletons - "
- "bad enclosing interface\n"),
- -1);
- }
-
-
- // code generation - first the "get" method
- *ss << "void " << intf->full_skel_name () << "::_get_"
- << this->local_name () << "_skel ("
- << "CORBA::ServerRequest &_tao_server_request, "
- << "CORBA::Object_ptr _tao_object_reference, "
- << "CORBA::Environment &_tao_environment)" << nl;
- *ss << "{\n";
- ss->incr_indent ();
- // define a variable that will eventually point to our implementation object
- *ss << intf->full_skel_name () << "_ptr \t impl;" << nl;
- // store the result in this Any
- *ss << "CORBA::Any *result;" << nl;
- // emit the return type
- cg->push (TAO_CodeGen::TAO_ATTRIBUTE_RETVAL_DECL_SS); // emit type for return
- // value
- // get a state based code gen object
- s = cg->make_state ();
- if (!s || (s->gen_code (bt, this) == -1))
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_attribute::gen_server_skeletons - "
- "codegen for return val decl failed\n"),
- -1);
- }
- cg->pop ();
-
- ss->indent ();
- *ss << "// this method has no incoming parameters. Nothing to parse" << nl;
-
- // make the upcall
- *ss << "impl = (" << intf->full_skel_name () << "_ptr) _tao_object_reference->get_subclass ();"
- << nl;
- cg->push (TAO_CodeGen::TAO_ATTRIBUTE_RETVAL_ASSIGN_SS);
- s = cg->make_state ();
- // emit code to assign to retval
- if (!s || (s->gen_code (bt, this) == -1))
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_attribute::gen_server_skeletons - "
- "codegen for return val assign failed\n"),
- -1);
- }
- *ss << " = impl->" << this->local_name () << "(_tao_environment);" << nl;
- cg->pop ();
-
- // insert our return val into the result
- cg->push (TAO_CodeGen::TAO_ATTRIBUTE_RESULT_SS);
- s = cg->make_state ();
- if (!s || (s->gen_code (bt, this) == -1))
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_attribute::gen_server_skeletons - "
- "codegen for returning result failed\n"),
- -1);
- }
- cg->pop ();
- // insert the result into the server request
- *ss << "_tao_server_request.result (result, _tao_environment);\n";
- ss->decr_indent ();
- *ss << "}\n\n";
-
- if (this->readonly ())
- return 0; // nothing else to do as we are readonly
-
- // generate skeleton for the "set" method
-
- ss->indent ();
- *ss << "void " << intf->full_skel_name () << "::_set_"
- << this->local_name () << "_skel ("
- << "CORBA::ServerRequest &_tao_server_request, "
- << "CORBA::Object_ptr _tao_object_reference, "
- << "CORBA::Environment &_tao_environment)" << nl;
- *ss << "{\n";
- ss->incr_indent ();
- // define an NVList to hold the in argument
- *ss << "CORBA::NVList_ptr \t nvlist;" << nl;
- // define a variable that will eventually point to our implementation object
- *ss << intf->full_skel_name () << "_ptr \t impl;" << nl;
-
- // if we have any arguments, get each one of them and allocate an Any and
- // NamedValue for each. In addition, define a variable of that type
- cg->push (TAO_CodeGen::TAO_ATTRIBUTE_INPARAM_TYPE_SS);
- s = cg->make_state ();
- if (!s || (s->gen_code (bt, this) == -1))
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_attribute::gen_server_skeletons - "
- "codegen for returning result failed\n"),
- -1);
- }
- cg->pop ();
-
- // declare an NVList and create one
- ss->indent ();
- *ss << "// create an NV list and populate it with typecodes" << nl;
- *ss << "_tao_server_request.orb ()->create_list (0, nvlist); // initialize a list" << nl;
-
- // add the "in" argument
- // emit code that adds this argument to the NVList
- *ss << "nv_" << this->local_name () << " = nvlist->add_value (\"" <<
- this->local_name () << "\", any_" << this->local_name () <<
- ", CORBA::ARG_IN, _tao_environment);" << nl;
-
- *ss << "// parse the arguments" << nl;
- *ss << "_tao_server_request.params (nvlist, _tao_environment);" << nl;
- *ss << "if (_tao_environment.exception ()) return;" << nl;
-
- cg->push (TAO_CodeGen::TAO_ATTRIBUTE_PRE_UPCALL_SS);
- s = cg->make_state ();
- if (!s || (s->gen_code (bt, this) == -1))
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_attribute::gen_server_skeletons - "
- "preupcall code failed\n"),
- -1);
- }
- cg->pop ();
-
- // make the upcall
- *ss << "impl = (" << intf->full_skel_name () << "_ptr) _tao_object_reference->get_subclass ();"
- << nl;
-
- *ss << "impl->" << this->local_name () << "(";
- cg->push (TAO_CodeGen::TAO_ATTRIBUTE_UPCALL_SS);
- s = cg->make_state ();
- if (!s || (s->gen_code (bt, this) == -1))
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_attribute::gen_server_skeletons - "
- "upcall code failed\n"),
- -1);
- }
- cg->pop ();
- *ss << "_tao_environment);" << nl;
-
- cg->push (TAO_CodeGen::TAO_ATTRIBUTE_POST_UPCALL_SS);
- s = cg->make_state ();
- if (!s || (s->gen_code (bt, this) == -1))
- {
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_attribute::gen_server_skeletons - "
- "post upcall code failed\n"),
- -1);
- }
- cg->pop ();
-
- *ss << "\n";
- ss->decr_indent ();
- *ss << "}\n\n";
-
- return 0;
-}
-
-// Generates the client-side inline information
-int
-be_attribute::gen_client_inline (void)
-{
- // nothing to be done
- return 0;
-}
-
-// Generates the server-side inline
-int
-be_attribute::gen_server_inline (void)
-{
- // nothing to be done
- return 0;
-}
-
-// Narrowing
-IMPL_NARROW_METHODS2 (be_attribute, AST_Attribute, be_decl)
-IMPL_NARROW_FROM_DECL (be_attribute)