summaryrefslogtreecommitdiff
path: root/TAO/TAO_IDL/be/be_visitor_interface/interceptors_cs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'TAO/TAO_IDL/be/be_visitor_interface/interceptors_cs.cpp')
-rw-r--r--TAO/TAO_IDL/be/be_visitor_interface/interceptors_cs.cpp99
1 files changed, 85 insertions, 14 deletions
diff --git a/TAO/TAO_IDL/be/be_visitor_interface/interceptors_cs.cpp b/TAO/TAO_IDL/be/be_visitor_interface/interceptors_cs.cpp
index b5cc2b9adc7..d22df743fd8 100644
--- a/TAO/TAO_IDL/be/be_visitor_interface/interceptors_cs.cpp
+++ b/TAO/TAO_IDL/be/be_visitor_interface/interceptors_cs.cpp
@@ -18,34 +18,33 @@
//
// ============================================================================
-#include "idl.h"
-#include "idl_extern.h"
-#include "be.h"
-
-#include "be_visitor_interface.h"
-
-ACE_RCSID(be_visitor_interface, interceptors_cs, "$Id$")
-
+ACE_RCSID (be_visitor_interface,
+ interceptors_cs,
+ "$Id$")
// ************************************************************
// interceptor class in header
// ************************************************************
-
-be_visitor_interface_interceptors_cs::be_visitor_interface_interceptors_cs
-(be_visitor_context *ctx)
+be_visitor_interface_interceptors_cs::be_visitor_interface_interceptors_cs (
+ be_visitor_context *ctx
+ )
: be_visitor_interface (ctx)
{
}
-be_visitor_interface_interceptors_cs::~be_visitor_interface_interceptors_cs (void)
+be_visitor_interface_interceptors_cs::~be_visitor_interface_interceptors_cs (
+ void
+ )
{
}
int be_visitor_interface_interceptors_cs::visit_interface (be_interface *node)
{
if (node->is_local ())
- return 0;
+ {
+ return 0;
+ }
TAO_OutStream *os = this->ctx_->stream ();
@@ -53,7 +52,11 @@ int be_visitor_interface_interceptors_cs::visit_interface (be_interface *node)
// elements of its scope. We depend on the front-end to have made sure
// that only legal syntactic elements appear in our scope.
+ *os << "// TAO_IDL - Generated from" << be_nl
+ << "// " << __FILE__ << ":" << __LINE__ << be_nl;
+
os->indent ();
+
*os << "\n#if (TAO_HAS_INTERCEPTORS == 1)" << be_nl;
// Generate code for the interface definition by traversing thru the
@@ -67,11 +70,79 @@ int be_visitor_interface_interceptors_cs::visit_interface (be_interface *node)
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_interface_ch::"
"visit_interface - "
- "codegen for scope failed\n"), -1);
+ "codegen for scope failed\n"),
+ -1);
}
*os << "#endif /* TAO_HAS_INTERCEPTORS */\n";
return 0;
+}
+
+int
+be_visitor_interface_interceptors_cs::gen_abstract_ops_helper (
+ be_interface *node,
+ be_interface *base,
+ TAO_OutStream *os
+ )
+{
+ if (node == base)
+ {
+ return 0;
+ }
+
+ AST_Decl *d = 0;
+ be_visitor_context ctx;
+ ctx.stream (os);
+
+ for (UTL_ScopeActiveIterator si (base, UTL_Scope::IK_decls);
+ !si.is_done ();
+ si.next ())
+ {
+ d = si.item ();
+
+ if (d == 0)
+ {
+ ACE_ERROR_RETURN ((LM_ERROR,
+ "(%N:%l) be_visitor_interface_interceptors_cs::"
+ "abstract_base_ops_helper - "
+ "bad node in this scope\n"),
+ -1);
+ }
+
+ AST_Decl::NodeType nt = d->node_type ();
+
+ if (d->node_type () == AST_Decl::NT_op)
+ {
+ UTL_ScopedName *item_new_name = 0;
+ ACE_NEW_RETURN (item_new_name,
+ UTL_ScopedName (d->local_name ()->copy (),
+ 0),
+ -1);
+
+ UTL_ScopedName *base = (UTL_ScopedName *)node->name ()->copy ();
+ base->nconc (item_new_name);
+
+ AST_Operation *op = AST_Operation::narrow_from_decl (d);
+ be_operation new_op (op->return_type (),
+ op->flags (),
+ 0,
+ op->is_local (),
+ op->is_abstract ());
+ new_op.set_defined_in (node);
+ be_visitor_interface::add_abstract_op_args (op,
+ new_op);
+ new_op.set_name (base);
+ ctx.state (TAO_CodeGen::TAO_OPERATION_INTERCEPTORS_CS);
+ be_visitor_operation_interceptors_cs op_visitor (&ctx);
+ op_visitor.visit_operation (&new_op);
+
+ base->destroy ();
+ delete base;
+ base = 0;
+ }
+ }
+ return 0;
}
+