summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/be/be_visitor_operation/ami_handler_arglist.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/TAO_IDL/be/be_visitor_operation/ami_handler_arglist.cpp')
-rw-r--r--TAO/TAO_IDL/be/be_visitor_operation/ami_handler_arglist.cpp198
1 files changed, 171 insertions, 27 deletions
diff --git a/TAO/TAO_IDL/be/be_visitor_operation/ami_handler_arglist.cpp b/TAO/TAO_IDL/be/be_visitor_operation/ami_handler_arglist.cpp
index 66d6b5763bb..4670062f2df 100644
--- a/TAO/TAO_IDL/be/be_visitor_operation/ami_handler_arglist.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_operation/ami_handler_arglist.cpp
@@ -16,13 +16,13 @@
//
// = AUTHOR
// Aniruddha Gokhale and Alexander Babu Arulanthu
-// <alex@cs.wustl.edu>
+// <alex@cs.wustl.edu>
//
// ============================================================================
-#include "idl.h"
-#include "idl_extern.h"
-#include "be.h"
+#include "idl.h"
+#include "idl_extern.h"
+#include "be.h"
#include "be_visitor_operation.h"
@@ -40,6 +40,82 @@ be_visitor_operation_ami_handler_arglist::be_visitor_operation_ami_handler_argli
{
}
+// Visit the scope and its elements.
+// This implementation is the same as
+// <be_visitor_scope::visit_scope>. The variation is that it calls the
+// <post_process> only if the return value of the <accept> is 1. We
+// need to do this since we have to differentiate between an argument
+// that was printed and an argument that was skipped in the signature.
+
+int
+be_visitor_operation_ami_handler_arglist::visit_scope (be_scope *node)
+{
+ // Proceed if the number of members in our scope is greater than 0.
+ if (node->nmembers () > 0)
+ {
+ // initialize an iterator to iterate thru our scope
+ UTL_ScopeActiveIterator *si;
+ ACE_NEW_RETURN (si,
+ UTL_ScopeActiveIterator (node,
+ UTL_Scope::IK_decls),
+ -1);
+ this->elem_number_ = 0;
+ // continue until each element is visited
+ while (!si->is_done ())
+ {
+ AST_Decl *d = si->item ();
+ if (!d)
+ {
+ delete si;
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_visitor_scope::visit_scope - "
+ "bad node in this scope\n"), -1);
+
+ }
+ be_decl *bd = be_decl::narrow_from_decl (d);
+ // set the scope node as "node" in which the code is being
+ // generated so that elements in the node's scope can use it
+ // for code generation
+
+ this->ctx_->scope (node->decl ());
+
+ // set the node to be visited
+ this->ctx_->node (bd);
+ this->elem_number_++;
+
+ // Do any pre processing using the next item info.
+ if (this->pre_process (bd) == -1)
+ {
+ delete si;
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_visitor_scope::visit_scope - "
+ "pre processing failed\n"), -1);
+ }
+
+ // Send the visitor.
+ int visitor_result = 0;
+ if (bd == 0 || (visitor_result = bd->accept (this)) == -1)
+ {
+ delete si;
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_visitor_scope::visit_scope - "
+ "codegen for scope failed\n"), -1);
+
+ }
+
+ // Do any post processing using this item info.
+ if (visitor_result == 1)
+ this->post_process (bd);
+
+ // Next argument.
+ si->next ();
+ } // end of while loop
+ delete si;
+ } // end of if
+
+ return 0;
+}
+
be_visitor_operation_ami_handler_arglist::~be_visitor_operation_ami_handler_arglist (void)
{
}
@@ -48,11 +124,54 @@ int
be_visitor_operation_ami_handler_arglist::visit_operation (be_operation *node)
{
TAO_OutStream *os = this->ctx_->stream ();
-
- *os << " (" << be_idt << be_idt << "\n";
- // All we do is hand over code generation to our scope.
- if (this->visit_scope (node) == -1)
+ *os << " (" << be_idt << be_idt << be_nl;
+
+ // First argument is a the return value of the operation.
+
+ // Indent.
+ os->indent ();
+
+ // Get the return type.
+ be_type *bt = be_type::narrow_from_decl (node->return_type ());
+ if (!bt)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_visitor_operation_ami_handler_arglist::"
+ "visit_operation - "
+ "Bad return type\n"),
+ -1);
+ }
+
+ // Grab the visitor.
+
+ be_visitor_context ctx = *this->ctx_;
+
+ // Set the state.
+ ctx.state (TAO_CodeGen::TAO_AMI_HANDLER_OPERATION_RESULT_ARG);
+ be_visitor *visitor = tao_cg->make_visitor (&ctx);
+
+ // Pass the visitor.
+ int result_printed = bt->accept (visitor);
+ if (result_printed == -1)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_visitor_operation_ami_handler_arglist::"
+ "visit_operation - "
+ "Bad return type\n"),
+ -1);
+ }
+ delete visitor;
+ visitor = 0;
+
+ if (result_printed)
+ *os << ", " << be_nl;
+
+ // Rest of the arguments.
+
+ // All we do is hand over code generation to our scope.
+ int args_printed = this->visit_scope (node);
+ if (args_printed == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_operation_ami_handler_arglist::"
@@ -61,29 +180,47 @@ be_visitor_operation_ami_handler_arglist::visit_operation (be_operation *node)
-1);
}
- // No argument for exception. What will you do if you get the
- // exception from the call back method?
+ // Generate the CORBA::Environment parameter for the alternative
+ // mapping.
+ if (!idl_global->exception_support ())
+ {
+ // If the operation node has parameters, then we need to insert
+ // a comma.
+ // @@ Fix this.
+ // if (result_printed || args_printed)
+ // *os << "," << be_nl;
- // Arglist is over.
+ os->indent ();
+
+ switch (this->ctx_->state ())
+ {
+ case TAO_CodeGen::TAO_AMI_HANDLER_OPERATION_ARGLIST_CH:
+ // Last argument - is always CORBA::Environment
+ *os << "CORBA::Environment &ACE_TRY_ENV";
+ *os << " = " << be_idt_nl
+ << "TAO_default_environment ()"
+ << be_uidt;
+ break;
+ case TAO_CodeGen::TAO_AMI_HANDLER_OPERATION_ARGLIST_CS:
+ // Last argument - is always CORBA::Environment.
+ *os << "CORBA::Environment &ACE_TRY_ENV";
+ break;
+ }
+ }
*os << be_uidt_nl << ")" << be_uidt;
- // @@ No THROW SPECs. You can do anything if the call back guy
- // throws an exception. But I am not too sure about
- // this. (Alex).
+ // Now generate the throw specs.
+ *os << be_idt_nl << "ACE_THROW_SPEC ((CORBA::SystemException))"
+ << be_uidt_nl;
+
switch (this->ctx_->state ())
{
- case TAO_CodeGen::TAO_AMI_HANDLER_OPERATION_ARGLIST:
- // Each method is pure virtual in the header.
- *os << " = 0;\n\n";
+ case TAO_CodeGen::TAO_AMI_HANDLER_OPERATION_ARGLIST_CH:
+ *os << ";" << be_nl << be_nl;
break;
default:
- ACE_ERROR_RETURN ((LM_ERROR,
- "(%N:%l) be_visitor_ami_handler_arglist::"
- "visit_operation - "
- "Bad operation\n"),
- -1);
+ *os << be_nl;
}
-
return 0;
}
@@ -128,8 +265,11 @@ be_visitor_operation_ami_handler_arglist::visit_argument (be_argument *node)
switch (this->ctx_->state ())
{
- case TAO_CodeGen::TAO_AMI_HANDLER_OPERATION_ARGLIST:
- ctx.state (TAO_CodeGen::TAO_ARGUMENT_AMI_HANDLER_ARGLIST);
+ case TAO_CodeGen::TAO_AMI_HANDLER_OPERATION_ARGLIST_CH:
+ ctx.state (TAO_CodeGen::TAO_ARGUMENT_AMI_HANDLER_ARGLIST_CH);
+ break;
+ case TAO_CodeGen::TAO_AMI_HANDLER_OPERATION_ARGLIST_CS:
+ ctx.state (TAO_CodeGen::TAO_ARGUMENT_AMI_HANDLER_ARGLIST_CS);
break;
default:
{
@@ -151,7 +291,11 @@ be_visitor_operation_ami_handler_arglist::visit_argument (be_argument *node)
"Bad visitor\n"),
-1);
}
- if (node->accept (visitor) == -1)
+
+ // Pass the visitor.
+
+ int result = node->accept (visitor);
+ if (result == -1)
{
delete visitor;
ACE_ERROR_RETURN ((LM_ERROR,
@@ -161,7 +305,7 @@ be_visitor_operation_ami_handler_arglist::visit_argument (be_argument *node)
-1);
}
delete visitor;
- return 0;
+ return result;
}
int