diff options
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.cpp | 99 |
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; } + |