diff options
author | parsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2004-08-02 02:04:07 +0000 |
---|---|---|
committer | parsons <parsons@ae88bc3d-4319-0410-8dbf-d08b4c9d3795> | 2004-08-02 02:04:07 +0000 |
commit | aa96e45dc330b6572c308bb1956c2ee320e1d383 (patch) | |
tree | 78e0049007ad610de0098a7a14acafe5337ec37e | |
parent | fff59355008a9d9b5224d896ba76040cbdb2b541 (diff) | |
download | ATCD-aa96e45dc330b6572c308bb1956c2ee320e1d383.tar.gz |
ChangeLogTag: Sun Aug 1 20:57:32 2004 Jeff Parsons <j.parsons@vanderbilt.edu>
-rw-r--r-- | TAO/ChangeLog | 29 | ||||
-rw-r--r-- | TAO/TAO_IDL/ast/ast_decl.cpp | 2 | ||||
-rw-r--r-- | TAO/TAO_IDL/ast/ast_home.cpp | 2 | ||||
-rw-r--r-- | TAO/TAO_IDL/ast/ast_root.cpp | 42 | ||||
-rw-r--r-- | TAO/TAO_IDL/ast/ast_sequence.cpp | 13 | ||||
-rw-r--r-- | TAO/TAO_IDL/be/be_init.cpp | 2 | ||||
-rw-r--r-- | TAO/TAO_IDL/be_include/be_extern.h | 2 | ||||
-rw-r--r-- | TAO/TAO_IDL/include/idl_defines.h | 6 | ||||
-rw-r--r-- | TAO/TAO_IDL/include/idl_global.h | 13 | ||||
-rw-r--r-- | TAO/TAO_IDL/include/utl_scope.h | 4 | ||||
-rw-r--r-- | TAO/TAO_IDL/tao_idl.cpp | 12 | ||||
-rw-r--r-- | TAO/TAO_IDL/util/utl_global.cpp | 61 | ||||
-rw-r--r-- | TAO/TAO_IDL/util/utl_scope.cpp | 146 |
13 files changed, 311 insertions, 23 deletions
diff --git a/TAO/ChangeLog b/TAO/ChangeLog index 5dba5fc0346..6a4a642a55d 100644 --- a/TAO/ChangeLog +++ b/TAO/ChangeLog @@ -1,3 +1,32 @@ +Sun Aug 1 20:57:32 2004 Jeff Parsons <j.parsons@vanderbilt.edu> + + * TAO_IDL/tao_idl.cpp: + * TAO_IDL/ast/ast_decl.cpp: + * TAO_IDL/ast/ast_home.cpp: + * TAO_IDL/ast/ast_root.cpp: + * TAO_IDL/ast/ast_sequence.cpp: + * TAO_IDL/be/be_init.cpp: + * TAO_IDL/be_include/be_extern.h: + * TAO_IDL/include/idl_defines.h: + * TAO_IDL/include/idl_global.h: + * TAO_IDL/include/utl_scope.h: + * TAO_IDL/util/utl_global.cpp: + * TAO_IDL/util/utl_scope.cpp: + + - Fixed bugs in cleanup between iterations in processing the IDL + file list passed on the command line. + + - Fixed bug in checking for recursive types. + + - Fixed bug in eager calculation of the version segment of the + repository ID. + + - Fixed bug in checking number of interfaces supported by a home. + + - Added markers in existing bit vector to keep track of which + sequences of basic types have been referenced, and code to + update the markers. + Sun Aug 1 16:32:56 2004 J.T. Conklin <jtc@acorntoolworks.com> * TAO_IDL/Makefile.am: diff --git a/TAO/TAO_IDL/ast/ast_decl.cpp b/TAO/TAO_IDL/ast/ast_decl.cpp index 3328e31ecac..dcc36e6cc99 100644 --- a/TAO/TAO_IDL/ast/ast_decl.cpp +++ b/TAO/TAO_IDL/ast/ast_decl.cpp @@ -469,7 +469,7 @@ AST_Decl::compute_repoID (void) while (version == 0 && scope != 0) { AST_Decl *parent = ScopeAsDecl (scope); - version = parent->version (); + version = parent->version_; scope = parent->defined_in (); } diff --git a/TAO/TAO_IDL/ast/ast_home.cpp b/TAO/TAO_IDL/ast/ast_home.cpp index bb9d7ae4b2a..c098ccb4763 100644 --- a/TAO/TAO_IDL/ast/ast_home.cpp +++ b/TAO/TAO_IDL/ast/ast_home.cpp @@ -75,7 +75,7 @@ AST_Home::supports (void) const long AST_Home::n_supports (void) const { - return this->pd_base_home ? this->n_inherits () - 1 : this->n_inherits (); + return this->n_inherits (); } AST_Component * diff --git a/TAO/TAO_IDL/ast/ast_root.cpp b/TAO/TAO_IDL/ast/ast_root.cpp index 16cc9dc66c0..1cd6826c64d 100644 --- a/TAO/TAO_IDL/ast/ast_root.cpp +++ b/TAO/TAO_IDL/ast/ast_root.cpp @@ -218,15 +218,19 @@ AST_Root::ast_accept (ast_visitor *visitor) void AST_Root::destroy () { + long i = 0; + long j = 0; + // Just destroy and delete the non-predefined types in the // scope, in case we are processing multiple IDL files. // Final cleanup will be done in fini(). - for (long i = this->pd_decls_used; i > 0; --i) + for (i = this->pd_decls_used; i > 0; --i) { AST_Decl *d = this->pd_decls[i - 1]; if (d->node_type () == AST_Decl::NT_pre_defined) { + j = i; break; } @@ -235,11 +239,47 @@ AST_Root::destroy () d = 0; --this->pd_decls_used; } + + for (i = this->pd_referenced_used; i > j; --i) + { + AST_Decl *d = this->pd_referenced[i - 1]; + d = 0; + --this->pd_referenced_used; + } + + for (i = this->pd_name_referenced_used; i > j; --i) + { + Identifier *id = this->pd_name_referenced[i - 1]; + id->destroy (); + id = 0; + --this->pd_name_referenced_used; + } } void AST_Root::fini (void) { + long i = 0; + + for (i = this->pd_referenced_used; i > 0; --i) + { + AST_Decl *d = this->pd_referenced[i - 1]; + + if (d->node_type () == AST_Decl::NT_pre_defined) + { + break; + } + + d = 0; + } + + for (i = this->pd_name_referenced_used; i > 0; --i) + { + Identifier *id = this->pd_name_referenced[i - 1]; + id->destroy (); + id = 0; + } + this->UTL_Scope::destroy (); this->AST_Decl::destroy (); } diff --git a/TAO/TAO_IDL/ast/ast_sequence.cpp b/TAO/TAO_IDL/ast/ast_sequence.cpp index 4271c098eff..71aa00cb23a 100644 --- a/TAO/TAO_IDL/ast/ast_sequence.cpp +++ b/TAO/TAO_IDL/ast/ast_sequence.cpp @@ -71,6 +71,7 @@ trademarks or registered trademarks of Sun Microsystems, Inc. // of AST_Type). #include "ast_sequence.h" +#include "ast_typedef.h" #include "ast_expression.h" #include "ast_visitor.h" #include "utl_identifier.h" @@ -152,6 +153,18 @@ AST_Sequence::in_recursion (ACE_Unbounded_Queue<AST_Type *> &list) ACE_TEXT ("bad base type\n")), 0); } + + if (type->node_type () == AST_Decl::NT_typedef) + { + AST_Typedef *td = AST_Typedef::narrow_from_decl (type); + type = td->primitive_base_type (); + AST_Decl::NodeType nt = type->node_type (); + + if (nt != AST_Decl::NT_struct && nt != AST_Decl::NT_union) + { + return I_FALSE; + } + } if (this->match_names (this, list)) { diff --git a/TAO/TAO_IDL/be/be_init.cpp b/TAO/TAO_IDL/be/be_init.cpp index a21432b0bb4..3cb9fac5979 100644 --- a/TAO/TAO_IDL/be/be_init.cpp +++ b/TAO/TAO_IDL/be/be_init.cpp @@ -22,7 +22,7 @@ BE_init (int &, char *[]) } TAO_IDL_BE_Export void -BE_post_init (void) +BE_post_init (const char *[], long) { Identifier id ("void"); UTL_ScopedName n (&id, diff --git a/TAO/TAO_IDL/be_include/be_extern.h b/TAO/TAO_IDL/be_include/be_extern.h index b07afd30aab..9706ed03a7b 100644 --- a/TAO/TAO_IDL/be_include/be_extern.h +++ b/TAO/TAO_IDL/be_include/be_extern.h @@ -73,7 +73,7 @@ trademarks or registered trademarks of Sun Microsystems, Inc. extern TAO_IDL_BE_Export BE_GlobalData *be_global; extern TAO_IDL_BE_Export int BE_init (int &, char*[]); -extern TAO_IDL_BE_Export void BE_post_init (void); +extern TAO_IDL_BE_Export void BE_post_init (const char *[], long); extern TAO_IDL_BE_Export void BE_version (void); extern TAO_IDL_BE_Export void BE_produce (void); extern TAO_IDL_BE_Export void BE_abort (void); diff --git a/TAO/TAO_IDL/include/idl_defines.h b/TAO/TAO_IDL/include/idl_defines.h index 6f86e74d154..e6395d1f3e2 100644 --- a/TAO/TAO_IDL/include/idl_defines.h +++ b/TAO/TAO_IDL/include/idl_defines.h @@ -87,4 +87,10 @@ trademarks or registered trademarks of Sun Microsystems, Inc. #define NAMEBUFSIZE 1024 // Maximum length of static buffers used to store names. +#define SUN_IDL_FE_VERSION "1.3.0" + +#if !defined (NFILES) +# define NFILES 1024 +#endif /* ! NFILES */ + #endif // _IDL_DEFINES_IDL_DEFINES_HH diff --git a/TAO/TAO_IDL/include/idl_global.h b/TAO/TAO_IDL/include/idl_global.h index 05dc5245a1c..39ac2a0cb32 100644 --- a/TAO/TAO_IDL/include/idl_global.h +++ b/TAO/TAO_IDL/include/idl_global.h @@ -305,6 +305,19 @@ public: ACE_UINT64 string_seq_seen_; ACE_UINT64 wstring_seq_seen_; ACE_UINT64 octet_seq_seen_; + ACE_UINT64 boolean_seq_seen_; + ACE_UINT64 char_seq_seen_; + ACE_UINT64 wchar_seq_seen_; + ACE_UINT64 short_seq_seen_; + ACE_UINT64 ushort_seq_seen_; + ACE_UINT64 long_seq_seen_; + ACE_UINT64 ulong_seq_seen_; + ACE_UINT64 longlong_seq_seen_; + ACE_UINT64 ulonglong_seq_seen_; + ACE_UINT64 float_seq_seen_; + ACE_UINT64 double_seq_seen_; + ACE_UINT64 longdouble_seq_seen_; + ACE_UINT64 any_seq_seen_; ACE_UINT64 basic_arg_seen_; ACE_UINT64 bd_string_arg_seen_; diff --git a/TAO/TAO_IDL/include/utl_scope.h b/TAO/TAO_IDL/include/utl_scope.h index 7eb8bfae2f3..f8d4c067b00 100644 --- a/TAO/TAO_IDL/include/utl_scope.h +++ b/TAO/TAO_IDL/include/utl_scope.h @@ -309,6 +309,10 @@ protected: // Checks for modules, or defns of forward declared struct or unions. idl_bool redef_clash (AST_Decl::NodeType new_nt, AST_Decl::NodeType scope_elem_nt); + + void check_for_predef_seq (AST_Decl *d); + // Set the appropriate *_seen_ flag if we are seeing a spec-defined + // sequence of a basic type. protected: // Data. diff --git a/TAO/TAO_IDL/tao_idl.cpp b/TAO/TAO_IDL/tao_idl.cpp index b674e83b32b..dc5c105fc56 100644 --- a/TAO/TAO_IDL/tao_idl.cpp +++ b/TAO/TAO_IDL/tao_idl.cpp @@ -84,12 +84,6 @@ ACE_RCSID (TAO_IDL, tao_idl, "$Id$") -#define SUN_IDL_FE_VERSION "1.3.0" - -#if !defined (NFILES) -# define NFILES 1024 -#endif /* ! NFILES */ - const char *DRV_files[NFILES]; long DRV_nfiles = 0; long DRV_file_index = -1; @@ -334,9 +328,8 @@ main (int argc, char *argv[]) // Initialize AST and load predefined types. FE_populate (); - // For the IDL compiler, this has to come after FE_populate(). - // For the IFR loader, it does nothing. - BE_post_init (); + // Does various things in various backends. + BE_post_init (DRV_files, DRV_nfiles); for (DRV_file_index = 0; DRV_file_index < DRV_nfiles; @@ -345,6 +338,7 @@ main (int argc, char *argv[]) DRV_drive (DRV_files[DRV_file_index]); } + be_global->destroy (); delete be_global; be_global = 0; diff --git a/TAO/TAO_IDL/util/utl_global.cpp b/TAO/TAO_IDL/util/utl_global.cpp index 5aea4bb812b..2059501580e 100644 --- a/TAO/TAO_IDL/util/utl_global.cpp +++ b/TAO/TAO_IDL/util/utl_global.cpp @@ -124,6 +124,19 @@ IDL_GlobalData::dsf::dsf (void) string_seq_seen_ (0), wstring_seq_seen_ (0), octet_seq_seen_ (0), + boolean_seq_seen_ (0), + char_seq_seen_ (0), + wchar_seq_seen_ (0), + short_seq_seen_ (0), + ushort_seq_seen_ (0), + long_seq_seen_ (0), + ulong_seq_seen_ (0), + longlong_seq_seen_ (0), + ulonglong_seq_seen_ (0), + float_seq_seen_ (0), + double_seq_seen_ (0), + longdouble_seq_seen_ (0), + any_seq_seen_ (0), basic_arg_seen_ (0), bd_string_arg_seen_ (0), @@ -251,14 +264,28 @@ IDL_GlobalData::IDL_GlobalData (void) ACE_SET_BITS (this->decls_seen_masks.valuefactory_seen_, cursor << 21); ACE_SET_BITS (this->decls_seen_masks.valuebase_seen_, cursor << 22); - ACE_SET_BITS (this->decls_seen_masks.seq_seen_, cursor << 37); - ACE_SET_BITS (this->decls_seen_masks.iface_seq_seen_, cursor << 38); - ACE_SET_BITS (this->decls_seen_masks.vt_seq_seen_, cursor << 39); - ACE_SET_BITS (this->decls_seen_masks.array_seq_seen_, cursor << 40); - ACE_SET_BITS (this->decls_seen_masks.pseudo_seq_seen_, cursor << 41); - ACE_SET_BITS (this->decls_seen_masks.string_seq_seen_, cursor << 42); - ACE_SET_BITS (this->decls_seen_masks.wstring_seq_seen_, cursor << 43); - ACE_SET_BITS (this->decls_seen_masks.octet_seq_seen_, cursor << 44); + ACE_SET_BITS (this->decls_seen_masks.seq_seen_, cursor << 27); + ACE_SET_BITS (this->decls_seen_masks.iface_seq_seen_, cursor << 28); + ACE_SET_BITS (this->decls_seen_masks.vt_seq_seen_, cursor << 29); + ACE_SET_BITS (this->decls_seen_masks.array_seq_seen_, cursor << 30); + ACE_SET_BITS (this->decls_seen_masks.pseudo_seq_seen_, cursor << 31); + ACE_SET_BITS (this->decls_seen_masks.string_seq_seen_, cursor << 32); + ACE_SET_BITS (this->decls_seen_masks.wstring_seq_seen_, cursor << 33); + ACE_SET_BITS (this->decls_seen_masks.octet_seq_seen_, cursor << 34); + ACE_SET_BITS (this->decls_seen_masks.boolean_seq_seen_, cursor << 35); + ACE_SET_BITS (this->decls_seen_masks.char_seq_seen_, cursor << 36); + ACE_SET_BITS (this->decls_seen_masks.wchar_seq_seen_, cursor << 37); + ACE_SET_BITS (this->decls_seen_masks.short_seq_seen_, cursor << 38); + ACE_SET_BITS (this->decls_seen_masks.ushort_seq_seen_, cursor << 39); + ACE_SET_BITS (this->decls_seen_masks.octet_seq_seen_, cursor << 40); + ACE_SET_BITS (this->decls_seen_masks.long_seq_seen_, cursor << 41); + ACE_SET_BITS (this->decls_seen_masks.ulong_seq_seen_, cursor << 42); + ACE_SET_BITS (this->decls_seen_masks.longlong_seq_seen_, cursor << 43); + ACE_SET_BITS (this->decls_seen_masks.ulonglong_seq_seen_, cursor << 44); + ACE_SET_BITS (this->decls_seen_masks.float_seq_seen_, cursor << 45); + ACE_SET_BITS (this->decls_seen_masks.double_seq_seen_, cursor << 46); + ACE_SET_BITS (this->decls_seen_masks.longdouble_seq_seen_, cursor << 47); + ACE_SET_BITS (this->decls_seen_masks.any_seq_seen_, cursor << 48); ACE_SET_BITS (this->decls_seen_masks.basic_arg_seen_, cursor << 52); ACE_SET_BITS (this->decls_seen_masks.bd_string_arg_seen_, cursor << 53); @@ -1035,6 +1062,24 @@ IDL_GlobalData::destroy (void) delete [] trash; trash = 0; } + + for (unsigned long j = 0; j < this->pd_n_include_file_names; ++j) + { + // Delete the contained char* but not the UTL_String - + // we can leave the slots allocated and clean up later. + this->pd_include_file_names[j]->destroy (); + this->pd_include_file_names[j] = 0; + } + + this->pd_n_include_file_names = 0; + + for (size_t k = 0; k < n_included_idl_files_; ++k) + { + // No memory allocated for these, so just set to 0. + this->included_idl_files_[k] = 0; + } + + this->n_included_idl_files_ = 0; this->pd_root->destroy (); } diff --git a/TAO/TAO_IDL/util/utl_scope.cpp b/TAO/TAO_IDL/util/utl_scope.cpp index 5cbdaf1b21c..b790d4070c7 100644 --- a/TAO/TAO_IDL/util/utl_scope.cpp +++ b/TAO/TAO_IDL/util/utl_scope.cpp @@ -440,6 +440,147 @@ UTL_Scope::redef_clash (AST_Decl::NodeType new_nt, } } +void +UTL_Scope::check_for_predef_seq (AST_Decl *d) +{ + // Right now, we're interested only in predefined sequences + // referenced in the main IDL file. If we are processing + // multiple IDL files in one execution, the bits will + // stay set, and be accumulated as each file is parsed. + if (!idl_global->in_main_file ()) + { + return; + } + + AST_Type *bt = 0; + AST_Decl::NodeType nt = d->node_type (); + + // We are interested only in members, arguments and typedefs. + switch (nt) + { + case AST_Decl::NT_field: + case AST_Decl::NT_union_branch: + case AST_Decl::NT_attr: + case AST_Decl::NT_argument: + bt = AST_Field::narrow_from_decl (d)->field_type (); + break; + case AST_Decl::NT_typedef: + bt = AST_Typedef::narrow_from_decl (d)->base_type (); + break; + default: + return; + } + + // Check to eliminate more candidates. + if (!bt->imported () || bt->node_type () != AST_Decl::NT_typedef) + { + return; + } + + bt = AST_Typedef::narrow_from_decl (bt)->base_type (); + nt = bt->node_type (); + + // Must be a sequence with only one level of typedef. + if (nt != AST_Decl::NT_sequence) + { + return; + } + + // Must be defined in the CORBA module. + AST_Decl *p = ScopeAsDecl (bt->defined_in ()); + if (ACE_OS::strcmp (p->local_name ()->get_string (), "CORBA") != 0) + { + return; + } + + // We know this narrowing will be successful. + bt = AST_Sequence::narrow_from_decl (bt)->base_type (); + nt = bt->node_type (); + + // First check for string or wstring base type. + if (nt == AST_Decl::NT_string) + { + ACE_SET_BITS (idl_global->decls_seen_info_, + idl_global->decls_seen_masks.string_seq_seen_); + return; + } + else if (nt == AST_Decl::NT_wstring) + { + ACE_SET_BITS (idl_global->decls_seen_info_, + idl_global->decls_seen_masks.wstring_seq_seen_); + return; + } + + // Now check for predefined base type. + AST_PredefinedType *pdt = AST_PredefinedType::narrow_from_decl (bt); + if (pdt == 0) + { + return; + } + + switch (pdt->pt ()) + { + case AST_PredefinedType::PT_long: + ACE_SET_BITS (idl_global->decls_seen_info_, + idl_global->decls_seen_masks.long_seq_seen_); + break; + case AST_PredefinedType::PT_ulong: + ACE_SET_BITS (idl_global->decls_seen_info_, + idl_global->decls_seen_masks.ulong_seq_seen_); + break; + case AST_PredefinedType::PT_longlong: + ACE_SET_BITS (idl_global->decls_seen_info_, + idl_global->decls_seen_masks.longlong_seq_seen_); + break; + case AST_PredefinedType::PT_ulonglong: + ACE_SET_BITS (idl_global->decls_seen_info_, + idl_global->decls_seen_masks.ulonglong_seq_seen_); + break; + case AST_PredefinedType::PT_short: + ACE_SET_BITS (idl_global->decls_seen_info_, + idl_global->decls_seen_masks.short_seq_seen_); + break; + case AST_PredefinedType::PT_ushort: + ACE_SET_BITS (idl_global->decls_seen_info_, + idl_global->decls_seen_masks.ushort_seq_seen_); + break; + case AST_PredefinedType::PT_float: + ACE_SET_BITS (idl_global->decls_seen_info_, + idl_global->decls_seen_masks.float_seq_seen_); + break; + case AST_PredefinedType::PT_double: + ACE_SET_BITS (idl_global->decls_seen_info_, + idl_global->decls_seen_masks.double_seq_seen_); + break; + case AST_PredefinedType::PT_longdouble: + ACE_SET_BITS (idl_global->decls_seen_info_, + idl_global->decls_seen_masks.longdouble_seq_seen_); + break; + case AST_PredefinedType::PT_char: + ACE_SET_BITS (idl_global->decls_seen_info_, + idl_global->decls_seen_masks.char_seq_seen_); + break; + case AST_PredefinedType::PT_wchar: + ACE_SET_BITS (idl_global->decls_seen_info_, + idl_global->decls_seen_masks.wchar_seq_seen_); + break; + case AST_PredefinedType::PT_boolean: + ACE_SET_BITS (idl_global->decls_seen_info_, + idl_global->decls_seen_masks.boolean_seq_seen_); + break; + case AST_PredefinedType::PT_octet: + ACE_SET_BITS (idl_global->decls_seen_info_, + idl_global->decls_seen_masks.octet_seq_seen_); + break; + case AST_PredefinedType::PT_any: + ACE_SET_BITS (idl_global->decls_seen_info_, + idl_global->decls_seen_masks.any_seq_seen_); + break; + default: + break; + } +} + // Public operations. // Scope Management Protocol. @@ -1851,6 +1992,9 @@ UTL_Scope::add_to_referenced (AST_Decl *e, { return; } + + // Sets the appropriate *_seen_ flag for future use. + this->check_for_predef_seq (e); // Make sure there's space for one more decl. if (this->pd_referenced_allocated == this->pd_referenced_used) @@ -1933,7 +2077,7 @@ UTL_Scope::add_to_referenced (AST_Decl *e, } // Insert new identifier. - this->pd_name_referenced[this->pd_name_referenced_used++] = id; + this->pd_name_referenced[this->pd_name_referenced_used++] = id->copy (); } } |