be_produce.cpp

Go to the documentation of this file.
00001 // $Id: be_produce.cpp 76589 2007-01-25 18:04:11Z elliott_c $
00002 
00003 /*
00004 
00005 COPYRIGHT
00006 
00007 Copyright 1992, 1993, 1994 Sun Microsystems, Inc.  Printed in the United
00008 States of America.  All Rights Reserved.
00009 
00010 This product is protected by copyright and distributed under the following
00011 license restricting its use.
00012 
00013 The Interface Definition Language Compiler Front End (CFE) is made
00014 available for your use provided that you include this license and copyright
00015 notice on all media and documentation and the software program in which
00016 this product is incorporated in whole or part. You may copy and extend
00017 functionality (but may not remove functionality) of the Interface
00018 Definition Language CFE without charge, but you are not authorized to
00019 license or distribute it to anyone else except as part of a product or
00020 program developed by you or with the express written consent of Sun
00021 Microsystems, Inc. ("Sun").
00022 
00023 The names of Sun Microsystems, Inc. and any of its subsidiaries or
00024 affiliates may not be used in advertising or publicity pertaining to
00025 distribution of Interface Definition Language CFE as permitted herein.
00026 
00027 This license is effective until terminated by Sun for failure to comply
00028 with this license.  Upon termination, you shall destroy or return all code
00029 and documentation for the Interface Definition Language CFE.
00030 
00031 INTERFACE DEFINITION LANGUAGE CFE IS PROVIDED AS IS WITH NO WARRANTIES OF
00032 ANY KIND INCLUDING THE WARRANTIES OF DESIGN, MERCHANTIBILITY AND FITNESS
00033 FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR ARISING FROM A COURSE OF
00034 DEALING, USAGE OR TRADE PRACTICE.
00035 
00036 INTERFACE DEFINITION LANGUAGE CFE IS PROVIDED WITH NO SUPPORT AND WITHOUT
00037 ANY OBLIGATION ON THE PART OF Sun OR ANY OF ITS SUBSIDIARIES OR AFFILIATES
00038 TO ASSIST IN ITS USE, CORRECTION, MODIFICATION OR ENHANCEMENT.
00039 
00040 SUN OR ANY OF ITS SUBSIDIARIES OR AFFILIATES SHALL HAVE NO LIABILITY WITH
00041 RESPECT TO THE INFRINGEMENT OF COPYRIGHTS, TRADE SECRETS OR ANY PATENTS BY
00042 INTERFACE DEFINITION LANGUAGE CFE OR ANY PART THEREOF.
00043 
00044 IN NO EVENT WILL SUN OR ANY OF ITS SUBSIDIARIES OR AFFILIATES BE LIABLE FOR
00045 ANY LOST REVENUE OR PROFITS OR OTHER SPECIAL, INDIRECT AND CONSEQUENTIAL
00046 DAMAGES, EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
00047 
00048 Use, duplication, or disclosure by the government is subject to
00049 restrictions as set forth in subparagraph (c)(1)(ii) of the Rights in
00050 Technical Data and Computer Software clause at DFARS 252.227-7013 and FAR
00051 52.227-19.
00052 
00053 Sun, Sun Microsystems and the Sun logo are trademarks or registered
00054 trademarks of Sun Microsystems, Inc.
00055 
00056 SunSoft, Inc.
00057 2550 Garcia Avenue
00058 Mountain View, California  94043
00059 
00060 NOTE:
00061 
00062 SunOS, SunSoft, Sun, Solaris, Sun Microsystems or the Sun logo are
00063 trademarks or registered trademarks of Sun Microsystems, Inc.
00064 
00065  */
00066 
00067 // BE_produce.cc - Produce the work of the BE - does nothing in the
00068 //                 dummy BE
00069 
00070 #include "global_extern.h"
00071 #include "TAO_IFR_BE_Export.h"
00072 #include "be_extern.h"
00073 #include "fe_extern.h"
00074 #include "ast_root.h"
00075 #include "ifr_visitor_macro.h"
00076 #include "ifr_removing_visitor.h"
00077 #include "ifr_adding_visitor.h"
00078 
00079 ACE_RCSID (be,
00080            be_produce,
00081            "$Id: be_produce.cpp 76589 2007-01-25 18:04:11Z elliott_c $")
00082 
00083 // Clean up before exit, whether successful or not.
00084 TAO_IFR_BE_Export void
00085 BE_cleanup (void)
00086 {
00087   idl_global->destroy ();
00088 }
00089 
00090 // Abort this run of the BE.
00091 TAO_IFR_BE_Export void
00092 BE_abort (void)
00093 {
00094   ACE_ERROR ((LM_ERROR,
00095               ACE_TEXT ("Fatal Error - Aborting\n")));
00096 
00097   // BE_cleanup will be called after the exception is caught.
00098   throw FE_Bailout ();
00099 }
00100 
00101 void
00102 BE_create_holding_scope (void)
00103 {
00104   CORBA::ModuleDef_ptr scope = CORBA::ModuleDef::_nil ();
00105 
00106   // If we are multi-threaded, it may already be created.
00107   CORBA::Contained_var result =
00108     be_global->repository ()->lookup_id (be_global->holding_scope_name ());
00109 
00110   // Will live until the repository goes away for good.
00111   if (CORBA::is_nil (result.in ()))
00112     {
00113       scope =
00114         be_global->repository ()->create_module (
00115                                       be_global->holding_scope_name (),
00116                                       be_global->holding_scope_name (),
00117                                       "1.0"
00118                                     );
00119     }
00120   else
00121     {
00122       scope = CORBA::ModuleDef::_narrow (result.in ());
00123     }
00124 
00125   be_global->holding_scope (scope);
00126 }
00127 
00128 int
00129 BE_ifr_repo_init (void)
00130 {
00131   CORBA::Object_var object =
00132     be_global->orb ()->resolve_initial_references ("InterfaceRepository");
00133 
00134   if (CORBA::is_nil (object.in ()))
00135     {
00136       ACE_ERROR_RETURN ((
00137           LM_ERROR,
00138           ACE_TEXT ("Null objref from resolve_initial_references\n")
00139         ),
00140         -1
00141       );
00142     }
00143 
00144   CORBA::Repository_var repo =
00145     CORBA::Repository::_narrow (object.in ());
00146 
00147   if (CORBA::is_nil (repo.in ()))
00148     {
00149       ACE_ERROR_RETURN ((
00150           LM_ERROR,
00151           ACE_TEXT ("CORBA::Repository::_narrow failed\n")
00152         ),
00153         -1
00154       );
00155     }
00156 
00157   be_global->repository (repo._retn ());
00158 
00159   return 0;
00160 }
00161 
00162 // Do the work of this BE. This is the starting point for code generation.
00163 TAO_IFR_BE_Export void
00164 BE_produce (void)
00165 {
00166   try
00167     {
00168       int status = BE_ifr_repo_init ();
00169 
00170       if (status != 0)
00171         {
00172           return;
00173         }
00174 
00175       BE_create_holding_scope ();
00176 
00177       // Get the root node.
00178       AST_Decl *d = idl_global->root ();
00179       AST_Root *root = AST_Root::narrow_from_decl (d);
00180 
00181       if (root == 0)
00182         {
00183           ACE_ERROR ((LM_ERROR,
00184                       ACE_TEXT ("(%N:%l) BE_produce - ")
00185                       ACE_TEXT ("No Root\n")));
00186 
00187           BE_abort ();
00188         }
00189 
00190       if (be_global->removing ())
00191         {
00192           ifr_removing_visitor visitor;
00193 
00194           TAO_IFR_VISITOR_WRITE_GUARD;
00195 
00196           // If the visitor is dispatched this way, we need to override
00197           // only visit_scope() for the removing visitor.
00198           if (visitor.visit_scope (root) == -1)
00199             {
00200               ACE_ERROR ((
00201                   LM_ERROR,
00202                   ACE_TEXT ("(%N:%l) BE_produce -")
00203                   ACE_TEXT (" failed to accept removing visitor\n")
00204                 ));
00205 
00206               BE_abort ();
00207             }
00208         }
00209       else
00210         {
00211           ifr_adding_visitor visitor (d);
00212 
00213           TAO_IFR_VISITOR_WRITE_GUARD;
00214 
00215           if (root->ast_accept (&visitor) == -1)
00216             {
00217               ACE_ERROR ((
00218                   LM_ERROR,
00219                   ACE_TEXT ("(%N:%l) BE_produce -")
00220                   ACE_TEXT (" failed to accept adding visitor\n")
00221                 ));
00222 
00223               BE_abort ();
00224             }
00225         }
00226     }
00227   catch (const CORBA::Exception& ex)
00228     {
00229       ex._tao_print_exception (ACE_TEXT ("BE_produce"));
00230 
00231     }
00232 
00233   // Clean up.
00234   BE_cleanup ();
00235 }

Generated on Sun Jan 27 16:31:52 2008 for TAO_IFR by doxygen 1.3.6