diff options
Diffstat (limited to 'TAO/TAO_IDL/be/be_visitor_union/union_ch.cpp')
-rw-r--r-- | TAO/TAO_IDL/be/be_visitor_union/union_ch.cpp | 285 |
1 files changed, 144 insertions, 141 deletions
diff --git a/TAO/TAO_IDL/be/be_visitor_union/union_ch.cpp b/TAO/TAO_IDL/be/be_visitor_union/union_ch.cpp index e879b5675fd..7a60fc6bbbb 100644 --- a/TAO/TAO_IDL/be/be_visitor_union/union_ch.cpp +++ b/TAO/TAO_IDL/be/be_visitor_union/union_ch.cpp @@ -37,192 +37,195 @@ be_visitor_union_ch::~be_visitor_union_ch (void) int be_visitor_union_ch::visit_union (be_union *node) { + if (node->cli_hdr_gen () || node->imported ()) + { + return 0; + } + // Instantiate a visitor context with a copy of our context. This info // will be modified based on what type of node we are visiting. be_visitor_context ctx (*this->ctx_); ctx.node (node); - if (!node->cli_hdr_gen () && !node->imported ()) - { - TAO_OutStream *os = this->ctx_->stream (); + TAO_OutStream *os = this->ctx_->stream (); - // Generate the ifdefined macro for the union type. - os->gen_ifdef_macro (node->flat_name ()); + *os << be_nl << "// TAO_IDL - Generated from" << be_nl + << "// " << __FILE__ << ":" << __LINE__ << be_nl; - *os << "class " << node->local_name () << "_var;" << be_nl << be_nl; + // Generate the ifdefined macro for the union type. + os->gen_ifdef_macro (node->flat_name ()); - *os << "class " << be_global->stub_export_macro () << " " - << node->local_name () << be_nl - << "{" << be_nl - << "public:" << be_idt_nl + *os << "class " << node->local_name () << "_var;" << be_nl << be_nl; - // Generate default and copy constructors. - << node->local_name () << " (void);" << be_nl - << node->local_name () << " (const " << node->local_name () - << " &);" << be_nl - // Generate destructor. - << "~" << node->local_name () << " (void);" << be_nl; + *os << "class " << be_global->stub_export_macro () << " " + << node->local_name () << be_nl + << "{" << be_nl + << "public:" << be_idt_nl - *os << "static void _tao_any_destructor (void*);" - << be_nl << be_nl; + // Generate default and copy constructors. + << node->local_name () << " (void);" << be_nl + << node->local_name () << " (const " << node->local_name () + << " &);" << be_nl + // Generate destructor. + << "~" << node->local_name () << " (void);" << be_nl; - // Generate assignment operator. - *os << node->local_name () << " &operator= (const " - << node->local_name () << " &);" << be_nl << be_nl; + *os << "static void _tao_any_destructor (void*);" + << be_nl << be_nl; - // Retrieve the disriminant type. - be_type *bt = be_type::narrow_from_decl (node->disc_type ()); + // Generate assignment operator. + *os << node->local_name () << " &operator= (const " + << node->local_name () << " &);" << be_nl << be_nl; - if (!bt) - { - ACE_ERROR_RETURN ((LM_ERROR, - "(%N:%l) be_visitor_union_ch::" - "visit_union - " - "bad disciminant type\n"), - -1); - } + // Retrieve the disriminant type. + be_type *bt = be_type::narrow_from_decl (node->disc_type ()); - // The discriminant type may have to be defined here if it was an enum - // declaration inside of the union statement. + if (!bt) + { + ACE_ERROR_RETURN ((LM_ERROR, + "(%N:%l) be_visitor_union_ch::" + "visit_union - " + "bad disciminant type\n"), + -1); + } - ctx.state (TAO_CodeGen::TAO_UNION_DISCTYPEDEFN_CH); - be_visitor_union_discriminant_ch ud_visitor (&ctx); + // The discriminant type may have to be defined here if it was an enum + // declaration inside of the union statement. - if (bt->accept (&ud_visitor) == -1) - { - ACE_ERROR_RETURN ((LM_ERROR, - "(%N:%l) be_visitor_union_ch::" - " visit_union - " - "codegen for discriminant failed\n"), - -1); - } + ctx.state (TAO_CodeGen::TAO_UNION_DISCTYPEDEFN_CH); + be_visitor_union_discriminant_ch ud_visitor (&ctx); - // Generate the _var_type typedef. - *os << "typedef " << node->local_name () << "_var _var_type;" - << be_nl << be_nl; + if (bt->accept (&ud_visitor) == -1) + { + ACE_ERROR_RETURN ((LM_ERROR, + "(%N:%l) be_visitor_union_ch::" + " visit_union - " + "codegen for discriminant failed\n"), + -1); + } - // Now generate the public defn for the union branch members. For this, - // set our state to reflect what we are aiming to do. - this->ctx_->state (TAO_CodeGen::TAO_UNION_PUBLIC_CH); + // Generate the _var_type typedef. + *os << "typedef " << node->local_name () << "_var _var_type;" + << be_nl << be_nl; - if (this->visit_scope (node) == -1) - { - ACE_ERROR_RETURN ((LM_ERROR, - "(%N:%l) be_visitor_union_ch::" - "visit_union - " - "codegen for public defn of union members\n"), - -1); - } + // Now generate the public defn for the union branch members. For this, + // set our state to reflect what we are aiming to do. + this->ctx_->state (TAO_CodeGen::TAO_UNION_PUBLIC_CH); - // Now check if we need to generate the _default () method. - be_union::DefaultValue dv; + if (this->visit_scope (node) == -1) + { + ACE_ERROR_RETURN ((LM_ERROR, + "(%N:%l) be_visitor_union_ch::" + "visit_union - " + "codegen for public defn of union members\n"), + -1); + } - if (node->default_value (dv) == -1) - { - ACE_ERROR_RETURN ((LM_ERROR, - "(%N:%l) be_visitor_union_ch::" - "visit_union - " - "computing default value failed\n"), - -1); - } + // Now check if we need to generate the _default () method. + be_union::DefaultValue dv; - if ((dv.computed_ != 0) && (node->default_index () == -1)) - { - // Only if all cases are not covered AND there is no explicit - // default, we get the _default () method. - *os << "void _default (void);"; - } + if (node->default_value (dv) == -1) + { + ACE_ERROR_RETURN ((LM_ERROR, + "(%N:%l) be_visitor_union_ch::" + "visit_union - " + "computing default value failed\n"), + -1); + } + + if ((dv.computed_ != 0) && (node->default_index () == -1)) + { + // Only if all cases are not covered AND there is no explicit + // default, we get the _default () method. + *os << "void _default (void);"; + } - *os << be_uidt_nl; + *os << be_uidt_nl; - // Now generate the private data members of the union. - *os << "private:" << be_idt_nl; - *os << bt->nested_type_name (node) << " disc_;" << be_nl; - *os << bt->nested_type_name (node) << " holder_;" << be_nl << be_nl; - // Emit the ACE_NESTED_CLASS macro. + // Now generate the private data members of the union. + *os << "private:" << be_idt_nl; + *os << bt->nested_type_name (node) << " disc_;" << be_nl; + *os << bt->nested_type_name (node) << " holder_;" << be_nl << be_nl; + // Emit the ACE_NESTED_CLASS macro. - // The members are inside of a union. - *os << "union" << be_nl; - *os << "{" << be_idt_nl; + // The members are inside of a union. + *os << "union" << be_nl; + *os << "{" << be_idt_nl; - this->ctx_->state (TAO_CodeGen::TAO_UNION_PRIVATE_CH); + this->ctx_->state (TAO_CodeGen::TAO_UNION_PRIVATE_CH); - if (this->visit_scope (node) == -1) + if (this->visit_scope (node) == -1) + { + ACE_ERROR_RETURN ((LM_ERROR, + "(%N:%l) be_visitor_union_ch::" + "visit_union - " + "codegen for private members of union\n"), + -1); + } + + *os << be_uidt_nl; + *os << "} u_;" << be_nl << be_nl; + + // The reset method (TAO extension). + *os << "// TAO extension." << be_nl; + *os << "void _reset (" << bt->nested_type_name (node) + << ", CORBA::Boolean /* finalize */);" << be_nl; + *os << "// Frees any allocated storage." << be_uidt_nl; + *os << "}; //" << node->name () << be_nl << be_nl; + + if (be_global->tc_support ()) + { + ctx = *this->ctx_; + ctx.state (TAO_CodeGen::TAO_TYPECODE_DECL); + be_visitor_typecode_decl tc_visitor (&ctx); + + if (node->accept (&tc_visitor) == -1) { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_visitor_union_ch::" "visit_union - " - "codegen for private members of union\n"), + "TypeCode declaration failed\n"), -1); } + } - *os << be_uidt_nl; - *os << "} u_;" << be_nl << be_nl; + os->gen_endif (); - // The reset method (TAO extension). - *os << "// TAO extension." << be_nl; - *os << "void _reset (" << bt->nested_type_name (node) - << ", CORBA::Boolean /* finalize */);" << be_nl; - *os << "// Frees any allocated storage." << be_nl << be_nl; - *os << "}; //" << node->name () << be_nl << be_nl; + // Generate the ifdefined macro for the _var type. + os->gen_ifdef_macro (node->flat_name (), "_var"); - if (be_global->tc_support ()) - { - ctx = *this->ctx_; - ctx.state (TAO_CodeGen::TAO_TYPECODE_DECL); - be_visitor_typecode_decl tc_visitor (&ctx); - - if (node->accept (&tc_visitor) == -1) - { - ACE_ERROR_RETURN ((LM_ERROR, - "(%N:%l) be_visitor_union_ch::" - "visit_union - " - "TypeCode declaration failed\n"), - -1); - } - } + // Generate var definition. + if (node->gen_var_defn () == -1) + { + ACE_ERROR_RETURN ((LM_ERROR, + "(%N:%l) be_visitor_union_ch::" + "visit_union - " + "codegen for _var\n"), -1); + } - os->gen_endif (); + os->gen_endif (); - // Generate the ifdefined macro for the _var type. - os->gen_ifdef_macro (node->flat_name (), "_var"); + // Generate the ifdefined macro for the array type. + os->gen_ifdef_macro (node->flat_name (), "_out"); - // Generate var definition. - if (node->gen_var_defn () == -1) + // A class is generated for an out defn only for a variable + // length struct. + if (node->size_type () == AST_Type::VARIABLE) + { + if (node->gen_out_defn () == -1) { ACE_ERROR_RETURN ((LM_ERROR, "(%N:%l) be_visitor_union_ch::" "visit_union - " - "codegen for _var\n"), -1); - } - - os->gen_endif (); - - // Generate the ifdefined macro for the array type. - os->gen_ifdef_macro (node->flat_name (), "_out"); - - // A class is generated for an out defn only for a variable - // length struct. - if (node->size_type () == AST_Type::VARIABLE) - { - if (node->gen_out_defn () == -1) - { - ACE_ERROR_RETURN ((LM_ERROR, - "(%N:%l) be_visitor_union_ch::" - "visit_union - " - "codegen for _out\n"), -1); - } - } - else - { - *os << "typedef " << node->local_name () << " &" - << node->local_name () << "_out;" << be_nl << be_nl; + "codegen for _out\n"), -1); } - - os->gen_endif (); - - node->cli_hdr_gen (I_TRUE); + } + else + { + *os << "typedef " << node->local_name () << " &" + << node->local_name () << "_out;" << be_nl << be_nl; } + os->gen_endif (); + node->cli_hdr_gen (I_TRUE); return 0; } |