summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/be/be_visitor_ami_pre_proc.cpp
diff options
context:
space:
mode:
authormk1 <mk1@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-10-08 13:14:21 +0000
committermk1 <mk1@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>1999-10-08 13:14:21 +0000
commit7acc19c4115a13519eca229c9e4e14bdf87b82a1 (patch)
tree5773fa1420cc39a3a81702d00d04cb81bee2cce4 /TAO/TAO_IDL/be/be_visitor_ami_pre_proc.cpp
parent62f9bf19782e3f7831b2776ed4f599c129c7c771 (diff)
downloadATCD-7acc19c4115a13519eca229c9e4e14bdf87b82a1.tar.gz
ChangeLogEntry: Fri Oct 08 10:00:00 1999 Michael Kircher <Michael.Kircher@mchp.siemens.de>
Diffstat (limited to 'TAO/TAO_IDL/be/be_visitor_ami_pre_proc.cpp')
-rw-r--r--TAO/TAO_IDL/be/be_visitor_ami_pre_proc.cpp128
1 files changed, 93 insertions, 35 deletions
diff --git a/TAO/TAO_IDL/be/be_visitor_ami_pre_proc.cpp b/TAO/TAO_IDL/be/be_visitor_ami_pre_proc.cpp
index 18e29bea23c..e6fb71585f5 100644
--- a/TAO/TAO_IDL/be/be_visitor_ami_pre_proc.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_ami_pre_proc.cpp
@@ -95,47 +95,61 @@ be_visitor_ami_pre_proc::visit_interface (be_interface *node)
be_valuetype *excep_holder = this->create_exception_holder (node);
- if (excep_holder)
+
+ be_interface *reply_handler = this->create_reply_handler (node,
+ excep_holder);
+ if (reply_handler)
{
- excep_holder->set_defined_in (node->defined_in ());
- module->be_add_interface (excep_holder, node);
- module->set_has_nested_valuetype ();
+ reply_handler->set_defined_in (node->defined_in ());
+
+ // Insert the ami handler after the node, the
+ // exception holder will be placed between these two later.
+ module->be_add_interface (reply_handler, node);
+
// Remember from whom we were cloned
- excep_holder->original_interface (node);
- // Set the strategy
- be_interface_strategy *old_strategy =
- excep_holder->set_strategy (new be_interface_ami_exception_holder_strategy (excep_holder));
- if (old_strategy)
- delete old_strategy;
+ reply_handler->original_interface (node);
}
else
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_ami_pre_proc::"
"visit_interface - "
- "creating the exception holder failed\n"),
+ "creating the reply handler failed\n"),
-1);
}
+ // Set the proper strategy
+ be_interface_strategy *old_strategy =
+ node->set_strategy (new be_interface_ami_strategy (node));
+ if (old_strategy)
+ delete old_strategy;
- be_interface *reply_handler = this->create_reply_handler (node,
- excep_holder);
- if (reply_handler)
+ if (excep_holder)
{
- reply_handler->set_defined_in (node->defined_in ());
- module->be_add_interface (reply_handler, node);
+ excep_holder->set_defined_in (node->defined_in ());
+ // Insert the exception holder after the original node,
+ // this way we ensure that it is *before* the
+ // ami handler, which is the way we want to have it.
+ module->be_add_interface (excep_holder, node);
+ module->set_has_nested_valuetype ();
// Remember from whom we were cloned
- reply_handler->original_interface (node);
+ excep_holder->original_interface (node);
+ // Set the strategy
+ be_interface_strategy *old_strategy =
+ excep_holder->set_strategy (new be_interface_ami_exception_holder_strategy (excep_holder));
+ if (old_strategy)
+ delete old_strategy;
}
else
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_ami_pre_proc::"
"visit_interface - "
- "creating the reply handler failed\n"),
+ "creating the exception holder failed\n"),
-1);
}
+
if (this->visit_scope (node) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
@@ -154,6 +168,10 @@ be_visitor_ami_pre_proc::visit_operation (be_operation *node)
{
ACE_DEBUG ((LM_DEBUG, "be_visitor_ami_pre_proc::visit_operation\n"));
+ if (node->flags () == AST_Operation::OP_oneway)
+ // We do nothing for oneways!
+ return 0;
+
be_operation *sendc_marshaling =
this->create_sendc_operation (node,
0); // for arguments = FALSE
@@ -229,6 +247,7 @@ be_valuetype *
be_visitor_ami_pre_proc::create_exception_holder (be_interface *node)
{
ACE_DEBUG ((LM_DEBUG, "be_visitor_ami_pre_proc::create_exception_holder\n"));
+
// Create a virtual module named "Messaging" and an valuetype "ExceptionHolder"
// from which we inherit.
UTL_ScopedName *inherit_name =
@@ -323,7 +342,7 @@ be_visitor_ami_pre_proc::create_exception_holder (be_interface *node)
}
}
- else
+ else
{
this->create_raise_operation (op,
excep_holder,
@@ -468,6 +487,20 @@ be_visitor_ami_pre_proc::create_raise_operation (be_decl *node,
be_valuetype *excep_holder,
Operation_Kind operation_kind)
{
+ ACE_DEBUG ((LM_DEBUG, "be_visitor_ami_pre_proc::create_raise_operation\n"));
+
+ be_operation *orig_op = 0;
+ if (operation_kind == NORMAL)
+ {
+ orig_op = be_operation::narrow_from_decl (node);
+ if (orig_op)
+ {
+ if (orig_op->flags () == AST_Operation::OP_oneway)
+ // We do nothing for oneways!
+ return 0;
+ }
+ }
+
// Create the return type, which is "void"
be_predefined_type *rt = new be_predefined_type (AST_PredefinedType::PT_void,
new UTL_ScopedName
@@ -506,7 +539,6 @@ be_visitor_ami_pre_proc::create_raise_operation (be_decl *node,
if (operation_kind == NORMAL)
{
- be_operation *orig_op = be_operation::narrow_from_decl (node);
if (orig_op)
{
// Copy the exceptions.
@@ -536,6 +568,11 @@ be_visitor_ami_pre_proc::create_sendc_operation (be_operation *node,
int for_arguments)
{
ACE_DEBUG ((LM_DEBUG, "be_visitor_ami_pre_proc::create_sendc_operation\n"));
+
+ if (node->flags () == AST_Operation::OP_oneway)
+ // We do nothing for oneways!
+ return 0;
+
// Create the return type, which is "void"
be_predefined_type *rt = new be_predefined_type (AST_PredefinedType::PT_void,
new UTL_ScopedName
@@ -652,11 +689,14 @@ int
be_visitor_ami_pre_proc::create_reply_handler_operation (be_operation *node,
be_interface *reply_handler)
{
+ ACE_DEBUG ((LM_DEBUG, "be_visitor_ami_pre_proc::create_reply_handler_operation\n"));
if (!node)
return -1;
+ if (node->flags () == AST_Operation::OP_oneway)
+ // We do nothing for oneways!
+ return 0;
- ACE_DEBUG ((LM_DEBUG, "be_visitor_ami_pre_proc::create_reply_handler_operation\n"));
// Create the return type, which is "void"
be_predefined_type *rt = new be_predefined_type (AST_PredefinedType::PT_void,
new UTL_ScopedName
@@ -766,9 +806,15 @@ be_visitor_ami_pre_proc::create_excep_operation (be_operation *node,
be_interface *reply_handler,
be_valuetype *excep_holder)
{
+ ACE_DEBUG ((LM_DEBUG, "be_visitor_ami_pre_proc::create_excep_operation\n"));
+
if (!node)
return -1;
- ACE_DEBUG ((LM_DEBUG, "be_visitor_ami_pre_proc::create_excep_operation\n"));
+
+ if (node->flags () == AST_Operation::OP_oneway)
+ // We do nothing for oneways!
+ return 0;
+
// Create the return type, which is "void"
be_predefined_type *rt = new be_predefined_type (AST_PredefinedType::PT_void,
new UTL_ScopedName
@@ -845,26 +891,40 @@ be_visitor_ami_pre_proc::visit_scope (be_scope *node)
}
delete si;
}
-
+
+ AST_Decl **elements = new AST_Decl *[number_of_elements];
+
+ {
+ int position = 0;
+ // initialize an iterator to iterate thru our scope
+ UTL_ScopeActiveIterator *si;
+ ACE_NEW_RETURN (si,
+ UTL_ScopeActiveIterator (node,
+ UTL_Scope::IK_decls),
+ -1);
+
+ while (!si->is_done ())
+ {
+ elements[position++] = si->item ();
+ si->next ();
+ }
+ delete si;
+ }
+
+
ACE_DEBUG ((LM_DEBUG,
"be_visitor_ami_pre_proc::visit_scope - %d elements\n",
number_of_elements));
- // initialize an iterator to iterate thru our scope
- UTL_ScopeActiveIterator *si;
- ACE_NEW_RETURN (si,
- UTL_ScopeActiveIterator (node,
- UTL_Scope::IK_decls),
- -1);
int elem_number = 0;
// continue until each element is visited
while (elem_number < number_of_elements)
{
- AST_Decl *d = si->item ();
+ AST_Decl *d = elements[elem_number];
if (!d)
{
- delete si;
+ delete [] elements;
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_scope::visit_scope - "
"bad node in this scope\n"), -1);
@@ -886,16 +946,14 @@ be_visitor_ami_pre_proc::visit_scope (be_scope *node)
// Send the visitor.
if (bd == 0 || bd->accept (this) == -1)
{
- delete si;
+ delete [] elements;
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_scope::visit_scope - "
"codegen for scope failed\n"), -1);
}
-
- si->next ();
} // end of while loop
- delete si;
+ delete [] elements;
} // end of if
return 0;