utl_scope.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 2,436 行 · 第 1/4 页
CPP
2,436 行
if (itf != 0
&& itf->defined_in () == this
&& !itf->is_defined ())
{
return;
}
}
// Only insert if it is not there already.
if (this->referenced (e, id))
{
return;
}
// Make sure there's space for one more decl.
if (this->pd_referenced_allocated == this->pd_referenced_used)
{
oreferenced_allocated = this->pd_referenced_allocated;
pd_referenced_allocated += INCREMENT;
ACE_NEW (tmp,
AST_Decl *[this->pd_referenced_allocated]);
for (i = 0; i < oreferenced_allocated; i++)
{
tmp[i] = this->pd_referenced[i];
}
delete [] this->pd_referenced;
this->pd_referenced = tmp;
}
// Insert new decl.
this->pd_referenced[this->pd_referenced_used++] = e;
// Insert new reference.
if (ex == 0)
{
this->pd_referenced[this->pd_referenced_used++] = e;
}
else if (this->referenced (ex))
{
for (i = this->pd_referenced_used; i > 0; i--)
{
this->pd_referenced[i] = this->pd_referenced[i - 1];
if (this->pd_referenced[i-1] == ex)
{
this->pd_referenced[i] = e;
break;
}
}
++this->pd_referenced_used;
}
// Now, if recursive is specified and "this" is not a common ancestor
// of the referencing scope and the scope of definition of "e" then
// add "e" to the set of referenced nodes in the parent of "this".
if (recursive && !(e->has_ancestor (ScopeAsDecl (this))))
{
s = e->defined_in ();
if (s != 0)
{
s->add_to_referenced (e,
recursive,
id);
}
}
// Add the identifier arg, if non-null, to the identifier list.
if (id)
{
if (this->pd_name_referenced_allocated == this->pd_name_referenced_used)
{
long name_referenced_allocated = this->pd_name_referenced_allocated;
pd_name_referenced_allocated += INCREMENT;
Identifier **name_tmp = 0;
ACE_NEW (name_tmp,
Identifier *[this->pd_name_referenced_allocated]);
for (i = 0; i < name_referenced_allocated; i++)
{
name_tmp[i] = this->pd_name_referenced[i];
}
delete [] this->pd_name_referenced;
this->pd_name_referenced = name_tmp;
}
// Insert new identifier.
this->pd_name_referenced[this->pd_name_referenced_used++] = id;
}
}
void
UTL_Scope::replace_referenced (AST_Decl *old_decl,
AST_Decl *new_decl)
{
for (int i = 0; i < this->pd_referenced_used; i++)
{
if (this->pd_referenced[i] == old_decl)
{
this->pd_referenced[i] = new_decl;
break;
}
}
}
void
UTL_Scope::replace_scope (AST_Decl *old_decl,
AST_Decl *new_decl)
{
for (int i = 0; i < pd_decls_used; i++)
{
if (this->pd_decls[i] == old_decl)
{
this->pd_decls[i] = new_decl;
break;
}
}
}
// Add a node to set of nodes declared in this scope.
void
UTL_Scope::add_to_scope (AST_Decl *e,
AST_Decl *ex)
{
if (e == 0)
{
return;
}
AST_Decl **tmp = this->pd_decls;
long i = this->pd_decls_used;
Identifier *decl_name = e->local_name ();
char *decl_string = decl_name->get_string ();
Identifier *ref_name = 0;
char *ref_string = 0;
// First, make sure there's no clash between e, that was
// just declared, and some other identifier referenced
// in this scope.
for (; i > 0; --i, ++tmp)
{
// A local declaration doesn't use a scoped name.
ref_name = (*tmp)->local_name ();
ref_string = ref_name->get_string ();
// If the names compare exactly, it's a redefini8tion
// 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) == I_TRUE
&& this->redef_clash (new_nt, scope_elem_nt) == I_TRUE)
{
idl_global->err ()->redef_error (decl_string,
ref_string);
return;
}
// If the spellings differ only by case, it's also an error,
// unless one, but not both of the identifiers were escaped.
else if (decl_name->case_compare_quiet (ref_name) == I_TRUE
&& !(decl_name->escaped () ^ ref_name->escaped ()))
{
if (idl_global->case_diff_error ())
{
idl_global->err ()->name_case_error (decl_string,
ref_string);
return;
}
else
{
idl_global->err ()->name_case_warning (decl_string,
ref_string);
}
}
}
AST_Decl *d = ScopeAsDecl (this);
AST_Decl::NodeType nt = d->node_type ();
// The name of any scope except the unnamed scope formed by an operation
// may not be redefined immediately within (and the root scope has no name).
// As well as OBV factory construct.
if (nt != AST_Decl::NT_root
&& nt != AST_Decl::NT_op
&& nt != AST_Decl::NT_factory)
{
Identifier *parent_name = d->local_name ();
if (decl_name->compare (parent_name) == I_TRUE)
{
idl_global->err ()->redef_error (
decl_name->get_string (),
parent_name->get_string ()
);
}
else if (decl_name->case_compare_quiet (parent_name) == I_TRUE)
{
if (idl_global->case_diff_error ())
{
idl_global->err ()->name_case_error (
decl_name->get_string (),
parent_name->get_string ()
);
}
else
{
idl_global->err ()->name_case_warning (
decl_name->get_string (),
parent_name->get_string ()
);
}
}
}
// Now make sure there's space for one more.
if (this->pd_decls_allocated == this->pd_decls_used)
{
long odecls_allocated = this->pd_decls_allocated;
this->pd_decls_allocated += INCREMENT;
ACE_NEW (tmp,
AST_Decl *[pd_decls_allocated]);
for (i = 0; i < odecls_allocated; i++)
{
tmp[i] = this->pd_decls[i];
}
delete [] this->pd_decls;
this->pd_decls = tmp;
}
// Insert new decl.
if (ex == 0)
{
this->pd_decls[this->pd_decls_used++] = e;
}
else
{
for (i = this->pd_decls_used; i > 0; i--)
{
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_used;
}
}
// Add a node to set of nodes representing manifest
// types defined in this scope.
void
UTL_Scope::add_to_local_types (AST_Decl *e)
{
if (e == 0)
{
return;
}
// Make sure there's space for one more.
if (this->pd_locals_allocated == this->pd_locals_used)
{
long olocals_allocated = pd_locals_allocated;
pd_locals_allocated += INCREMENT;
AST_Decl **tmp = 0;
ACE_NEW (tmp,
AST_Decl *[this->pd_locals_allocated]);
for (long i = 0; i < olocals_allocated; i++)
{
tmp[i] = this->pd_local_types[i];
}
delete [] this->pd_local_types;
this->pd_local_types = tmp;
}
// Insert new decl.
this->pd_local_types[this->pd_locals_used++] = e;
}
// Has this node been referenced here before?
idl_bool
UTL_Scope::referenced (AST_Decl *e,
Identifier *id)
{
long i = pd_referenced_used;
AST_Decl **tmp = pd_referenced;
Identifier *member = 0;
Identifier *test = 0;
for (; i > 0; i--, tmp++)
{
// Same node?
if (*tmp == e)
{
return I_TRUE;
}
// Are we definging a forward declared struct, union, or interface,
// or reopening a module?
idl_bool forward_redef = this->redef_clash (e->node_type (),
(*tmp)->node_type ());
if (forward_redef == I_FALSE)
{
member = (*tmp)->local_name ();
test = e->local_name ();
if (member->compare (test) == I_TRUE)
{
return I_FALSE;
}
}
}
// pd_referenced is a list of decls, and so there's no
// way of telling how much of its scoped name was used
// when it was referenced in this scope. pd_name_referenced
// is a list of Identifiers that store the identifier (or
// the first segment of a scoped name) used in the reference,
// so we can catch these name reolution clashes.
if (id)
{
long j = pd_name_referenced_used;
Identifier **name_tmp = pd_name_referenced;
for (; j > 0; j--, name_tmp++)
{
// If we are a module, there is no clash, if we
// are an interface, this is not the right place to
// catch a clash, and if it wasn't defined in this
// scope, then it's a type name for something else
// that was, and it can appear any number of times
// in this scope without a clash.
if (id->compare (*name_tmp) == I_TRUE
&& e->node_type () != AST_Decl::NT_module
&& e->defined_in () == this)
{
idl_global->err ()->redef_error (id->get_string (),
(*name_tmp)->get_string ());
return I_TRUE;
}
// No clash if one or the other of the identifiers was escaped.
else if (id->case_compare_quiet (*name_tmp) == I_TRUE
&& !(id->escaped () ^ (*name_tmp)->escaped ()))
{
if (idl_global->case_diff_error ())
{
idl_global->err ()->name_case_error (
id->get_string (),
(*name_tmp)->get_string ()
);
}
else
{
idl_global->err ()->name_case_warning (
id->get_string (),
(*name_tmp)->get_string ()
);
}
return I_TRUE;
}
}
}
// Not found
return I_FALSE;
}
idl_bool
UTL_Scope::has_prefix (void)
{
return this->has_prefix_;
}
void
UTL_Scope::has_prefix (idl_bool val)
{
this->has_prefix_ = val;
}
// Redefinition of inherited virtual operations.
// AST Dumping.
void
UTL_Scope::dump (ACE_OSTREAM_TYPE &o)
{
AST_Decl *d = 0;
if (idl_global->indent () == 0)
{
UTL_Indenter *idnt = 0;
ACE_NEW (idnt,
UTL_Indenter);
idl_global->set_indent (idnt);
}
idl_global->indent ()->increase ();
if (pd_locals_used > 0)
{
o << ("\n/* Locally defined types: */\n");
for (UTL_ScopeActiveIterator i (this, UTL_Scope::IK_localtypes);
!i.is_done ();
i.next ())
{
d = i.item ();
if (!d->imported ())
{
idl_global->indent ()->skip_to (o);
d->dump (o);
o << "\n";
}
}
}
if (pd_decls_used > 0)
{
o << ACE_TEXT ("\n/* Declarations: */\n");
for (UTL_ScopeActiveIterator j (this, UTL_Scope::IK_decls);
!j.is_done ();
j.next ())
{
d = j.item ();
if (!d->imported ())
{
idl_global->indent ()->skip_to (o);
d->dump (o);
o << ";\n";
}
}
}
idl_global->indent ()->decrease ();
}
int
UTL_Scope::ast_accept (ast_visitor *visitor)
{
return visitor->visit_scope (this);
}
// How many entries are defined?
unsigned long
UTL_Scope::nmembers (void)
{
return this->pd_decls_used;
}
void
UTL_Scope::destroy (void)
{
for (UTL_ScopeActiveIterator iter (this, IK_both);
!iter.is_done ();
iter.next ())
{
AST_Decl *i = iter.item ();
i->destroy ();
delete i;
i = 0;
}
delete [] this->pd_decls;
this->pd_decls = 0;
delete [] this->pd_local_types;
this->pd_local_types = 0;
delete [] this->pd_referenced;
this->pd_referenced = 0;
delete [] this->pd_name_referenced;
this->pd_name_referenced = 0;
}
// Narrowing.
IMPL_NARROW_METHODS0(UTL_Scope)
IMPL_NARROW_FROM_SCOPE(UTL_Scope)
// UTL_SCOPE_ACTIVE_ITERATOR
// Constructor.
UTL_ScopeActiveIterator::UTL_ScopeActiveIterator (
UTL_Scope *s,
UTL_Scope::ScopeIterationKind i
)
: iter_source (s),
ik (i),
stage (i == UTL_Scope::IK_both ? UTL_Scope::IK_localtypes : i),
il (0)
{
}
// Public operations.
// Advance to next item.
void
UTL_ScopeActiveIterator::next (void)
{
this->il++;
}
// Get current item.
AST_Decl *
UTL_ScopeActiveIterator::item (void)
{
if (this->is_done ())
{
return 0;
}
if (stage == UTL_Scope::IK_decls)
{
return this->iter_source->pd_decls[il];
}
if (stage == UTL_Scope::IK_localtypes)
{
return this->iter_source->pd_local_types[il];
}
return 0;
}
// Is this iteration done?
idl_bool
UTL_ScopeActiveIterator::is_done (void)
{
long limit =
(stage == UTL_Scope::IK_decls)
? iter_source->pd_decls_used
: iter_source->pd_locals_used;
for (;;)
{
// Last element?
if (this->il < limit)
{
return I_FALSE;
}
// Only want decls?
if (this->stage == UTL_Scope::IK_decls)
{
return I_TRUE;
}
// Already done local types?
if (this->ik == UTL_Scope::IK_localtypes)
{
return I_TRUE;
}
// Switch to next stage.
this->stage = UTL_Scope::IK_decls;
this->il = 0;
limit = this->iter_source->pd_decls_used;
}
}
// What kind of iterator is this?
UTL_Scope::ScopeIterationKind
UTL_ScopeActiveIterator::iteration_kind (void)
{
return this->ik;
}
// And where are we in the iteration?
UTL_Scope::ScopeIterationKind
UTL_ScopeActiveIterator::iteration_stage (void)
{
return this->stage;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?