ast_union.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 1,256 行 · 第 1/3 页
CPP
1,256 行
// Error.
break;
} // End of switch.
} // if label_Kind == label
} // End of for loop going thru all labels.
} // If valid union branch.
} // End of while scope iterator loop.
// We have not aborted the inner loops which means we have found the
// default value.
if (break_loop == 0)
{
this->default_value_.computed_ = 1;
}
} // End of outer while (default_value.computed == -2).
return 0;
}
// Private operations.
// Compute the default index.
int
AST_Union::compute_default_index (void)
{
AST_Decl *d = 0;
AST_UnionBranch *ub = 0;
int i = 0;
// If default case does not exist, it will have a value of -1 according to
// the spec.
this->default_index_ = -1;
// If there are elements in this scope...
if (this->nmembers () > 0)
{
// Instantiate a scope iterator.
for (UTL_ScopeActiveIterator si (this, UTL_Scope::IK_decls);
!si.is_done ();
si.next ())
{
// Get the next AST decl node.
d = si.item ();
// If an enum is declared in our scope, its members are
// added to our scope as well, to detect clashes.
if (d->node_type () == AST_Decl::NT_enum_val)
{
continue;
}
if (!d->imported ())
{
ub = AST_UnionBranch::narrow_from_decl (d);
for (unsigned long j = 0; j < ub->label_list_length (); ++j)
{
// Check if we are printing the default case.
AST_UnionLabel::UnionLabel ulk = ub->label ()->label_kind ();
if (ulk == AST_UnionLabel::UL_default)
{
// Zero based indexing.
this->default_index_ = i;
}
}
// TAO's Typecode class keeps only a member count (not
// a label count) so this increment has been moved
// out of the inner loop.
++i;
}
}
}
return 0;
}
// Redefinition of inherited virtual operations
// Add this AST_UnionBranch node (a node representing one branch in a
// union declaration) to this scope
AST_UnionBranch *
AST_Union::fe_add_union_branch (AST_UnionBranch *t)
{
AST_Decl *d = 0;
// If this is a malformed branch, don't do anything with it.
if (t == 0 || t->label() == 0)
{
return 0;
}
// If branch with that label already exists, complain.
if (lookup_branch (t) != 0)
{
idl_global->err ()->error2 (UTL_Error::EIDL_MULTIPLE_BRANCH,
this,
t);
return 0;
}
// If branch with same field name exists, complain.
if ((d = this->lookup_for_add (t, I_FALSE)) != 0)
{
if (!can_be_redefined (d))
{
idl_global->err ()->error3 (UTL_Error::EIDL_REDEF,
t,
this,
d);
return 0;
}
if (this->referenced (d, t->local_name ()))
{
idl_global->err ()->error3 (UTL_Error::EIDL_DEF_USE,
t,
this,
d);
return 0;
}
if (t->has_ancestor (d))
{
idl_global->err ()->redefinition_in_scope (t,
d);
return 0;
}
}
// Add it to scope.
this->add_to_scope (t);
// Add it to set of locally referenced symbols.
this->add_to_referenced (t,
I_FALSE,
t->local_name ());
AST_Type *ft = t->field_type ();
UTL_ScopedName *mru = ft->last_referenced_as ();
if (mru != 0)
{
this->add_to_referenced (ft,
I_FALSE,
mru->first_component ());
}
this->fields_.enqueue_tail (t);
return t;
}
// Add this AST_Union (manifest union type) to this scope.
AST_Union *
AST_Union::fe_add_union (AST_Union *t)
{
AST_Decl *d = 0;
// Already defined and cannot be redefined? Or already used?
if ((d = this->lookup_for_add (t, I_FALSE)) != 0)
{
if (!can_be_redefined (d))
{
idl_global->err ()->error3 (UTL_Error::EIDL_REDEF,
t,
this,
d);
return 0;
}
if (this->referenced (d, t->local_name ()))
{
idl_global->err ()->error3 (UTL_Error::EIDL_DEF_USE,
t,
this,
d);
return 0;
}
if (t->has_ancestor (d))
{
idl_global->err ()->redefinition_in_scope (t,
d);
return 0;
}
}
// Add it to local types.
this->add_to_local_types (t);
// Add it to set of locally referenced symbols.
this->add_to_referenced (t,
I_FALSE,
t->local_name ());
return t;
}
// Add this AST_Structure node (manifest struct type) to this scope.
AST_Structure *
AST_Union::fe_add_structure (AST_Structure *t)
{
AST_Decl *d = 0;
// Already defined and cannot be redefined? Or already used?
if ((d = this->lookup_for_add (t, I_FALSE)) != 0)
{
if (!can_be_redefined (d))
{
idl_global->err ()->error3 (UTL_Error::EIDL_REDEF,
t,
this,
d);
return 0;
}
if (this->referenced (d, t->local_name ()))
{
idl_global->err ()->error3 (UTL_Error::EIDL_DEF_USE,
t,
this,
d);
return 0;
}
if (t->has_ancestor (d))
{
idl_global->err ()->redefinition_in_scope (t,
d);
return 0;
}
}
// Add it to local types.
this->add_to_local_types (t);
// Add it to set of locally referenced symbols.
this->add_to_referenced (t,
I_FALSE,
t->local_name ());
return t;
}
// Add this AST_Enum node (manifest enum type) to this scope.
AST_Enum *
AST_Union::fe_add_enum (AST_Enum *t)
{
AST_Decl *d = 0;
// Already defined and cannot be redefined? Or already used?
if ((d = this->lookup_for_add (t, I_FALSE)) != 0)
{
if (!can_be_redefined (d))
{
idl_global->err ()->error3 (UTL_Error::EIDL_REDEF,
t,
this,
d);
return 0;
}
if (this->referenced (d, t->local_name ()))
{
idl_global->err ()->error3 (UTL_Error::EIDL_DEF_USE,
t,
this,
d);
return 0;
}
if (t->has_ancestor (d))
{
idl_global->err ()->redefinition_in_scope (t,
d);
return 0;
}
}
// Add it to local types.
this->add_to_local_types (t);
// Add it to set of locally referenced symbols.
this->add_to_referenced (t,
I_FALSE,
t->local_name ());
return t;
}
// Add this AST_EnumVal node (enumerator declaration) to this scope.
// This is done to conform to the C++ scoping rules which declare
// enumerators in the enclosing scope (in addition to declaring them
// in the enum itself).
AST_EnumVal *
AST_Union::fe_add_enum_val (AST_EnumVal *t)
{
AST_Decl *d = 0;
// Already defined and cannot be redefined? Or already used?
if ((d = this->lookup_for_add (t, I_FALSE)) != 0)
{
if (!can_be_redefined (d))
{
idl_global->err ()->error3 (UTL_Error::EIDL_REDEF,
t,
this,
d);
return 0;
}
if (this->referenced (d, t->local_name ()))
{
idl_global->err ()->error3 (UTL_Error::EIDL_DEF_USE,
t,
this,
d);
return 0;
}
if (t->has_ancestor (d))
{
idl_global->err ()->redefinition_in_scope (t,
d);
return 0;
}
}
// Add it to scope.
this->add_to_scope (t);
// Add it to set of locally referenced symbols.
this->add_to_referenced (t,
I_FALSE,
t->local_name ());
return t;
}
// Dump this AST_Union node to the ostream o.
void
AST_Union::dump (ACE_OSTREAM_TYPE &o)
{
o << "union ";
this->local_name ()->dump (o);
o << " switch (";
this->pd_disc_type->local_name ()->dump (o);
o << ") {\n";
UTL_Scope::dump (o);
idl_global->indent ()->skip_to (o);
o << "}";
}
// Compute the size type of the node in question.
int
AST_Union::compute_size_type (void)
{
for (UTL_ScopeActiveIterator si (this, UTL_Scope::IK_decls);
!si.is_done ();
si.next ())
{
// Get the next AST decl node.
AST_Decl *d = si.item ();
if (d->node_type () == AST_Decl::NT_enum_val)
{
continue;
}
AST_Field *f = AST_Field::narrow_from_decl (d);
if (f != 0)
{
AST_Type *t = f->field_type ();
// Our sizetype depends on the sizetype of our members. Although
// previous value of sizetype may get overwritten, we are
// guaranteed by the "size_type" call that once the value reached
// be_decl::VARIABLE, nothing else can overwrite it.
this->size_type (t->size_type ());
}
else
{
ACE_DEBUG ((LM_DEBUG,
"WARNING (%N:%l) be_union::compute_size_type - "
"narrow_from_decl returned 0\n"));
}
}
return 0;
}
int
AST_Union::ast_accept (ast_visitor *visitor)
{
return visitor->visit_union (this);
}
// Data accessors.
AST_ConcreteType *
AST_Union::disc_type (void)
{
return this->pd_disc_type;
}
AST_Expression::ExprType
AST_Union::udisc_type (void)
{
return this->pd_udisc_type;
}
// Narrowing.
IMPL_NARROW_METHODS1(AST_Union, AST_Structure)
IMPL_NARROW_FROM_DECL(AST_Union)
IMPL_NARROW_FROM_SCOPE(AST_Union)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?