summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsma <sma@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2010-06-11 09:51:34 +0000
committersma <sma@ae88bc3d-4319-0410-8dbf-d08b4c9d3795>2010-06-11 09:51:34 +0000
commitae600d6dbc7297d4de14bce12db1b2725ddeb1ce (patch)
treee224f1fe46f67ad0ef134ffc0b022d5f5999c40e
parent51ea80af29d2a57986ac6bdd8038b7ff6602d258 (diff)
downloadATCD-ae600d6dbc7297d4de14bce12db1b2725ddeb1ce.tar.gz
ChangeLogTag: Fri Jun 11 09:50:00 UTC 2010 Simon Massey <simon dot massey at prismtech dot com>
-rw-r--r--TAO/ChangeLog21
-rw-r--r--TAO/TAO_IDL/ast/ast_decl.cpp687
-rw-r--r--TAO/TAO_IDL/ast/ast_generator.cpp97
-rw-r--r--TAO/TAO_IDL/ast/ast_module.cpp305
-rw-r--r--TAO/TAO_IDL/be/be_module.cpp12
-rw-r--r--TAO/TAO_IDL/include/utl_scope.h2
-rw-r--r--TAO/TAO_IDL/util/utl_scope.cpp601
7 files changed, 969 insertions, 756 deletions
diff --git a/TAO/ChangeLog b/TAO/ChangeLog
index d345034d498..e38051e5d68 100644
--- a/TAO/ChangeLog
+++ b/TAO/ChangeLog
@@ -1,22 +1,23 @@
+Fri Jun 11 09:50:00 UTC 2010 Simon Massey <simon dot massey at prismtech dot com>
+
+ * TAO_IDL/ast/ast_module.cpp:
+ * TAO_IDL/ast/ast_generator.cpp:
+ * TAO_IDL/ast/ast_decl.cpp:
+ * TAO_IDL/be/be_module.cpp:
+ * TAO_IDL/include/utl_scope.h:
+ * TAO_IDL/util/utl_scope.cpp:
+
+ Previous commit missed some of the file revertions.
+
Fri Jun 11 09:37:00 UTC 2010 Simon Massey <simon dot massey at prismtech dot com>
* NEWS:
* TAO_IDL/ast/ast_structure_fwd.cpp:
- * TAO_IDL/ast/ast_module.cpp:
- * TAO_IDL/ast/ast_generator.cpp:
* TAO_IDL/ast/ast_interface_fwd.cpp:
* TAO_IDL/ast/ast_component_fwd.cpp:
- * TAO_IDL/ast/ast_decl.cpp:
* TAO_IDL/ast/ast_template_module_ref.cpp:
- * TAO_IDL/be/be_module.cpp:
* TAO_IDL/be/be_generator.cpp:
* TAO_IDL/be_include/be_module.h:
- * TAO_IDL/include/ast_module.h:
- * TAO_IDL/include/ast_interface_fwd.h:
- * TAO_IDL/include/ast_component_fwd.h:
- * TAO_IDL/include/ast_decl.h:
- * TAO_IDL/include/ast_template_module_ref.h:
- * TAO_IDL/include/ast_structure_fwd.h:
* TAO_IDL/include/utl_scope.h:
* TAO_IDL/util/utl_scope.cpp:
diff --git a/TAO/TAO_IDL/ast/ast_decl.cpp b/TAO/TAO_IDL/ast/ast_decl.cpp
index a2cb4ed0ffd..8d9588d811f 100644
--- a/TAO/TAO_IDL/ast/ast_decl.cpp
+++ b/TAO/TAO_IDL/ast/ast_decl.cpp
@@ -157,87 +157,33 @@ AST_Decl::AST_Decl (NodeType nt,
{
// If this is the root node, the filename won't have been set yet.
UTL_String *fn = idl_global->filename ();
- this->pd_file_name = (fn ? fn->get_string () : "");
+ this->pd_file_name = (fn != 0 ? fn->get_string () : "");
this->compute_full_name (n);
char *prefix = 0;
idl_global->pragma_prefixes ().top (prefix);
- this->prefix_ = ACE::strnew (prefix ? prefix : "");
- if (n)
+ if (prefix == 0)
{
- // The function body creates its own copy.
- this->original_local_name (n->last_component ());
- }
-
- this->compute_repoID ();
-}
-
-AST_Decl::~AST_Decl (void)
-{
-}
-
-void
-AST_Decl::destroy (void)
-{
- // These are not set for the root node.
- if (this->pd_name)
- {
- this->pd_name->destroy ();
- delete this->pd_name;
- this->pd_name = 0;
- }
-
- if (this->pd_local_name)
- {
- this->pd_local_name->destroy ();
- delete this->pd_local_name;
- this->pd_local_name = 0;
+ this->prefix_ = ACE::strnew ("");
}
-
- if (this->pd_original_local_name)
+ else
{
- this->pd_original_local_name->destroy ();
- delete this->pd_original_local_name;
- this->pd_original_local_name = 0;
+ this->prefix_ = ACE::strnew (prefix);
}
- if (this->last_referenced_as_)
+ if (n != 0)
{
- this->last_referenced_as_->destroy ();
- delete this->last_referenced_as_;
- this->last_referenced_as_ = 0;
+ // The function body creates its own copy.
+ this->original_local_name (n->last_component ());
}
- delete [] this->full_name_;
- this->full_name_ = 0;
-
- delete [] this->repoID_;
- this->repoID_ = 0;
-
- delete [] this->prefix_;
- this->prefix_ = 0;
-
- delete [] this->version_;
- this->version_ = 0;
-
- delete [] this->flat_name_;
- this->flat_name_ = 0;
-}
-
-AST_Decl *
-AST_Decl::adjust_found (
- bool /*ignore_fwd*/,
- bool /*full_def_only*/)
-{
- return this; // Defaults to no adjustment
+ this->compute_repoID ();
}
-bool
-AST_Decl::is_fwd (void)
+AST_Decl::~AST_Decl (void)
{
- return false; // Not a fwd declared type (by default)
}
// Private operations.
@@ -249,50 +195,54 @@ AST_Decl::compute_full_name (UTL_ScopedName *n)
// This should happen only when we are a non-void predefined type,
// in which case our scoped name has already been created by the
// AST_PredefinedType constructor.
- if (!n)
+ if (n == 0)
{
return;
}
+ UTL_ScopedName *cn = 0;
+ AST_Decl *d = 0;
+
+ // Initialize this name to 0.
+ this->pd_name = 0;
+
// Global scope?
- if (!this->defined_in ())
+ if (this->defined_in () == 0)
{
this->pd_name = (UTL_IdList *) n->copy ();
return;
}
- // Initialize this name to 0.
- this->pd_name = 0;
-
// OK, not global. So copy name of containing scope, then
// smash last cdr of copy with new component
- UTL_ScopedName *cn = 0;
- AST_Decl *d = ScopeAsDecl (this->defined_in ());
- if (d)
+ d = ScopeAsDecl (this->defined_in ());
+
+ if (d != 0)
{
cn = d->name ();
- if (cn)
- {
- this->pd_name = (UTL_IdList *) cn->copy ();
- }
}
- if (this->pd_local_name)
+ if (cn != 0)
{
- if (this->pd_name)
+ this->pd_name = (UTL_IdList *) cn->copy ();
+ }
+
+ if (this->pd_local_name != 0)
+ {
+ if (this->pd_name == 0)
{
- UTL_ScopedName *conc_name = 0;
- ACE_NEW (conc_name,
+ ACE_NEW (this->pd_name,
UTL_ScopedName (this->pd_local_name->copy (),
0));
-
- this->pd_name->nconc (conc_name);
}
else
{
- ACE_NEW (this->pd_name,
+ UTL_ScopedName *conc_name = 0;
+ ACE_NEW (conc_name,
UTL_ScopedName (this->pd_local_name->copy (),
0));
+
+ this->pd_name->nconc (conc_name);
}
}
}
@@ -306,11 +256,13 @@ AST_Decl::set_prefix_with_typeprefix_r (const char *value,
return;
}
- if (this->prefix_scope_)
+ if (this->prefix_scope_ != 0)
{
AST_Decl *decl = ScopeAsDecl (this->prefix_scope_);
+
bool const overridden =
decl->has_ancestor (ScopeAsDecl (appeared_in));
+
if (overridden)
{
return;
@@ -323,19 +275,26 @@ AST_Decl::set_prefix_with_typeprefix_r (const char *value,
this->prefix_scope_ = appeared_in;
UTL_Scope *s = DeclAsScope (this);
- if (s)
+
+ if (s != 0)
{
+ AST_Decl *tmp = 0;
+ UTL_Scope *s_tmp = 0;
+
for (UTL_ScopeActiveIterator i (s, UTL_Scope::IK_decls);
!i.is_done ();
i.next ())
{
- AST_Decl *tmp = i.item ();
- UTL_Scope *s_tmp = DeclAsScope (tmp);
- if (s_tmp)
+ tmp = i.item ();
+ s_tmp = DeclAsScope (tmp);
+
+ if (s_tmp == 0)
{
- tmp->set_prefix_with_typeprefix_r (value,
- appeared_in);
+ continue;
}
+
+ tmp->set_prefix_with_typeprefix_r (value,
+ appeared_in);
}
}
@@ -343,18 +302,27 @@ AST_Decl::set_prefix_with_typeprefix_r (const char *value,
if (this->node_type () == AST_Decl::NT_module)
{
AST_Module *m = AST_Module::narrow_from_decl (this);
- while (!!(m = m->previous_opening ()))
+
+ for (ACE_Unbounded_Set_Iterator<AST_Module *> iter (m->prev_mods ());
+ !iter.done ();
+ iter.advance ())
{
- for (UTL_ScopeActiveIterator si (m, UTL_Scope::IK_decls);
+ AST_Module **m = 0;
+ iter.next (m);
+
+ for (UTL_ScopeActiveIterator si (*m, UTL_Scope::IK_decls);
!si.is_done ();
si.next ())
{
AST_Decl *d = si.item ();
- if (d->node_type () != AST_Decl::NT_pre_defined)
+
+ if (d->node_type () == AST_Decl::NT_pre_defined)
{
- d->set_prefix_with_typeprefix_r (value,
- appeared_in);
+ continue;
}
+
+ d->set_prefix_with_typeprefix_r (value,
+ appeared_in);
}
}
}
@@ -368,7 +336,11 @@ AST_Decl::set_prefix_with_typeprefix_r (const char *value,
void
AST_Decl::compute_full_name (void)
{
- if (!this->full_name_)
+ if (this->full_name_ != 0)
+ {
+ return;
+ }
+ else
{
size_t namelen = 0;
long first = true;
@@ -394,7 +366,7 @@ AST_Decl::compute_full_name (void)
if (first)
{
- if (ACE_OS::strcmp (name, ""))
+ if (ACE_OS::strcmp (name, "") != 0)
{
// Does not start with a "".
first = false;
@@ -432,7 +404,7 @@ AST_Decl::compute_full_name (void)
if (first)
{
- if (ACE_OS::strcmp (name, ""))
+ if (ACE_OS::strcmp (name, "") != 0)
{
// Does not start with a "".
first = false;
@@ -450,7 +422,7 @@ AST_Decl::compute_full_name (void)
void
AST_Decl::compute_repoID (void)
{
- if (this->repoID_)
+ if (this->repoID_ != 0)
{
return;
}
@@ -464,9 +436,10 @@ AST_Decl::compute_repoID (void)
const char *parent_prefix = 0;
// If our prefix is empty, we check to see if an ancestor has one.
- while (scope && ACE_OS::strcmp (prefix, ""))
+ while (ACE_OS::strcmp (prefix, "") == 0 && scope != 0)
{
AST_Decl *parent = ScopeAsDecl (scope);
+
if (parent->node_type () == AST_Decl::NT_root
&& parent->imported ())
{
@@ -485,14 +458,14 @@ AST_Decl::compute_repoID (void)
scope = this->defined_in ();
// If our version is has not bee set, we use the parent's, if any.
- while (!version && scope)
+ while (version == 0 && scope != 0)
{
AST_Decl *parent = ScopeAsDecl (scope);
version = parent->version_;
scope = parent->defined_in ();
}
- if (version)
+ if (version != 0)
{
// Version member string + ':'
namelen += ACE_OS::strlen (version) + 1;
@@ -531,7 +504,7 @@ AST_Decl::compute_repoID (void)
if (first)
{
- if (ACE_OS::strcmp (name, ""))
+ if (ACE_OS::strcmp (name, "") != 0)
{
// Does not start with a "".
first = false;
@@ -548,11 +521,15 @@ AST_Decl::compute_repoID (void)
this->repoID_[0] = '\0';
- ACE_OS::sprintf (this->repoID_, "IDL:");
+ ACE_OS::sprintf (this->repoID_,
+ "%s",
+ "IDL:");
- if (ACE_OS::strcmp (prefix, ""))
+ if (ACE_OS::strcmp (prefix, "") != 0)
{
- ACE_OS::strcat (this->repoID_, prefix);
+ ACE_OS::strcat (this->repoID_,
+ prefix);
+
ACE_OS::strcat (this->repoID_, "/");
}
@@ -588,7 +565,7 @@ AST_Decl::compute_repoID (void)
if (first)
{
- if (ACE_OS::strcmp (name, ""))
+ if (ACE_OS::strcmp (name, "") != 0)
{
// Does not start with a "".
first = false;
@@ -600,14 +577,17 @@ AST_Decl::compute_repoID (void)
}
}
- if (version)
+ if (version != 0)
{
- ACE_OS::strcat (this->repoID_, ":");
- ACE_OS::strcat (this->repoID_, version);
+ ACE_OS::strcat (this->repoID_,
+ ":");
+ ACE_OS::strcat (this->repoID_,
+ version);
}
else
{
- ACE_OS::strcat (this->repoID_, ":1.0");
+ ACE_OS::strcat (this->repoID_,
+ ":1.0");
}
}
@@ -628,7 +608,11 @@ AST_Decl::flat_name (void)
void
AST_Decl::compute_flat_name (void)
{
- if (!this->flat_name_)
+ if (this->flat_name_ != 0)
+ {
+ return;
+ }
+ else
{
size_t namelen = 0;
long first = true;
@@ -658,7 +642,7 @@ AST_Decl::compute_flat_name (void)
if (first)
{
- if (ACE_OS::strcmp (item_name, ""))
+ if (ACE_OS::strcmp (item_name, "") != 0)
{
// Does not start with a "".
first = false;
@@ -668,7 +652,7 @@ AST_Decl::compute_flat_name (void)
second = true;
}
}
-
+
tmp->destroy ();
delete tmp;
tmp = 0;
@@ -703,7 +687,7 @@ AST_Decl::compute_flat_name (void)
if (first)
{
- if (ACE_OS::strcmp (item_name, ""))
+ if (ACE_OS::strcmp (item_name, "") != 0)
{
// Does not start with a "".
first = false;
@@ -726,106 +710,78 @@ AST_Decl::node_type_to_string (NodeType nt)
{
switch (nt)
{
- case NT_module:
- return "module";
-
- case NT_interface:
- case NT_interface_fwd:
- return "interface";
-
- case NT_valuetype:
- case NT_valuetype_fwd:
- case NT_valuebox:
- return "valuetype";
-
- case NT_const:
- return "const";
-
- case NT_except:
- return "exception";
-
- case NT_attr:
- return "attribute";
-
- case NT_union:
- case NT_union_fwd:
- return "union";
-
- case NT_struct:
- case NT_struct_fwd:
- return "struct";
-
- case NT_enum:
- return "enum";
-
- case NT_string:
- return "string";
-
- case NT_wstring:
- return "wstring";
-
- case NT_array:
- return "array";
-
- case NT_sequence:
- return "sequence";
-
- case NT_typedef:
- return "typedef";
-
- case NT_pre_defined:
- return "primitive";
-
- case NT_native:
- return "native";
-
- case NT_factory:
- return "factory";
-
- case NT_component:
- case NT_component_fwd:
- return "component";
-
- case NT_home:
- return "home";
-
- case NT_eventtype:
- case NT_eventtype_fwd:
- return "eventtype";
-
- case NT_type:
- return "typename";
-
- case NT_fixed:
- return "fixed";
-
- case NT_porttype:
- return "porttype";
-
- case NT_provides:
- return "provides";
-
- case NT_uses:
- return "uses";
-
- case NT_publishes:
- return "publishes";
-
- case NT_emits:
- return "emits";
-
- case NT_consumes:
- return "consumes";
-
+ case NT_module:
+ return "module";
+ case NT_interface:
+ case NT_interface_fwd:
+ return "interface";
+ case NT_valuetype:
+ case NT_valuetype_fwd:
+ case NT_valuebox:
+ return "valuetype";
+ case NT_const:
+ return "const";
+ case NT_except:
+ return "exception";
+ case NT_attr:
+ return "attribute";
+ case NT_union:
+ case NT_union_fwd:
+ return "union";
+ case NT_struct:
+ case NT_struct_fwd:
+ return "struct";
+ case NT_enum:
+ return "enum";
+ case NT_string:
+ return "string";
+ case NT_wstring:
+ return "wstring";
+ case NT_array:
+ return "array";
+ case NT_sequence:
+ return "sequence";
+ case NT_typedef:
+ return "typedef";
+ case NT_pre_defined:
+ return "primitive";
+ case NT_native:
+ return "native";
+ case NT_factory:
+ return "factory";
+ case NT_component:
+ case NT_component_fwd:
+ return "component";
+ case NT_home:
+ return "home";
+ case NT_eventtype:
+ case NT_eventtype_fwd:
+ return "eventtype";
+ case NT_type:
+ return "typename";
+ case NT_fixed:
+ return "fixed";
+ case NT_porttype:
+ return "porttype";
+ case NT_provides:
+ return "provides";
+ case NT_uses:
+ return "uses";
+ case NT_publishes:
+ return "publishes";
+ case NT_emits:
+ return "emits";
+ case NT_consumes:
+ return "consumes";
// No useful output for these.
- case NT_enum_val:
- case NT_field:
- case NT_union_branch:
- case NT_op:
- case NT_argument:
- case NT_root:
- default:
- return "";
+ case NT_enum_val:
+ case NT_field:
+ case NT_union_branch:
+ case NT_op:
+ case NT_argument:
+ case NT_root:
+ default:
+ return "";
}
}
@@ -834,32 +790,44 @@ AST_Decl::node_type_to_string (NodeType nt)
bool
AST_Decl::has_ancestor (AST_Decl *s)
{
- AST_Decl *work = this;
- do
+ if (this == s)
{
- if (work == s)
- {
- return true;
- }
+ return true;
+ }
+
+ AST_Module *m = AST_Module::narrow_from_decl (s);
- AST_Module *m = AST_Module::narrow_from_decl (s);
- if (m)
+ if (m != 0)
+ {
+ ACE_Unbounded_Set<AST_Module *> &prev = m->prev_mods ();
+
+ for (ACE_Unbounded_Set<AST_Module *>::CONST_ITERATOR i (prev);
+ !i.done ();
+ i.advance ())
{
- while (!!(m = m->previous_opening ()))
+ AST_Module **mm = 0;
+ i.next (mm);
+
+ for (UTL_ScopeActiveIterator si (*mm, UTL_Scope::IK_decls);
+ !si.is_done ();
+ si.next ())
{
- if (static_cast<AST_Decl *> (m) == work)
+ AST_Decl *d = si.item ();
+
+ if (this == d)
{
return true;
}
}
}
+ }
- work = work->pd_defined_in ?
- ScopeAsDecl (work->pd_defined_in) :
- 0;
- } while (work);
+ if (this->pd_defined_in == 0)
+ {
+ return false;
+ }
- return false;
+ return ScopeAsDecl (this->pd_defined_in)->has_ancestor (s);
}
bool
@@ -868,12 +836,13 @@ AST_Decl::is_child (AST_Decl *s)
if (this->defined_in ())
{
AST_Decl *d = ScopeAsDecl (this->defined_in ());
- if (!d)
+
+ if (d == 0)
{
return 0;
}
- if (!ACE_OS::strcmp (d->full_name (), s->full_name ()))
+ if (ACE_OS::strcmp (d->full_name (), s->full_name ()) == 0)
{
return 1;
}
@@ -889,7 +858,12 @@ AST_Decl::is_nested (void)
// If we have an outermost scope and if that scope is not that of the Root,
// then we are defined at some nesting level.
- return (d && d->node_type () != AST_Decl::NT_root);
+ if (d != 0 && d->node_type () != AST_Decl::NT_root)
+ {
+ return true;
+ }
+
+ return false;
}
// Dump this AST_Decl to the ostream o.
@@ -913,12 +887,60 @@ AST_Decl::ast_accept (ast_visitor *visitor)
return visitor->visit_decl (this);
}
+void
+AST_Decl::destroy (void)
+{
+ // These are not set for the root node.
+ if (this->pd_name != 0)
+ {
+ this->pd_name->destroy ();
+ delete this->pd_name;
+ this->pd_name = 0;
+ }
+
+ if (this->pd_local_name != 0)
+ {
+ this->pd_local_name->destroy ();
+ delete this->pd_local_name;
+ this->pd_local_name = 0;
+ }
+
+ if (this->pd_original_local_name != 0)
+ {
+ this->pd_original_local_name->destroy ();
+ delete this->pd_original_local_name;
+ this->pd_original_local_name = 0;
+ }
+
+ if (this->last_referenced_as_ != 0)
+ {
+ this->last_referenced_as_->destroy ();
+ delete this->last_referenced_as_;
+ this->last_referenced_as_ = 0;
+ }
+
+ delete [] this->full_name_;
+ this->full_name_ = 0;
+
+ delete [] this->repoID_;
+ this->repoID_ = 0;
+
+ delete [] this->prefix_;
+ this->prefix_ = 0;
+
+ delete [] this->version_;
+ this->version_ = 0;
+
+ delete [] this->flat_name_;
+ this->flat_name_ = 0;
+}
+
// Data accessors.
const char *
AST_Decl::full_name (void)
{
- if (!this->full_name_)
+ if (this->full_name_ == 0)
{
this->compute_full_name ();
}
@@ -935,7 +957,7 @@ AST_Decl::repoID (void)
this->repoID_ = ACE::strnew ("");
}
- if (!this->repoID_)
+ if (this->repoID_ == 0)
{
this->compute_repoID ();
}
@@ -946,7 +968,7 @@ AST_Decl::repoID (void)
void
AST_Decl::repoID (char *value)
{
- if (this->repoID_)
+ if (this->repoID_ != 0)
{
delete [] this->repoID_;
}
@@ -970,7 +992,7 @@ AST_Decl::prefix (const char *value)
const char *
AST_Decl::version (void)
{
- if (!this->version_)
+ if (this->version_ == 0)
{
// Calling the method will compute if necessary.
const char *repo_id = this->repoID ();
@@ -980,17 +1002,19 @@ AST_Decl::version (void)
const char *tail1 = 0;
const char *tail2 = 0;
- if (repo_id)
+ if (repo_id != 0)
{
- tail1 = ACE_OS::strchr (repo_id, ':');
+ tail1 = ACE_OS::strchr (repo_id,
+ ':');
}
- if (tail1)
+ if (tail1 != 0)
{
- tail2 = ACE_OS::strchr (tail1 + 1, ':');
+ tail2 = ACE_OS::strchr (tail1 + 1,
+ ':');
}
- if (!this->typeid_set_ && tail2)
+ if (! this->typeid_set_ && tail2 != 0)
{
this->version_ = ACE::strnew (tail2 + 1);
}
@@ -1007,15 +1031,15 @@ void
AST_Decl::version (char *value)
{
// Previous #pragma version or #pragma id make this illegal.
- if ((!this->version_ || !ACE_OS::strcmp (this->version_, value))
- && !this->typeid_set_)
+ if ((this->version_ == 0 || ACE_OS::strcmp (this->version_, value) == 0)
+ && ! this->typeid_set_)
{
delete [] this->version_;
this->version_ = value;
// Repo id is now computed eagerly, so a version set must update
// is as well.
- if (this->repoID_)
+ if (this->repoID_ != 0)
{
ACE_CString tmp (this->repoID_);
ACE_CString::size_type const pos = tmp.rfind (':');
@@ -1070,14 +1094,13 @@ AST_Decl::set_id_with_typeid (char *value)
// Are we a legal type for 'typeid'?
switch (this->pd_node_type)
- {
+ {
case AST_Decl::NT_field:
{
AST_Decl::NodeType nt =
ScopeAsDecl (this->defined_in ())->node_type ();
- if ( nt == AST_Decl::NT_valuetype
- || nt == AST_Decl::NT_eventtype)
+ if (nt == AST_Decl::NT_valuetype || nt == AST_Decl::NT_eventtype)
{
break;
}
@@ -1085,10 +1108,10 @@ AST_Decl::set_id_with_typeid (char *value)
{
idl_global->err ()->error1 (UTL_Error::EIDL_INVALID_TYPEID,
this);
+
return;
}
}
-
case AST_Decl::NT_module:
case AST_Decl::NT_interface:
case AST_Decl::NT_const:
@@ -1102,12 +1125,12 @@ AST_Decl::set_id_with_typeid (char *value)
case AST_Decl::NT_home:
case AST_Decl::NT_eventtype:
break;
-
default:
idl_global->err ()->error1 (UTL_Error::EIDL_INVALID_TYPEID,
this);
+
return;
- }
+ }
delete [] this->repoID_;
this->repoID_ = 0;
@@ -1121,7 +1144,7 @@ AST_Decl::set_prefix_with_typeprefix (const char *value)
// Are we a legal type for 'typeprefix'? This is checked only at
// the top level.
switch (this->pd_node_type)
- {
+ {
case AST_Decl::NT_module:
case AST_Decl::NT_interface:
case AST_Decl::NT_valuetype:
@@ -1130,12 +1153,12 @@ AST_Decl::set_prefix_with_typeprefix (const char *value)
case AST_Decl::NT_union:
case AST_Decl::NT_except:
break;
-
default:
idl_global->err ()->error1 (UTL_Error::EIDL_INVALID_TYPEPREFIX,
this);
+
return;
- }
+ }
this->set_prefix_with_typeprefix_r (value,
DeclAsScope (this));
@@ -1222,11 +1245,13 @@ UTL_ScopedName *
AST_Decl::compute_name (const char *prefix,
const char *suffix)
{
- if (!prefix || !suffix)
+ if (prefix == 0 || suffix == 0)
{
return 0;
}
+ UTL_ScopedName *result_name = 0;
+
// Prepare prefix_<local_name>_suffix string.
ACE_CString suffix_str (suffix);
@@ -1245,12 +1270,12 @@ AST_Decl::compute_name (const char *prefix,
// UTL_Scoped name for the resulting local name.
UTL_ScopedName *result_local_name = 0;
ACE_NEW_RETURN (result_local_name,
- UTL_ScopedName (result_local_id, 0),
+ UTL_ScopedName (result_local_id,
+ 0),
0);
// Global scope?
- UTL_ScopedName *result_name = 0;
- if (!this->defined_in ())
+ if (this->defined_in () == 0)
{
result_name = result_local_name;
}
@@ -1260,19 +1285,22 @@ AST_Decl::compute_name (const char *prefix,
// smash last cdr of copy with new component.
AST_Decl *d = ScopeAsDecl (this->defined_in ());
- if (d)
+
+ if (d != 0)
{
UTL_ScopedName *cn = d->name ();
- if (cn)
+
+ if (cn != 0)
{
result_name = (UTL_ScopedName *) cn->copy ();
- if (result_name)
+
+ if (result_name == 0)
{
- result_name->nconc (result_local_name);
+ result_name = result_local_name;
}
else
{
- result_name = result_local_name;
+ result_name->nconc (result_local_name);
}
}
}
@@ -1289,16 +1317,17 @@ AST_Decl::set_name (UTL_ScopedName *n)
return;
}
- if (this->pd_name)
+ if (this->pd_name != 0)
{
this->pd_name->destroy ();
delete this->pd_name;
}
this->pd_name = n;
- if (n)
+
+ if (n != 0)
{
- if (this->pd_local_name)
+ if (this->pd_local_name != 0)
{
this->pd_local_name->destroy ();
delete this->pd_local_name;
@@ -1307,7 +1336,7 @@ AST_Decl::set_name (UTL_ScopedName *n)
this->pd_local_name = n->last_component ()->copy ();
// The name without _cxx_ prefix removed, if there was any.
- if (this->pd_original_local_name)
+ if (this->pd_original_local_name != 0)
{
this->pd_original_local_name->destroy ();
delete this->pd_original_local_name;
@@ -1336,7 +1365,7 @@ AST_Decl::local_name (void)
void
AST_Decl::local_name (Identifier *id)
{
- if (this->pd_local_name)
+ if (this->pd_local_name != 0)
{
this->pd_local_name->destroy ();
}
@@ -1349,7 +1378,7 @@ Identifier *
AST_Decl::compute_local_name (const char *prefix,
const char *suffix)
{
- if (!prefix || !suffix)
+ if (prefix == 0 || suffix == 0)
{
return 0;
}
@@ -1381,7 +1410,8 @@ void
AST_Decl::original_local_name (Identifier *local_name)
{
// Remove _cxx_ if it is present.
- if (ACE_OS::strstr (local_name->get_string (), "_cxx_")
+ if (ACE_OS::strstr (local_name->get_string (),
+ "_cxx_")
== local_name->get_string ())
{
// AACE_CString class is good to do this stuff.
@@ -1423,7 +1453,7 @@ AST_Decl::last_referenced_as (void) const
void
AST_Decl::last_referenced_as (UTL_ScopedName *n)
{
- if (this->last_referenced_as_)
+ if (this->last_referenced_as_ != 0)
{
this->last_referenced_as_->destroy ();
}
@@ -1452,57 +1482,51 @@ AST_Decl::contains_wstring (void)
{
switch (this->node_type ())
{
- case AST_Decl::NT_array:
- {
- AST_Array *a = AST_Array::narrow_from_decl (this);
- this->contains_wstring_ =
- a->base_type ()->contains_wstring ();
- break;
- }
-
- case AST_Decl::NT_except:
- case AST_Decl::NT_struct:
- case AST_Decl::NT_union:
- {
- AST_Structure *s = AST_Structure::narrow_from_decl (this);
- this->contains_wstring_ =
- s->contains_wstring ();
- break;
- }
-
- case AST_Decl::NT_sequence:
- {
- AST_Sequence *s = AST_Sequence::narrow_from_decl (this);
- this->contains_wstring_ =
- s->base_type ()->contains_wstring ();
+ case AST_Decl::NT_array:
+ {
+ AST_Array *a = AST_Array::narrow_from_decl (this);
+ this->contains_wstring_ =
+ a->base_type ()->contains_wstring ();
+ break;
+ }
+ case AST_Decl::NT_except:
+ case AST_Decl::NT_struct:
+ case AST_Decl::NT_union:
+ {
+ AST_Structure *s = AST_Structure::narrow_from_decl (this);
+ this->contains_wstring_ =
+ s->contains_wstring ();
+ break;
+ }
+ case AST_Decl::NT_sequence:
+ {
+ AST_Sequence *s = AST_Sequence::narrow_from_decl (this);
+ this->contains_wstring_ =
+ s->base_type ()->contains_wstring ();
+ break;
+ }
+ case AST_Decl::NT_attr:
+ case AST_Decl::NT_field:
+ case AST_Decl::NT_union_branch:
+ {
+ AST_Field *f = AST_Field::narrow_from_decl (this);
+ this->contains_wstring_ =
+ f->field_type ()->contains_wstring ();
+ break;
+ }
+ case AST_Decl::NT_typedef:
+ {
+ AST_Typedef *td = AST_Typedef::narrow_from_decl (this);
+ this->contains_wstring_ =
+ td->primitive_base_type ()->contains_wstring ();
+ break;
+ }
+ case AST_Decl::NT_wstring:
+ this->contains_wstring_ = 1;
break;
- }
-
- case AST_Decl::NT_attr:
- case AST_Decl::NT_field:
- case AST_Decl::NT_union_branch:
- {
- AST_Field *f = AST_Field::narrow_from_decl (this);
- this->contains_wstring_ =
- f->field_type ()->contains_wstring ();
+ default:
+ this->contains_wstring_ = 0;
break;
- }
-
- case AST_Decl::NT_typedef:
- {
- AST_Typedef *td = AST_Typedef::narrow_from_decl (this);
- this->contains_wstring_ =
- td->primitive_base_type ()->contains_wstring ();
- break;
- }
-
- case AST_Decl::NT_wstring:
- this->contains_wstring_ = 1;
- break;
-
- default:
- this->contains_wstring_ = 0;
- break;
}
}
@@ -1525,24 +1549,31 @@ AST_Decl::masking_checks (AST_Decl *mod)
}
AST_Module *me_mod = AST_Module::narrow_from_decl (this);
- if (me_mod)
+ AST_Module *of_mod = AST_Module::narrow_from_decl (mod);
+
+ if (me_mod != 0 && of_mod != 0)
{
- AST_Module *po_mod = AST_Module::narrow_from_decl (mod);
- if (po_mod)
+ for (ACE_Unbounded_Set<AST_Module *>::CONST_ITERATOR i (
+ of_mod->prev_mods ());
+ !i.done ();
+ i.advance ())
{
- while (!!(po_mod = po_mod->previous_opening ()))
+ AST_Module **m = 0;
+ i.next (m);
+
+ if (*m == me_mod)
{
- if (po_mod == me_mod)
- {
- return true;
- }
+ return true;
}
}
}
-
+
return false;
}
//Narrowing methods for AST_Decl.
IMPL_NARROW_FROM_DECL(AST_Decl)
+
+
+
diff --git a/TAO/TAO_IDL/ast/ast_generator.cpp b/TAO/TAO_IDL/ast/ast_generator.cpp
index d490aa13622..4d9d631e449 100644
--- a/TAO/TAO_IDL/ast/ast_generator.cpp
+++ b/TAO/TAO_IDL/ast/ast_generator.cpp
@@ -119,7 +119,8 @@ AST_Generator::create_predefined_type (AST_PredefinedType::PredefinedType t,
{
AST_PredefinedType *retval = 0;
ACE_NEW_RETURN (retval,
- AST_PredefinedType (t, n),
+ AST_PredefinedType (t,
+ n),
0);
return retval;
@@ -129,55 +130,73 @@ AST_Module *
AST_Generator::create_module (UTL_Scope *s,
UTL_ScopedName *n)
{
+ // We create this first so if we find a module with the
+ // same name from an included file, we can add its
+ // members to the new module's scope.
AST_Module *retval = 0;
+ ACE_NEW_RETURN (retval,
+ AST_Module (n),
+ 0);
- // Check for another module of the same name in the scope.
+ AST_Module *m = 0;
+
+ // Check for another module of the same name in this scope.
for (UTL_ScopeActiveIterator iter (s, UTL_Scope::IK_decls);
!iter.is_done ();
iter.next ())
{
// Can't just check node type here, since it could be a
// template module or template module instantiation.
- AST_Module *m = AST_Module::narrow_from_decl (iter.item ());
- if (m && m->local_name ()->compare (n->last_component ()))
+ m = AST_Module::narrow_from_decl (iter.item ());
+
+ if (m != 0)
{
- // Create this new module with referance to the
- // "first" previous module found in scope.
- ACE_NEW_RETURN (retval, AST_Module (n, m), 0);
- retval->prefix (const_cast<char *> (m->prefix ()));
- return retval;
+ // Does it have the same name as the one we're
+ // supposed to create.
+ if (m->local_name ()->compare (n->last_component ()))
+ {
+ // Get m's previous_ member, plus all it's decls,
+ // into the new modules's previous_ member.
+ retval->add_to_previous (m);
+ retval->prefix (const_cast<char *> (m->prefix ()));
+ }
}
}
- // Since the scope didn't contain the same module name, it
- // doesn't mean that we haven't see it before. If the scope
- // is itself a module, and has been previously opened, any
- // of the previous openings may contain a previous opening
+ // If this scope is itself a module, and has been previously
+ // opened, the previous opening may contain a previous opening
// of the module we're creating.
- // AST_Module *prev_module = AST_Module::narrow_from_scope (s);
- AST_Module *prev_module = AST_Module::narrow_from_scope (s);
- if (prev_module)
+ m = AST_Module::narrow_from_scope (s);
+
+ if (m != 0)
{
- while (!!(prev_module= prev_module->previous_opening ()))
+ for (ACE_Unbounded_Set<AST_Module *>::CONST_ITERATOR i (
+ m->prev_mods ());
+ !i.done ();
+ i.advance ())
{
- for (UTL_ScopeActiveIterator iter (prev_module, UTL_Scope::IK_decls);
- !iter.is_done ();
- iter.next ())
+ AST_Module **mm = 0;
+ i.next (mm);
+
+ for (UTL_ScopeActiveIterator si (*mm, UTL_Scope::IK_decls);
+ !si.is_done ();
+ si.next ())
{
- AST_Module *m = AST_Module::narrow_from_decl (iter.item ());
- if (m && m->local_name ()->compare (n->last_component ()))
+ AST_Decl *d = si.item ();
+
+ if (retval->local_name ()->case_compare (d->local_name ()))
{
- // Create this new module with referance to the
- // "first" previous module found in scope.
- ACE_NEW_RETURN (retval, AST_Module (n, m), 0);
- return retval;
+ m = AST_Module::narrow_from_decl (d);
+
+ if (m != 0)
+ {
+ retval->add_to_previous (m);
+ }
}
}
}
}
- // There is no previous module to this one
- ACE_NEW_RETURN (retval, AST_Module (n), 0);
return retval;
}
@@ -220,17 +239,18 @@ AST_Generator::create_interface_fwd (UTL_ScopedName *n,
bool is_local,
bool is_abstract)
{
- AST_Interface
- *full_defn = this->create_interface (n,
- 0,
- -1,
- 0,
- 0,
- is_local,
- is_abstract);
+ AST_Interface *full_defn = this->create_interface (n,
+ 0,
+ -1,
+ 0,
+ 0,
+ is_local,
+ is_abstract);
+
AST_InterfaceFwd *retval = 0;
ACE_NEW_RETURN (retval,
- AST_InterfaceFwd (full_defn, n),
+ AST_InterfaceFwd (full_defn,
+ n),
0);
full_defn->fwd_decl (retval);
@@ -269,7 +289,8 @@ AST_Generator::create_valuetype (UTL_ScopedName *n,
// The following helps with OBV_ namespace generation.
AST_Module *m = AST_Module::narrow_from_scope (retval->defined_in ());
- if (m)
+
+ if (m != 0)
{
m->set_has_nested_valuetype ();
}
diff --git a/TAO/TAO_IDL/ast/ast_module.cpp b/TAO/TAO_IDL/ast/ast_module.cpp
index aab81d8fcdb..bd543a996aa 100644
--- a/TAO/TAO_IDL/ast/ast_module.cpp
+++ b/TAO/TAO_IDL/ast/ast_module.cpp
@@ -102,39 +102,23 @@ trademarks or registered trademarks of Sun Microsystems, Inc.
#include "nr_extern.h"
AST_Decl::NodeType const
- AST_Module::NT = AST_Decl::NT_module;
+AST_Module::NT = AST_Decl::NT_module;
-AST_Module::AST_Module (UTL_ScopedName *n, AST_Module *previous)
- : AST_Decl (AST_Decl::NT_module, n),
- UTL_Scope (AST_Decl::NT_module),
- pd_has_nested_valuetype_ (0),
- previous_opening_ (previous),
- last_in_same_parent_scope_ (this),
- from_inst_ (0)
+bool AST_Module::in_prev_ = false;
+
+AST_Module::AST_Module (UTL_ScopedName *n)
+ : AST_Decl (AST_Decl::NT_module,
+ n),
+ UTL_Scope (AST_Decl::NT_module),
+ pd_has_nested_valuetype (0),
+ from_inst_ (0)
{
- // NOTE previous passed into this constructor should be
- // the FIRST module that is a previous opening of this same
- // module in the scope in which it is stored. Later on if
- // the module is validated and added to it's scope, the
- // previous_opening_ will be adjusted to be the immediatly
- // previous opening of this module. See fe_add_module ()
- // below.
}
AST_Module::~AST_Module (void)
{
}
-void
-AST_Module::destroy (void)
-{
- this->UTL_Scope::destroy ();
- this->AST_Decl::destroy ();
-}
-
-IMPL_NARROW_FROM_DECL(AST_Module)
-IMPL_NARROW_FROM_SCOPE(AST_Module)
-
// Dump this AST_Module node to the ostream o.
void
AST_Module::dump (ACE_OSTREAM_TYPE &o)
@@ -147,38 +131,30 @@ AST_Module::dump (ACE_OSTREAM_TYPE &o)
this->dump_i (o, "}");
}
-// We actually want to match the LAST module found in
-// the scope being searched not the FIRST one in the
-// list.
-AST_Decl *
-AST_Module::adjust_found (
- bool /*ignore_fwd*/,
- bool /*full_def_only*/)
-{
- return this->last_in_same_parent_scope_;
-}
// Involved in OBV_ namespace generation.
void
AST_Module::set_has_nested_valuetype (void)
{
UTL_Scope *parent = this->defined_in ();
- if (parent && !this->pd_has_nested_valuetype_)
+
+ if (!this->pd_has_nested_valuetype && parent)
{
AST_Module *pm = AST_Module::narrow_from_scope (parent);
- if (pm)
+
+ if (pm != 0)
{
pm->set_has_nested_valuetype ();
}
}
- this->pd_has_nested_valuetype_ = 1;
+ this->pd_has_nested_valuetype = 1;
}
bool
AST_Module::has_nested_valuetype (void)
{
- return this->pd_has_nested_valuetype_;
+ return this->pd_has_nested_valuetype;
}
int
@@ -186,13 +162,15 @@ AST_Module::be_add_interface (AST_Interface *i,
AST_Interface *ix)
{
// Add it to scope.
- this->add_to_scope (i, ix);
+ this->add_to_scope (i,
+ ix);
// Add it to set of locally referenced symbols.
this->add_to_referenced (i,
false,
i->local_name (),
ix);
+
return 0;
}
@@ -206,6 +184,7 @@ AST_Module::be_add_valuetype (AST_ValueType *v)
this->add_to_referenced (v,
false,
v->local_name ());
+
return 0;
}
@@ -215,6 +194,7 @@ AST_Module::referenced (AST_Decl *e,
Identifier *id)
{
bool refd = this->UTL_Scope::referenced (e, id);
+
if (refd)
{
return true;
@@ -222,43 +202,67 @@ AST_Module::referenced (AST_Decl *e,
AST_Decl *d =
this->look_in_prev_mods_local (e->local_name (), true);
- if (!d)
+
+ if (0 == d)
{
return false;
}
-
+
AST_Type *t = AST_Type::narrow_from_decl (d);
- return (!t || t->is_defined ());
+ return 0 == t || t->is_defined ();
}
-AST_Module *
-AST_Module::previous_opening ()
+void
+AST_Module::add_to_previous (AST_Module *m)
{
- return this->previous_opening_;
+ this->prev_mods_.insert (m);
}
AST_Decl *
AST_Module::look_in_prev_mods_local (Identifier *e,
bool ignore_fwd)
{
- for (AST_Module *po = this->previous_opening_;
- po;
- po = po->previous_opening_)
+ AST_Module **m = 0;
+ AST_Decl *d = 0;
+
+ // If there are more than two openings of this module, we want
+ // to get the last one - the one that will have the decls from
+ // all the previous openings added to previous_.
+ for (ACE_Unbounded_Set<AST_Module *>::CONST_ITERATOR iter (
+ this->prev_mods_);
+ !iter.done ();
+ iter.advance ())
{
- for (UTL_ScopeActiveIterator iter (po, UTL_Scope::IK_decls);
- !iter.is_done ();
- iter.next ())
+ iter.next (m);
+
+ for (UTL_ScopeActiveIterator i (*m, UTL_Scope::IK_decls);
+ !i.is_done ();
+ i.next ())
{
- AST_Decl *d = iter.item ();
- if ((!ignore_fwd || !d->is_fwd ())
- && !!(d = d->adjust_found (ignore_fwd, false))
- && e->case_compare (d->local_name ()))
+ d = i.item ();
+
+ if (ignore_fwd)
+ {
+ AST_Decl::NodeType nt = d->node_type ();
+
+ if (nt == AST_Decl::NT_interface_fwd
+ || nt == AST_Decl::NT_eventtype_fwd
+ || nt == AST_Decl::NT_component_fwd
+ || nt == AST_Decl::NT_struct_fwd
+ || nt == AST_Decl::NT_union_fwd
+ || nt == AST_Decl::NT_valuetype_fwd)
+ {
+ continue;
+ }
+ }
+
+ if (e->case_compare (d->local_name ()))
{
return d;
}
}
}
-
+
return 0;
}
@@ -266,34 +270,79 @@ AST_Decl *
AST_Module::look_in_prev_mods (UTL_ScopedName *e,
bool full_def_only)
{
- for (AST_Module *po = this->previous_opening_;
- po;
- po = po->previous_opening_)
+ AST_Module **m = 0;
+ AST_Decl *d = 0;
+
+ // If there are more than two openings of this module, we want
+ // to get the last one - the one that will have the decls from
+ // all the previous openings added to previous_.
+ for (ACE_Unbounded_Set<AST_Module *>::CONST_ITERATOR iter (
+ this->prev_mods_);
+ !iter.done ();
+ iter.advance ())
{
- for (UTL_ScopeActiveIterator iter (po, UTL_Scope::IK_decls);
- !iter.is_done ();
- iter.next ())
+ iter.next (m);
+
+ for (UTL_ScopeActiveIterator i (*m, UTL_Scope::IK_decls);
+ !i.is_done ();
+ i.next ())
{
- AST_Decl *d = iter.item ();
- if (!!(d = d->adjust_found (full_def_only, full_def_only))
- && e->head ()->case_compare (d->local_name ()))
+ d = i.item ();
+
+ if (full_def_only)
{
+ AST_Decl::NodeType nt = d->node_type ();
+
+ if (nt == AST_Decl::NT_interface_fwd
+ || nt == AST_Decl::NT_eventtype_fwd
+ || nt == AST_Decl::NT_component_fwd
+ || nt == AST_Decl::NT_struct_fwd
+ || nt == AST_Decl::NT_union_fwd
+ || nt == AST_Decl::NT_valuetype_fwd)
+ {
+ continue;
+ }
+ }
+
+ if (e->head ()->case_compare (d->local_name ()))
+ {
+ UTL_Scope *s = DeclAsScope (d);
UTL_ScopedName *sn =
static_cast<UTL_ScopedName *> (e->tail ());
- if (sn)
+
+ if (sn == 0)
{
- UTL_Scope *s = DeclAsScope (d);
- return s ? s->lookup_by_name_r (sn, full_def_only) : 0;
+ return d;
+ }
+ else if (s != 0)
+ {
+ d = s->lookup_by_name_r (sn, full_def_only);
+
+ if (d != 0)
+ {
+ return d;
+ }
}
-
- return d;
}
}
}
-
+
return 0;
}
+ACE_Unbounded_Set<AST_Module *> &
+AST_Module::prev_mods (void)
+{
+ return this->prev_mods_;
+}
+
+void
+AST_Module::destroy (void)
+{
+ this->UTL_Scope::destroy ();
+ this->AST_Decl::destroy ();
+}
+
int
AST_Module::ast_accept (ast_visitor *visitor)
{
@@ -316,7 +365,16 @@ AST_Decl *
AST_Module::special_lookup (UTL_ScopedName *e,
bool full_def_only)
{
- return this->look_in_prev_mods (e, full_def_only);
+ AST_Decl *d = 0;
+
+ if (!AST_Module::in_prev_)
+ {
+ AST_Module::in_prev_ = true;
+ d = this->look_in_prev_mods (e, full_def_only);
+ AST_Module::in_prev_ = false;
+ }
+
+ return d;
}
//================================================
@@ -324,41 +382,38 @@ AST_Module::special_lookup (UTL_ScopedName *e,
AST_PredefinedType *
AST_Module::fe_add_predefined_type (AST_PredefinedType *t)
{
- return AST_PredefinedType::narrow_from_decl (
- this->fe_add_decl (t));
+ return
+ AST_PredefinedType::narrow_from_decl (
+ this->fe_add_decl (t));
}
AST_Module *
AST_Module::fe_add_module (AST_Module *t)
{
+ AST_Decl *d;
+ AST_Module *m = 0;
+
+ UTL_Scope *scope = t->defined_in ();
+ const char *prefix_holder = 0;
+
// If our prefix is empty, we check to see if an ancestor has one.
- if (!ACE_OS::strcmp (t->prefix (), ""))
+ while (ACE_OS::strcmp (t->prefix (), "") == 0 && scope != 0)
{
- UTL_Scope *scope = t->defined_in ();
- while (scope)
- {
- AST_Decl *parent = ScopeAsDecl (scope);
- const char *prefix_holder = parent->prefix ();
- if (!prefix_holder)
- {
- // We have reached global scope.
- break;
- }
+ AST_Decl *parent = ScopeAsDecl (scope);
+ prefix_holder = parent->prefix ();
- t->prefix (const_cast<char *> (prefix_holder));
- if (ACE_OS::strcmp (t->prefix (), ""))
- {
- break;
- }
-
- scope = parent->defined_in ();
+ // We have reached global scope.
+ if (prefix_holder == 0)
+ {
+ break;
}
+
+ t->prefix (const_cast<char *> (prefix_holder));
+ scope = parent->defined_in ();
}
// Already defined and cannot be redefined? Or already used?
- AST_Module *m = 0;
- AST_Decl *d = this->lookup_for_add (t);
- if (d)
+ if ((d = this->lookup_for_add (t)) != 0)
{
if (!can_be_redefined (d))
{
@@ -369,62 +424,37 @@ AST_Module::fe_add_module (AST_Module *t)
return 0;
}
- // has_ancestor() returns TRUE if both nodes are the same.
m = AST_Module::narrow_from_decl (d);
- if (t != m && t->has_ancestor (d))
+
+ // has_ancestor() returns TRUE if both nodes are the same.
+ if (t != m)
{
- idl_global->err ()->redefinition_in_scope (t, d);
- return 0;
+ if (t->has_ancestor (d))
+ {
+ idl_global->err ()->redefinition_in_scope (t,
+ d);
+ return 0;
+ }
}
const char *prev_prefix = d->prefix ();
const char *this_prefix = t->prefix ();
- if (!ACE_OS::strcmp (this_prefix, ""))
+ if (ACE_OS::strcmp (this_prefix, "") == 0)
{
t->prefix (const_cast<char *> (prev_prefix));
}
- else if (!ACE_OS::strcmp (prev_prefix, ""))
+ else
{
- d->prefix (const_cast<char *> (this_prefix));
- }
- }
-
- // Now we are actually adding this new module to the active
- // scopes, ensure that the previous openings are all updated
- // so that this new module is recorded as the current
- // "last module" definition in our scope.
- AST_Module *first_opening = t->previous_opening_;
- if (first_opening)
- {
- // When we created the module we simply stored the first
- // previous module we found (if any), we actually want
- // to refer to that module's LAST opening in that same scope
- // except this module itself (which isn't yet recorded anyway).
- t->previous_opening_ = first_opening->last_in_same_parent_scope_;
- if (first_opening->defined_in () == this)
- {
- // Since the previous openings are in our own scope,
- // make sure that these all point to this new module.
- for (AST_Module *pm = t->previous_opening_;
- pm;
- pm = pm->previous_opening_)
+ if (ACE_OS::strcmp (prev_prefix, "") == 0)
{
- pm->last_in_same_parent_scope_ = t;
- if (pm == first_opening)
- {
- // Even if there are still more previous modules,
- // the ones before this one are in a different
- // scope and do not need to be updated.
- break;
- }
+ d->prefix (const_cast<char *> (this_prefix));
}
}
}
- // If this node is not a reopened module, add it to scope
- // and referenced.
- if (!m || t != m)
+ // If this node is not a reopened module, add it to scope and referenced.
+ if (m == 0 || t != m)
{
// Add it to scope.
this->add_to_scope (t);
@@ -613,3 +643,6 @@ AST_Module::fe_add_porttype (AST_PortType *t)
AST_PortType::narrow_from_decl (
this->fe_add_decl (t));
}
+
+IMPL_NARROW_FROM_DECL(AST_Module)
+IMPL_NARROW_FROM_SCOPE(AST_Module)
diff --git a/TAO/TAO_IDL/be/be_module.cpp b/TAO/TAO_IDL/be/be_module.cpp
index 4e58cf830bd..12830451390 100644
--- a/TAO/TAO_IDL/be/be_module.cpp
+++ b/TAO/TAO_IDL/be/be_module.cpp
@@ -1,3 +1,4 @@
+
//=============================================================================
/**
* @file be_module.cpp
@@ -7,6 +8,7 @@
* Extension of class AST_Module that provides additional means for C++
* mapping of a module
*
+ *
* @author Copyright 1994-1995 by Sun Microsystems
* @author Inc. and Aniruddha Gokhale
*/
@@ -15,13 +17,15 @@
#include "be_module.h"
#include "be_visitor.h"
-be_module::be_module (UTL_ScopedName *n, AST_Module *previous)
+be_module::be_module (UTL_ScopedName *n)
: COMMON_Base (),
- AST_Decl (AST_Decl::NT_module, n),
+ AST_Decl (AST_Decl::NT_module,
+ n),
UTL_Scope (AST_Decl::NT_module),
- AST_Module (n, previous),
+ AST_Module (n),
be_scope (AST_Decl::NT_module),
- be_decl (AST_Decl::NT_module, n)
+ be_decl (AST_Decl::NT_module,
+ n)
{
}
diff --git a/TAO/TAO_IDL/include/utl_scope.h b/TAO/TAO_IDL/include/utl_scope.h
index 5756f966643..6fa5da565f0 100644
--- a/TAO/TAO_IDL/include/utl_scope.h
+++ b/TAO/TAO_IDL/include/utl_scope.h
@@ -508,6 +508,8 @@ private:
iter_lookup_by_name_local (AST_Decl *d,
UTL_ScopedName *e,
bool full_def_only = false);
+
+ AST_Decl *local_checks (AST_Decl *d, bool full_def_only);
};
// Active iterator for a UTL_Scope node
diff --git a/TAO/TAO_IDL/util/utl_scope.cpp b/TAO/TAO_IDL/util/utl_scope.cpp
index 58850ed7805..7869415dc57 100644
--- a/TAO/TAO_IDL/util/utl_scope.cpp
+++ b/TAO/TAO_IDL/util/utl_scope.cpp
@@ -281,49 +281,49 @@ UTL_Scope::redef_clash (AST_Decl::NodeType new_nt,
AST_Decl::NodeType scope_elem_nt)
{
switch (new_nt)
- {
- case AST_Decl::NT_module:
- return scope_elem_nt != AST_Decl::NT_module;
+ {
+ case AST_Decl::NT_module:
+ return scope_elem_nt != AST_Decl::NT_module;
- case AST_Decl::NT_struct:
- case AST_Decl::NT_struct_fwd:
- return scope_elem_nt != AST_Decl::NT_struct_fwd;
+ case AST_Decl::NT_struct:
+ case AST_Decl::NT_struct_fwd:
+ return scope_elem_nt != AST_Decl::NT_struct_fwd;
- case AST_Decl::NT_union:
- case AST_Decl::NT_union_fwd:
- return scope_elem_nt != AST_Decl::NT_union_fwd;
+ case AST_Decl::NT_union:
+ case AST_Decl::NT_union_fwd:
+ return scope_elem_nt != AST_Decl::NT_union_fwd;
- case AST_Decl::NT_interface:
- return scope_elem_nt != AST_Decl::NT_interface_fwd;
+ case AST_Decl::NT_interface:
+ return scope_elem_nt != AST_Decl::NT_interface_fwd;
- case AST_Decl::NT_component:
- return scope_elem_nt != AST_Decl::NT_component_fwd;
+ case AST_Decl::NT_component:
+ return scope_elem_nt != AST_Decl::NT_component_fwd;
- case AST_Decl::NT_interface_fwd:
- return ( scope_elem_nt != AST_Decl::NT_interface_fwd
- && scope_elem_nt != AST_Decl::NT_interface);
+ case AST_Decl::NT_interface_fwd:
+ return ( scope_elem_nt != AST_Decl::NT_interface_fwd
+ && scope_elem_nt != AST_Decl::NT_interface);
- case AST_Decl::NT_component_fwd:
- return ( scope_elem_nt != AST_Decl::NT_component_fwd
- && scope_elem_nt != AST_Decl::NT_component);
+ case AST_Decl::NT_component_fwd:
+ return ( scope_elem_nt != AST_Decl::NT_component_fwd
+ && scope_elem_nt != AST_Decl::NT_component);
- case AST_Decl::NT_valuetype:
- return scope_elem_nt != AST_Decl::NT_valuetype_fwd;
+ case AST_Decl::NT_valuetype:
+ return scope_elem_nt != AST_Decl::NT_valuetype_fwd;
- case AST_Decl::NT_eventtype:
- return scope_elem_nt != AST_Decl::NT_eventtype_fwd;
+ case AST_Decl::NT_eventtype:
+ return scope_elem_nt != AST_Decl::NT_eventtype_fwd;
- case AST_Decl::NT_valuetype_fwd:
- return ( scope_elem_nt != AST_Decl::NT_valuetype_fwd
- && scope_elem_nt != AST_Decl::NT_valuetype);
+ case AST_Decl::NT_valuetype_fwd:
+ return ( scope_elem_nt != AST_Decl::NT_valuetype_fwd
+ && scope_elem_nt != AST_Decl::NT_valuetype);
- case AST_Decl::NT_eventtype_fwd:
- return ( scope_elem_nt != AST_Decl::NT_eventtype_fwd
- && scope_elem_nt != AST_Decl::NT_eventtype);
+ case AST_Decl::NT_eventtype_fwd:
+ return ( scope_elem_nt != AST_Decl::NT_eventtype_fwd
+ && scope_elem_nt != AST_Decl::NT_eventtype);
- default:
- return true;
- }
+ default:
+ return true;
+ }
}
void
@@ -487,9 +487,9 @@ UTL_Scope::fe_add_decl (AST_Decl *t)
AST_Decl::NodeType tnt = t->node_type ();
AST_Decl::NodeType dnt = d->node_type ();
- // Factories are not inherited, so they can be
- // redefined, but not in the same scope (home or
- // valuetype).
+ /// Factories are not inherited, so they can be
+ /// redefined, but not in the same scope (home or
+ /// valuetype).
bool inherited_factory =
( tnt == AST_Decl::NT_factory
&& dnt == AST_Decl::NT_factory
@@ -505,12 +505,12 @@ UTL_Scope::fe_add_decl (AST_Decl *t)
}
}
- // For convenience, AST_Template_Module_Inst inherits
- // from AST_Field, but has a node type of NT_module.
- // Since we then can't add it using fe_add_module(), a
- // check is needed here to avoid a redefinition error,
- // if the instantiated module is meant to reopen a
- // previous one.
+ /// For convenience, AST_Template_Module_Inst inherits
+ /// from AST_Field, but has a node type of NT_module.
+ /// Since we then can't add it using fe_add_module(), a
+ /// check is needed here to avoid a redefinition error,
+ /// if the instantiated module is meant to reopen a
+ /// previous one.
AST_Decl::NodeType lnt = d->node_type ();
AST_Decl::NodeType ant = t->node_type ();
@@ -574,8 +574,8 @@ UTL_Scope::fe_add_ref_decl (AST_Field *t)
}
}
- // Catches struct/union/exception which all maintain a queue
- // for fields as distinct from decls and enum values.
+ /// Catches struct/union/exception which all maintain a queue
+ /// for fields as distinct from decls and enum values.
AST_Structure *s = AST_Structure::narrow_from_scope (this);
if (s)
{
@@ -611,8 +611,8 @@ UTL_Scope::fe_add_full_struct_type (AST_Structure *t)
AST_Decl::NodeType nt = ScopeAsDecl (this)->node_type ();
- // Decls inside a struct or union are also referenced by
- // fields, and so must be handled differently.
+ /// Decls inside a struct or union are also referenced by
+ /// fields, and so must be handled differently.
if ( nt == AST_Decl::NT_struct
|| nt == AST_Decl::NT_union
|| nt == AST_Decl::NT_except)
@@ -638,15 +638,18 @@ UTL_Scope::fe_add_fwd_struct_type (AST_StructureFwd *t)
AST_Decl *d = this->lookup_for_add (t);
if (d)
{
+ AST_Decl::NodeType nt = d->node_type ();
+
// There used to be another check here ANDed with the one below:
// d->defined_in () == this. But lookup_for_add() calls only
// lookup_by_name_local(), which does not bump up the scope,
// and look_in_prev_mods() for modules. If look_in_prev_mods()
// finds something, the scopes will NOT be the same pointer
// value, but the result is what we want.
- if (d->node_type () == AST_Decl::NT_struct)
+ if (nt == AST_Decl::NT_struct)
{
- t->set_full_definition (AST_Structure::narrow_from_decl (d));
+ AST_Structure *s = AST_Structure::narrow_from_decl (d);
+ t->set_full_definition (s);
}
else if (!can_be_redefined (d))
{
@@ -1000,7 +1003,8 @@ UTL_Scope::lookup_pseudo (Identifier *e)
i.next ())
{
AST_Decl *d = i.item ();
- if (e->case_compare (d->local_name ()))
+ Identifier *item_name = d->local_name ();
+ if (e->case_compare (item_name))
{
// These have to be located here because we are just looking
// up a scoped name - skip for imported nodes.
@@ -1212,134 +1216,169 @@ UTL_Scope::lookup_by_name_local (Identifier *e,
!i.is_done ();
i.next ())
{
- AST_Decl *d = i.item ()->adjust_found (true, full_def_only);
- if (d)
+ AST_Decl *tmp = i.item ();
+ Identifier *item_name = tmp->local_name ();
+
+ if (item_name
+ // Right now we populate the global scope with all the CORBA basic
+ // types, so something like 'ULong' in an IDL file will find a
+ // match, unless we skip over these items. This is a workaround until
+ // there's time to fix the code generation for CORBA basic types.
+ && (in_corba || ACE_OS::strcmp (tmp->name ()->head ()->get_string (), "CORBA"))
+ && e->case_compare (item_name))
{
- Identifier *item_name = d->local_name ();
- if (item_name
- // Right now we populate the global scope with
- // all the CORBA basic types, so something like
- // 'ULong' in an IDL file will find a match,
- // unless we skip over these items. This is a
- // workaround until there's time to fix the code
- // generation for CORBA basic types.
- && (in_corba || ACE_OS::strcmp (
- d->name ()->head ()->get_string (), "CORBA"))
- && e->case_compare (item_name))
+ if (AST_Template_Module_Ref::narrow_from_decl (tmp))
+ {
+ // An IDL module has been created in this scope corresponding
+ // to this node. That's the one we want to match, and it
+ // occurs in the scope right after this node, so we'll match
+ // what we're looking for on the next iteration.
+ continue;
+ }
+
+ d = tmp;
+ AST_Decl::NodeType nt = tmp->node_type ();
+ if (nt == AST_Decl::NT_module)
+ {
+ // We are wanting the LAST module opening in this scope, so having
+ // stored this one, keep searching in case we find another later on.
+ continue;
+ }
+
+ // Special case for forward declared types,
+ // In this case, we want to return
+ // the full definition member, whether defined yet or not.
+ // NOTE: corresponding full_definition fe_add_* methods
+ // depend on the behavior below!
+ if ( nt == AST_Decl::NT_struct_fwd
+ || nt == AST_Decl::NT_union_fwd)
+ {
+ d = AST_StructureFwd::narrow_from_decl (tmp)->full_definition ();
+ }
+ else if ( nt == AST_Decl::NT_interface_fwd
+ || nt == AST_Decl::NT_valuetype_fwd
+ || nt == AST_Decl::NT_component_fwd
+ || nt == AST_Decl::NT_eventtype_fwd)
{
- return d;
+ d = AST_InterfaceFwd::narrow_from_decl (tmp)->full_definition ();
}
+
+ break; // We have found the one and only one we are looking for.
}
}
- // Ok the name wasn't found in the current scope, if this
- // scope is a module, we can check it's previous openings!
- AST_Module *m = AST_Module::narrow_from_scope (this);
- if (m)
+ if (!d)
{
- d = m->look_in_prev_mods_local (e);
- if (d && (!full_def_only || d->is_defined ()))
+ AST_Module *m = AST_Module::narrow_from_scope (this);
+ if (m)
{
- return d;
+ d = m->look_in_prev_mods_local (e);
+ if (d && full_def_only && !d->is_defined ())
+ {
+ d = 0;
+ }
}
- }
- else
- {
- // Or if this scope is an interface, we can check if
- // it was inherited!
- AST_Interface *i =
- AST_Interface::narrow_from_scope (this);
- if (i)
+ else
{
- d = i->look_in_inherited_local (e);
- if (d)
+ AST_Interface *i =
+ AST_Interface::narrow_from_scope (this);
+ if (i)
{
- return d;
+ d = i->look_in_inherited_local (e);
}
}
}
- // There are some cases where the iteration over IK_decls
- // above will fail because what we're searching for has
- // been added only to the local types. It's less complicated
- // to do the iteration below only as a last resort.
- for (UTL_ScopeActiveIterator i (this, IK_localtypes);
- !i.is_done ();
- i.next ())
+ /// There are some cases where the iteration over IK_decls
+ /// above will fail because what we're searching for has been
+ /// added only to the local types. It's less complicated to
+ /// do the iteration below only as a last resort.
+ if (!d)
{
- d = i.item ();
- if (e->case_compare (d->local_name ()))
+ for (UTL_ScopeActiveIterator i (this, IK_localtypes);
+ !i.is_done ();
+ i.next ())
{
- return d;
+ AST_Decl *l = i.item ();
+ if (e->case_compare (l->local_name ()))
+ {
+ d = l;
+ break;
+ }
}
}
- return 0;
+ return d;
}
AST_Decl *
UTL_Scope::lookup_by_name (UTL_ScopedName *e,
bool full_def_only)
{
+ /// Empty name? Exit immediately.
if (!e)
{
return 0;
}
- // If name starts with "::" or "" start lookup in global scope,
- // if we're not there already, short_circuiting the
- // scope-expanding iteration below.
- UTL_Scope *work = this;
+ UTL_ScopedName *work_name = e;
+ UTL_Scope *work_scope = this;
+
+ /// If name starts with "::" or "" start lookup in global scope,
+ /// if we're not there already, short_circuiting the
+ /// scope-expanding iteration below.
const bool global_scope_name = this->is_global_name (e->head ());
if (global_scope_name)
{
- e = static_cast<UTL_ScopedName *> (e->tail ());
- work = idl_global->root ();
+ work_name = static_cast<UTL_ScopedName *> (e->tail ());
+ work_scope = idl_global->root ();
}
- AST_Decl *d = work->lookup_by_name_r (e, full_def_only);
- if (!d)
- {
- // If all else fails, expand the scope upwards
- for (UTL_Scope *parent = ScopeAsDecl (work)->defined_in ();
- parent;
- parent = ScopeAsDecl (parent)->defined_in ())
- {
- d = parent->lookup_by_name_r (e, full_def_only);
- if (d)
- {
- break;
- }
- }
- }
+ AST_Decl *d =
+ work_scope->lookup_by_name_r (work_name, full_def_only);
+
+ UTL_Scope *outer = ScopeAsDecl (work_scope)->defined_in ();
ACE_Unbounded_Queue<AST_Decl *> &masks =
idl_global->masking_scopes ();
- if (d && !global_scope_name)
+
+ /// If all else fails, expand the scope, otherwise
+ /// try to match the rest of the scoped name.
+ while (!d && outer)
{
+ d = outer->lookup_by_name_r (work_name, full_def_only);
+
+ AST_Decl *s = ScopeAsDecl (outer);
+ outer = s->defined_in ();
+ }
+
+ if (!global_scope_name && d)
+ {
+ ACE_CDR::ULong slot = 0uL;
+ AST_Decl *outer_scope = 0;
const char *head = e->head ()->get_string ();
- ACE_Unbounded_Queue<AST_Decl *>::CONST_ITERATOR i (masks);
- AST_Decl **item = 0;
- if (i.next (item))
+ for (ACE_Unbounded_Queue<AST_Decl *>::CONST_ITERATOR i (masks);
+ !i.done ();
+ i.advance (), ++slot)
{
- // The first queue item (last enqueued) will always
- // match e->head(), but does not indicate an error.
- AST_Decl *outer_decl = *item;
+ AST_Decl **item = 0;
+ i.next (item);
- // Now check that the rest of the names don't collide
- while (i.advance ())
+ /// The first queue item (last enqueued) will always
+ /// match e->head(), but does not indicate an error.
+ if (!slot)
{
- i.next (item);
- const char *lname =
- (*item)->local_name ()->get_string ();
- if (!ACE_OS::strcmp (lname, head)
- && !(*item)->masking_checks (outer_decl))
- {
- idl_global->err ()
- ->scope_masking_error (d, *item);
- d = 0; // Hidden scopes can't be used indirectly.
- break;
- }
+ outer_scope = *item;
+ continue;
+ }
+
+ const char *lname = (*item)->local_name ()->get_string ();
+ if (!ACE_OS::strcmp (lname, head)
+ && !(*item)->masking_checks (outer_scope))
+ {
+ idl_global->err ()->scope_masking_error (d, *item);
+ d = 0;
+ break;
}
}
}
@@ -1353,96 +1392,105 @@ AST_Decl *
UTL_Scope::lookup_by_name_r (UTL_ScopedName *e,
bool full_def_only)
{
- bool work_another_level;
- UTL_Scope *work = this;
- do
+ // Will catch Object, TypeCode, TCKind, ValueBase and
+ // AbstractBase. A non-zero result of this lookup determines the
+ // generation of some #includes and, whether successful or not,
+ // incurs no extra overhead.
+ AST_Decl *d = this->lookup_pseudo (e->head ());
+ if (d)
{
- AST_Decl *d = work->lookup_pseudo (e->head ());
- if (d)
+ return d;
+ }
+
+ if (this->idl_keyword_clash (e->head ()))
+ {
+ return 0;
+ }
+
+ /// Before proceeding to normal lookup, check if the name
+ /// matches a template module parameter. If so, the return
+ /// value is created on the heap and is owned by the caller
+ /// of this lookup.
+ if (e->length () == 1)
+ {
+ AST_Param_Holder *param_holder =
+ UTL_Scope::match_param (e);
+
+ // Since we are inside the scope of a template module, any
+ // single-segment scoped name that matches a template
+ // parameter name has to be a reference to that parameter,
+ // so we return the created placeholder. If there's no
+ // match, 0 is returned, and we proceed with the regular
+ // lookup.
+ if (param_holder)
{
- return d;
+ return param_holder;
}
+ }
- if (work->idl_keyword_clash (e->head ()))
+ bool in_corba = !ACE_OS::strcmp (e->head ()->get_string (), "CORBA");
+ for (UTL_ScopeActiveIterator i (this, IK_decls);
+ !i.is_done ();
+ i.next ())
+ {
+ AST_Decl *tmp = i.item ();
+
+ // Right now we populate the global scope with all the CORBA basic
+ // types, so something like 'ULong' in an IDL file will find a
+ // match, unless we skip over these items. This is a workaround until
+ // there's time to fix the code generation for CORBA basic types.
+ if (!in_corba
+ && !ACE_OS::strcmp (tmp->name ()->head ()->get_string (), "CORBA"))
{
- return 0;
+ continue;
}
- // Before proceeding to normal lookup, check if the name
- // matches a template module parameter. If so, the return
- // value is created on the heap and is owned by the caller
- // of this lookup.
- if (e->length () == 1)
+ if (tmp->local_name ()->case_compare (e->head ()))
{
- AST_Param_Holder *param_holder =
- UTL_Scope::match_param (e);
-
- // Since we are inside the scope of a template module, any
- // single-segment scoped name that matches a template
- // parameter name has to be a reference to that parameter,
- // so we return the created placeholder. If there's no
- // match, 0 is returned, and we proceed with the regular
- // lookup.
- if (param_holder)
+ d = tmp;
+ if (e->length () == 1)
{
- return param_holder;
+ d = this->local_checks (d, full_def_only);
}
- }
-
- work_another_level = false; // Until we find something.
- bool in_corba =
- !ACE_OS::strcmp (e->head ()->get_string (), "CORBA");
- for (UTL_ScopeActiveIterator i (work, IK_decls);
- !i.is_done ();
- i.next ())
- {
- if (!!(d = i.item ()->adjust_found (true, full_def_only))
- && (in_corba ||
- ACE_OS::strcmp (d->name ()->head ()->get_string (),
- "CORBA"))
- && d->local_name ()->case_compare (e->head ()))
+ else
{
- // Ok we found a match, is there any more to find?
- if (e->length () == 1)
+ UTL_Scope *s = DeclAsScope (d);
+ if (s)
{
- return d; // Last scope name matched
- }
+ idl_global->masking_scopes ().enqueue_head (d);
- work = DeclAsScope (d); // The next scope to search
- if (!work)
- {
- // Template weirdness, actual one we want should be
- // found next in this search, keep going.
- continue;
+ UTL_ScopedName *sn =
+ static_cast<UTL_ScopedName *> (e->tail ());
+ d = s->lookup_by_name_r (sn, full_def_only);
}
-
- work_another_level = true;
- idl_global->masking_scopes ().enqueue_head (d);
- e = static_cast<UTL_ScopedName *> (e->tail ());
- break;
}
}
- } while (work_another_level);
+ }
- // A rare enough case that it's worth it to separate it and
- // do it as a last resort. Catches anonymnous types, enums
- // and members with their types defined all in one statement.
- if (e->length () == 1)
+ /// A rare enough case that it's worth it to separate it and
+ /// do it as a last resort. Catches anonymnous types, enums
+ /// and members with their types defined all in one statement.
+ if (!d)
{
- for (UTL_ScopeActiveIterator i (work, IK_localtypes);
+ for (UTL_ScopeActiveIterator i (this, IK_localtypes);
!i.is_done ();
i.next ())
{
- AST_Decl *d = i.item ();
- if (d->local_name ()->case_compare (e->head ()))
+ AST_Decl *tmp = i.item ();
+ if (tmp->local_name ()->case_compare (e->head ()))
{
- return d;
+ d = tmp;
+ break;
}
}
}
- // Last resort, check other module openings of working scope.
- return work->special_lookup (e, full_def_only);
+ if (!d)
+ {
+ d = this->special_lookup (e, full_def_only);
+ }
+
+ return d;
}
// Add a node to set of nodes referenced in this scope.
@@ -1507,15 +1555,21 @@ UTL_Scope::add_to_referenced (AST_Decl *e,
}
else if (this->referenced (ex))
{
- long i;
- for (i = this->pd_referenced_used;
- 0 < i && this->pd_referenced [i - 1] != ex;
- --i)
+ for (long i = this->pd_referenced_used; 0 < i; --i)
{
- this->pd_referenced [i] = this->pd_referenced [i - 1];
+ this->pd_referenced[i] = this->pd_referenced[i - 1];
+
+ if (this->pd_referenced[i - 1] == ex)
+ {
+ this->pd_referenced[i] = e;
+ break;
+ }
+ }
+
+ if (0 < this->pd_referenced_used)
+ {
+ ++this->pd_referenced_used;
}
- this->pd_referenced [i] = e;
- ++this->pd_referenced_used;
}
// Now, if recursive is specified and "this" is not a common ancestor
@@ -1555,6 +1609,7 @@ UTL_Scope::add_to_name_referenced (Identifier *id)
}
delete [] this->pd_name_referenced;
+
this->pd_name_referenced = name_tmp;
}
@@ -1574,6 +1629,7 @@ UTL_Scope::replace_referenced (AST_Decl *old_decl,
break;
}
}
+
}
void
@@ -1602,7 +1658,6 @@ UTL_Scope::add_to_scope (AST_Decl *e,
Identifier *decl_name = e->local_name ();
char *decl_string = decl_name->get_string ();
- AST_Decl::NodeType new_nt = e->node_type ();
// First, make sure there's no clash between e, that was
// just declared, and some other identifier referenced
@@ -1620,6 +1675,7 @@ UTL_Scope::add_to_scope (AST_Decl *e,
// error, unless they're both modules (which can be
// reopened) or we have a belated definition of a
// forward-declared interface.
+ AST_Decl::NodeType new_nt = e->node_type ();
AST_Decl::NodeType scope_elem_nt = (*tmp)->node_type ();
if (decl_name->compare (ref_name)
@@ -1708,6 +1764,7 @@ UTL_Scope::add_to_scope (AST_Decl *e,
}
delete [] this->pd_decls;
+
this->pd_decls = tmp;
}
@@ -1718,14 +1775,17 @@ UTL_Scope::add_to_scope (AST_Decl *e,
}
else
{
- long i;
- for (i = this->pd_decls_used;
- 0 < i && this->pd_decls [i - 1] != ex;
- --i)
+ for (long i = this->pd_decls_used; 0 < i; --i)
{
- this->pd_decls [i] = this->pd_decls [i - 1];
+ this->pd_decls[i] = this->pd_decls[i - 1];
+
+ if (this->pd_decls[i - 1] == ex)
+ {
+ this->pd_decls[i] = e;
+ break;
+ }
}
- this->pd_decls [i] = e;
+
++this->pd_decls_used;
}
}
@@ -1766,13 +1826,10 @@ bool
UTL_Scope::referenced (AST_Decl *e,
Identifier *id)
{
- Identifier *test = e->local_name ();
- AST_Decl::NodeType nt = e->node_type ();
-
AST_Decl **tmp = this->pd_referenced;
for (long i = this->pd_referenced_used;
- i--; // NOTE test with i--
- ++tmp)
+ 0 < i;
+ --i, ++tmp)
{
// Same node?
if (*tmp == e)
@@ -1782,10 +1839,14 @@ UTL_Scope::referenced (AST_Decl *e,
// Are we definging a forward declared struct, union, or interface,
// or reopening a module?
- if (!this->redef_clash (nt, (*tmp)->node_type ())
- && (*tmp)->local_name ()->compare (test))
+ if (!this->redef_clash (e->node_type (), (*tmp)->node_type ()))
{
- return false;
+ Identifier *member = (*tmp)->local_name ();
+ Identifier *test = e->local_name ();
+ if (member->compare (test))
+ {
+ return false;
+ }
}
}
@@ -1799,8 +1860,8 @@ UTL_Scope::referenced (AST_Decl *e,
{
Identifier **name_tmp = this->pd_name_referenced;
for (long j = this->pd_name_referenced_used;
- j--; // NOTE test with j--
- ++name_tmp)
+ 0 < j;
+ --j, ++name_tmp)
{
// If we are a module, there is no clash, if we
// are an interface, this is not the right place to
@@ -1809,18 +1870,18 @@ UTL_Scope::referenced (AST_Decl *e,
// that was, and it can appear any number of times
// in this scope without a clash.
AST_Decl::NodeType nt = e->node_type ();
- if ( nt != AST_Decl::NT_module
+ if (id->compare (*name_tmp)
+ && nt != AST_Decl::NT_module
&& nt != AST_Decl::NT_param_holder
- && e->defined_in () == this
- && id->compare (*name_tmp))
+ && e->defined_in () == this)
{
idl_global->err ()->redef_error (id->get_string (),
(*name_tmp)->get_string ());
return true;
}
// No clash if one or the other of the identifiers was escaped.
- else if (!(id->escaped () ^ (*name_tmp)->escaped ())
- && id->case_compare_quiet (*name_tmp))
+ else if (id->case_compare_quiet (*name_tmp)
+ && !(id->escaped () ^ (*name_tmp)->escaped ()))
{
if (idl_global->case_diff_error ())
{
@@ -1936,19 +1997,24 @@ UTL_Scope::match_param (UTL_ScopedName *e)
return 0;
}
+ AST_Param_Holder *retval = 0;
const char *name = e->first_component ()->get_string ();
- FE_Utils::T_Param_Info *param = 0;
for (FE_Utils::T_PARAMLIST_INFO::CONST_ITERATOR i (*params);
- i.next (param);
+ !i.done ();
i.advance ())
{
+ FE_Utils::T_Param_Info *param = 0;
+ i.next (param);
+
if (param->name_ == name)
{
- return idl_global->gen ()->create_param_holder (e, param);
+ retval =
+ idl_global->gen ()->create_param_holder (e, param);
+ break;
}
}
- return 0;
+ return retval;
}
bool
@@ -1989,11 +2055,12 @@ UTL_Scope::arg_specific_error (AST_Decl *t)
AST_Argument *arg = AST_Argument::narrow_from_decl (t);
AST_Argument::Direction d = arg->direction ();
+ AST_Operation::Flags flag = op->flags ();
- // Cannot add OUT or INOUT argument to oneway operation.
+ /// Cannot add OUT or INOUT argument to oneway operation.
if (( d == AST_Argument::dir_OUT
|| d == AST_Argument::dir_INOUT)
- && op->flags () == AST_Operation::OP_oneway)
+ && flag == AST_Operation::OP_oneway)
{
idl_global->err ()->error2 (UTL_Error::EIDL_ONEWAY_CONFLICT,
t,
@@ -2001,8 +2068,9 @@ UTL_Scope::arg_specific_error (AST_Decl *t)
return true;
}
- // This error is not caught in y.tab.cpp so we check for it here.
AST_Type *arg_type = arg->field_type ();
+
+ /// This error is not caught in y.tab.cpp so we check for it here.
if ( arg_type->node_type () == AST_Decl::NT_array
&& arg_type->anonymous ())
{
@@ -2016,14 +2084,14 @@ UTL_Scope::arg_specific_error (AST_Decl *t)
void
UTL_Scope::smart_local_add (AST_Decl *t)
{
- // Catches struct, union * exception
+ /// Catches struct, union * exception
AST_Structure *s = AST_Structure::narrow_from_scope (this);
- // Catches AST_Field and AST_UnionBranch.
+ /// Catches AST_Field and AST_UnionBranch.
AST_Field *f = AST_Field::narrow_from_decl (t);
- // Decls inside a struct/union/exception are also referenced by
- // fields, and so must be handled differently.
+ /// Decls inside a struct/union/exception are also referenced by
+ /// fields, and so must be handled differently.
if (s && !f)
{
this->add_to_local_types (t);
@@ -2051,7 +2119,7 @@ UTL_Scope::smart_local_add (AST_Decl *t)
}
}
-// Determines if a name is global.
+/// Determines if a name is global.
bool
UTL_Scope::is_global_name (Identifier *i)
{
@@ -2061,7 +2129,12 @@ UTL_Scope::is_global_name (Identifier *i)
}
ACE_CString cmp (i->get_string (), 0, false);
- return (cmp == "" || cmp == "::");
+ if (cmp == "" || cmp == "::")
+ {
+ return true;
+ }
+
+ return false;
}
AST_Decl *
@@ -2103,8 +2176,14 @@ UTL_Scope::iter_lookup_by_name_local (AST_Decl *d,
else
{
AST_Interface *i = AST_Interface::narrow_from_decl (d);
- result = i ? i->look_in_inherited_local (e->head ())
- : sc->look_in_prev_mods_local (e->head (), true);
+ if (i)
+ {
+ result = i->look_in_inherited_local (e->head ());
+ }
+ else
+ {
+ result = sc->look_in_prev_mods_local (e->head (), true);
+ }
}
UTL_ScopedName *sn = (UTL_ScopedName *) e->tail ();
@@ -2126,6 +2205,48 @@ UTL_Scope::iter_lookup_by_name_local (AST_Decl *d,
return result;
}
+AST_Decl *
+UTL_Scope::local_checks (AST_Decl *d, bool full_def_only)
+{
+ AST_Decl *retval = 0;
+
+ // Special case for forward declared types,
+ // In this case, we want to return
+ // the full definition member, whether defined yet or not.
+ // NOTE: corresponding full_definition fe_add_* methods
+ // depend on the behavior below!
+ AST_Decl::NodeType nt = d->node_type ();
+ if ( nt == AST_Decl::NT_struct_fwd
+ || nt == AST_Decl::NT_union_fwd)
+ {
+ AST_Structure *s =
+ AST_StructureFwd::narrow_from_decl (d)->full_definition ();
+
+ retval = (full_def_only && !s->is_defined () ? 0 : s);
+ }
+ else if ( nt == AST_Decl::NT_interface_fwd
+ || nt == AST_Decl::NT_valuetype_fwd
+ || nt == AST_Decl::NT_component_fwd
+ || nt == AST_Decl::NT_eventtype_fwd)
+ {
+ AST_Interface *i =
+ AST_InterfaceFwd::narrow_from_decl (d)->full_definition ();
+
+ retval = (full_def_only && !i->is_defined () ? 0 : i);
+ }
+ else if (!AST_Template_Module_Ref::narrow_from_decl (d))
+ {
+ // If we are not a template module reference, ok. If so,
+ // however, we don't want to return that type, we want
+ // the regular module which will follow it immediately
+ // in this scope, return 0 and catch it on the nest
+ // iteration.
+ retval = d;
+ }
+
+ return retval;
+}
+
IMPL_NARROW_FROM_SCOPE(UTL_Scope)
// UTL_SCOPE_ACTIVE_ITERATOR