diff options
Diffstat (limited to 'TAO/TAO_IDL/be/be_visitor_attribute/attribute.cpp')
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_attribute/attribute.cpp | 451 |
1 files changed, 314 insertions, 137 deletions
diff --git a/TAO/TAO_IDL/be/be_visitor_attribute/attribute.cpp b/TAO/TAO_IDL/be/be_visitor_attribute/attribute.cpp index 709f3716673..40101b9fe37 100644 --- a/TAO/TAO_IDL/be/be_visitor_attribute/attribute.cpp +++ b/TAO/TAO_IDL/be/be_visitor_attribute/attribute.cpp @@ -18,13 +18,9 @@ // // ============================================================================ -#include "idl.h" -#include "idl_extern.h" -#include "be.h" - -#include "be_visitor_attribute.h" - -ACE_RCSID(be_visitor_attribute, attribute, "$Id$") +ACE_RCSID (be_visitor_attribute, + attribute, + "$Id$") // Attribute gets mapped to one or possibly two operations based on whether @@ -65,8 +61,8 @@ be_visitor_attribute::~be_visitor_attribute (void) int be_visitor_attribute::visit_attribute (be_attribute *node) { - this->ctx_->node (node); // save the node - this->ctx_->attribute (node); // save this attribute node + this->ctx_->node (node); + this->ctx_->attribute (node); // first the "get" operation @@ -80,15 +76,15 @@ be_visitor_attribute::visit_attribute (be_attribute *node) get_op.set_defined_in (node->defined_in ()); // Get the strategy from the attribute and hand it over - // to the operation + // to the operation. delete get_op.set_strategy (node->get_get_strategy ()); be_visitor_context ctx (*this->ctx_); + int status = 1; - // this switch statement eliminates the need for different classes that have - // exactly the same code except different states. switch (this->ctx_->state ()) { + // These two cases are the only ones that could involved a strategy. case TAO_CodeGen::TAO_ATTRIBUTE_CH: ctx.state (TAO_CodeGen::TAO_OPERATION_CH); break; @@ -96,73 +92,154 @@ be_visitor_attribute::visit_attribute (be_attribute *node) ctx.state (TAO_CodeGen::TAO_OPERATION_CS); break; case TAO_CodeGen::TAO_ATTRIBUTE_SH: - ctx.state (TAO_CodeGen::TAO_OPERATION_SH); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_SH); + be_visitor_operation_sh visitor (&ctx); + status = get_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_IH: - ctx.state (TAO_CodeGen::TAO_OPERATION_IH); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_IH); + be_visitor_operation_ih visitor (&ctx); + status = get_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_SS: - ctx.state (TAO_CodeGen::TAO_OPERATION_SS); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_SS); + be_visitor_operation_ss visitor (&ctx); + status = get_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_IS: - ctx.state (TAO_CodeGen::TAO_OPERATION_IS); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_IS); + be_visitor_operation_is visitor (&ctx); + status = get_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_THRU_POA_COLLOCATED_SH: - ctx.state (TAO_CodeGen::TAO_OPERATION_THRU_POA_COLLOCATED_SH); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_THRU_POA_COLLOCATED_SH); + be_visitor_operation_thru_poa_collocated_sh visitor (&ctx); + status = get_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_THRU_POA_COLLOCATED_SS: - ctx.state (TAO_CodeGen::TAO_OPERATION_THRU_POA_COLLOCATED_SS); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_THRU_POA_COLLOCATED_SS); + be_visitor_operation_thru_poa_collocated_ss visitor (&ctx); + status = get_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_DIRECT_COLLOCATED_SH: - ctx.state (TAO_CodeGen::TAO_OPERATION_DIRECT_COLLOCATED_SH); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_DIRECT_COLLOCATED_SH); + be_visitor_operation_direct_collocated_sh visitor (&ctx); + status = get_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_DIRECT_COLLOCATED_SS: - ctx.state (TAO_CodeGen::TAO_OPERATION_DIRECT_COLLOCATED_SS); - break; - + { + ctx.state (TAO_CodeGen::TAO_OPERATION_DIRECT_COLLOCATED_SS); + be_visitor_operation_direct_collocated_ss visitor (&ctx); + status = get_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_BASE_PROXY_IMPL_CH: - ctx.state (TAO_CodeGen::TAO_OPERATION_BASE_PROXY_IMPL_CH); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_BASE_PROXY_IMPL_CH); + be_visitor_operation_base_proxy_impl_ch visitor (&ctx); + status = get_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_PROXY_IMPL_XH: - ctx.state (TAO_CodeGen::TAO_OPERATION_PROXY_IMPL_XH); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_PROXY_IMPL_XH); + be_visitor_operation_proxy_impl_xh visitor (&ctx); + status = get_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_REMOTE_PROXY_IMPL_CS: - ctx.state (TAO_CodeGen::TAO_OPERATION_REMOTE_PROXY_IMPL_CS); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_REMOTE_PROXY_IMPL_CS); + be_visitor_operation_remote_proxy_impl_cs visitor (&ctx); + status = get_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_THRU_POA_PROXY_IMPL_SS: - ctx.state (TAO_CodeGen::TAO_OPERATION_THRU_POA_PROXY_IMPL_SS); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_THRU_POA_PROXY_IMPL_SS); + be_visitor_operation_thru_poa_proxy_impl_ss visitor (&ctx); + status = get_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_DIRECT_PROXY_IMPL_SS: - ctx.state (TAO_CodeGen::TAO_OPERATION_DIRECT_PROXY_IMPL_SS); - break; - + { + ctx.state (TAO_CodeGen::TAO_OPERATION_DIRECT_PROXY_IMPL_SS); + be_visitor_operation_direct_proxy_impl_ss visitor (&ctx); + status = get_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_SMART_PROXY_CH: - ctx.state (TAO_CodeGen::TAO_OPERATION_SMART_PROXY_CH); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_SMART_PROXY_CH); + be_visitor_operation_smart_proxy_ch visitor (&ctx); + status = get_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_SMART_PROXY_CS: - ctx.state (TAO_CodeGen::TAO_OPERATION_SMART_PROXY_CS); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_SMART_PROXY_CS); + be_visitor_operation_smart_proxy_cs visitor (&ctx); + status = get_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_INTERCEPTORS_CH: - ctx.state (TAO_CodeGen::TAO_OPERATION_INTERCEPTORS_CH); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_INTERCEPTORS_CH); + be_visitor_operation_interceptors_ch visitor (&ctx); + status = get_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_INTERCEPTORS_CS: - ctx.state (TAO_CodeGen::TAO_OPERATION_INTERCEPTORS_CS); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_INTERCEPTORS_CS); + be_visitor_operation_interceptors_cs visitor (&ctx); + status = get_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_INTERCEPTORS_SH: - ctx.state (TAO_CodeGen::TAO_OPERATION_INTERCEPTORS_SH); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_INTERCEPTORS_SH); + be_visitor_operation_interceptors_sh visitor (&ctx); + status = get_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_INTERCEPTORS_SS: - ctx.state (TAO_CodeGen::TAO_OPERATION_INTERCEPTORS_SS); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_INTERCEPTORS_SS); + be_visitor_operation_interceptors_ss visitor (&ctx); + status = get_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_TIE_SH: - ctx.state (TAO_CodeGen::TAO_OPERATION_TIE_SH); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_TIE_SH); + be_visitor_operation_tie_sh visitor (&ctx); + status = get_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_TIE_SI: - ctx.state (TAO_CodeGen::TAO_OPERATION_TIE_SI); - break; - + { + ctx.state (TAO_CodeGen::TAO_OPERATION_TIE_SI); + be_visitor_operation_tie_si visitor (&ctx); + status = get_op.accept (&visitor); + break; + } default: - // error + // Error. ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_visitor_attribute::" "visit_attribute - " @@ -170,28 +247,19 @@ be_visitor_attribute::visit_attribute (be_attribute *node) -1); } - // Change the state depending on the kind of node strategy - ctx.state (get_op.next_state (ctx.state ())); - - be_visitor *visitor = tao_cg->make_visitor (&ctx); - - if (!visitor || (get_op.accept (visitor) == -1)) + if (status == -1) { - delete visitor; ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_visitor_attribute::" "visit_attribute - " "codegen for get_attribute failed\n"), -1); } - - delete visitor; - visitor = 0; - - if (get_op.has_extra_code_generation (ctx.state ())) + else if (status == 1) { - // Change the state depending on the kind of node strategy - ctx.state (get_op.next_state (ctx.state (), 1)); + // Change the state depending on the kind of node strategy. + ctx.state (get_op.next_state (ctx.state ())); + be_visitor *visitor = tao_cg->make_visitor (&ctx); if (!visitor || (get_op.accept (visitor) == -1)) @@ -206,6 +274,26 @@ be_visitor_attribute::visit_attribute (be_attribute *node) delete visitor; visitor = 0; + + if (get_op.has_extra_code_generation (ctx.state ())) + { + // Change the state depending on the kind of node strategy. + ctx.state (get_op.next_state (ctx.state (), 1)); + be_visitor *visitor = tao_cg->make_visitor (&ctx); + + if (!visitor || (get_op.accept (visitor) == -1)) + { + delete visitor; + ACE_ERROR_RETURN ((LM_ERROR, + "(%N:%l) be_visitor_attribute::" + "visit_attribute - " + "codegen for get_attribute failed\n"), + -1); + } + + delete visitor; + visitor = 0; + } } // Do nothing for readonly attributes. @@ -214,28 +302,22 @@ be_visitor_attribute::visit_attribute (be_attribute *node) return 0; } - // Create the set method. - Identifier *id = 0; - UTL_ScopedName *sn = 0; - - ACE_NEW_RETURN (id, - Identifier ("void"), - -1); + status = 1; - ACE_NEW_RETURN (sn, - UTL_ScopedName (id, - 0), - -1); + // Create the set method. + Identifier id ("void"); + UTL_ScopedName sn (&id, + 0); - // the return type is "void" + // The return type is "void". be_predefined_type rt (AST_PredefinedType::PT_void, - sn); - // argument type is the same as the attribute type + &sn); + // Argument type is the same as the attribute type. be_argument arg (AST_Argument::dir_IN, node->field_type (), node->name ()); arg.set_name ((UTL_IdList *) node->name ()->copy ()); - // create the operation + // Create the operation. be_operation set_op (&rt, AST_Operation::OP_noflags, node->name (), @@ -250,10 +332,11 @@ be_visitor_attribute::visit_attribute (be_attribute *node) delete set_op.set_strategy (node->get_set_strategy ()); ctx = *this->ctx_; - // this switch statement eliminates the need for different classes that have - // exactly the same code except different states. + status = 1; + switch (this->ctx_->state ()) { + // These two cases are the only ones that could involved a strategy. case TAO_CodeGen::TAO_ATTRIBUTE_CH: ctx.state (TAO_CodeGen::TAO_OPERATION_CH); break; @@ -261,72 +344,154 @@ be_visitor_attribute::visit_attribute (be_attribute *node) ctx.state (TAO_CodeGen::TAO_OPERATION_CS); break; case TAO_CodeGen::TAO_ATTRIBUTE_SH: - ctx.state (TAO_CodeGen::TAO_OPERATION_SH); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_SH); + be_visitor_operation_sh visitor (&ctx); + status = set_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_IH: - ctx.state (TAO_CodeGen::TAO_OPERATION_IH); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_IH); + be_visitor_operation_ih visitor (&ctx); + status = set_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_SS: - ctx.state (TAO_CodeGen::TAO_OPERATION_SS); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_SS); + be_visitor_operation_ss visitor (&ctx); + status = set_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_IS: - ctx.state (TAO_CodeGen::TAO_OPERATION_IS); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_IS); + be_visitor_operation_is visitor (&ctx); + status = set_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_THRU_POA_COLLOCATED_SH: - ctx.state (TAO_CodeGen::TAO_OPERATION_THRU_POA_COLLOCATED_SH); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_THRU_POA_COLLOCATED_SH); + be_visitor_operation_thru_poa_collocated_sh visitor (&ctx); + status = set_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_THRU_POA_COLLOCATED_SS: - ctx.state (TAO_CodeGen::TAO_OPERATION_THRU_POA_COLLOCATED_SS); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_THRU_POA_COLLOCATED_SS); + be_visitor_operation_thru_poa_collocated_ss visitor (&ctx); + status = set_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_DIRECT_COLLOCATED_SH: - ctx.state (TAO_CodeGen::TAO_OPERATION_DIRECT_COLLOCATED_SH); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_DIRECT_COLLOCATED_SH); + be_visitor_operation_direct_collocated_sh visitor (&ctx); + status = set_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_DIRECT_COLLOCATED_SS: - ctx.state (TAO_CodeGen::TAO_OPERATION_DIRECT_COLLOCATED_SS); - break; - + { + ctx.state (TAO_CodeGen::TAO_OPERATION_DIRECT_COLLOCATED_SS); + be_visitor_operation_direct_collocated_ss visitor (&ctx); + status = set_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_BASE_PROXY_IMPL_CH: - ctx.state (TAO_CodeGen::TAO_OPERATION_BASE_PROXY_IMPL_CH); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_BASE_PROXY_IMPL_CH); + be_visitor_operation_base_proxy_impl_ch visitor (&ctx); + status = set_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_PROXY_IMPL_XH: - ctx.state (TAO_CodeGen::TAO_OPERATION_PROXY_IMPL_XH); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_PROXY_IMPL_XH); + be_visitor_operation_proxy_impl_xh visitor (&ctx); + status = set_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_REMOTE_PROXY_IMPL_CS: - ctx.state (TAO_CodeGen::TAO_OPERATION_REMOTE_PROXY_IMPL_CS); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_REMOTE_PROXY_IMPL_CS); + be_visitor_operation_remote_proxy_impl_cs visitor (&ctx); + status = set_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_THRU_POA_PROXY_IMPL_SS: - ctx.state (TAO_CodeGen::TAO_OPERATION_THRU_POA_PROXY_IMPL_SS); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_THRU_POA_PROXY_IMPL_SS); + be_visitor_operation_thru_poa_proxy_impl_ss visitor (&ctx); + status = set_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_DIRECT_PROXY_IMPL_SS: - ctx.state (TAO_CodeGen::TAO_OPERATION_DIRECT_PROXY_IMPL_SS); - break; - case TAO_CodeGen::TAO_ATTRIBUTE_TIE_SH: - ctx.state (TAO_CodeGen::TAO_OPERATION_TIE_SH); - break; - case TAO_CodeGen::TAO_ATTRIBUTE_TIE_SI: - ctx.state (TAO_CodeGen::TAO_OPERATION_TIE_SI); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_DIRECT_PROXY_IMPL_SS); + be_visitor_operation_direct_proxy_impl_ss visitor (&ctx); + status = set_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_SMART_PROXY_CH: - ctx.state (TAO_CodeGen::TAO_OPERATION_SMART_PROXY_CH); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_SMART_PROXY_CH); + be_visitor_operation_smart_proxy_ch visitor (&ctx); + status = set_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_SMART_PROXY_CS: - ctx.state (TAO_CodeGen::TAO_OPERATION_SMART_PROXY_CS); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_SMART_PROXY_CS); + be_visitor_operation_smart_proxy_cs visitor (&ctx); + status = set_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_INTERCEPTORS_CH: - ctx.state (TAO_CodeGen::TAO_OPERATION_INTERCEPTORS_CH); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_INTERCEPTORS_CH); + be_visitor_operation_interceptors_ch visitor (&ctx); + status = set_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_INTERCEPTORS_CS: - ctx.state (TAO_CodeGen::TAO_OPERATION_INTERCEPTORS_CS); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_INTERCEPTORS_CS); + be_visitor_operation_interceptors_cs visitor (&ctx); + status = set_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_INTERCEPTORS_SH: - ctx.state (TAO_CodeGen::TAO_OPERATION_INTERCEPTORS_SH); - break; + { + ctx.state (TAO_CodeGen::TAO_OPERATION_INTERCEPTORS_SH); + be_visitor_operation_interceptors_sh visitor (&ctx); + status = set_op.accept (&visitor); + break; + } case TAO_CodeGen::TAO_ATTRIBUTE_INTERCEPTORS_SS: - ctx.state (TAO_CodeGen::TAO_OPERATION_INTERCEPTORS_SS); - break; - + { + ctx.state (TAO_CodeGen::TAO_OPERATION_INTERCEPTORS_SS); + be_visitor_operation_interceptors_ss visitor (&ctx); + status = set_op.accept (&visitor); + break; + } + case TAO_CodeGen::TAO_ATTRIBUTE_TIE_SH: + { + ctx.state (TAO_CodeGen::TAO_OPERATION_TIE_SH); + be_visitor_operation_tie_sh visitor (&ctx); + status = set_op.accept (&visitor); + break; + } + case TAO_CodeGen::TAO_ATTRIBUTE_TIE_SI: + { + ctx.state (TAO_CodeGen::TAO_OPERATION_TIE_SI); + be_visitor_operation_tie_si visitor (&ctx); + status = set_op.accept (&visitor); + break; + } default: - // error + // Error. ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_visitor_attribute::" "visit_attribute - " @@ -334,10 +499,22 @@ be_visitor_attribute::visit_attribute (be_attribute *node) -1); } + if (status == 0) + { + return 0; + } + else if (status == -1) + { + ACE_ERROR_RETURN ((LM_ERROR, + "(%N:%l) be_visitor_attribute::" + "visit_attribute - " + "codegen for get_attribute failed\n"), + -1); + } // Change the state depending on the kind of node strategy ctx.state (set_op.next_state (ctx.state ())); - visitor = tao_cg->make_visitor (&ctx); + be_visitor *visitor = tao_cg->make_visitor (&ctx); if (!visitor || (set_op.accept (visitor) == -1)) { |