📄 ifr_adding_visitor_union.cpp
字号:
return -1;
}
ACE_ENDTRY;
return 0;
}
int
ifr_adding_visitor_union::visit_enum (AST_Enum *node)
{
ACE_DECLARE_NEW_CORBA_ENV;
ACE_TRY
{
// Is this enum already in the respository?
CORBA::Contained_var prev_def =
be_global->repository ()->lookup_id (node->repoID ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// If not, create a new entry.
if (CORBA::is_nil (prev_def.in ()))
{
CORBA::ULong member_count = ACE_static_cast (CORBA::ULong,
node->member_count ());
CORBA::EnumMemberSeq members (member_count);
members.length (member_count);
UTL_ScopedName *member_name = 0;
// Get a list of the member names.
for (CORBA::ULong i = 0; i < member_count; ++i)
{
member_name = node->value_to_name (i);
members[i] =
CORBA::string_dup (member_name->last_component ()->get_string ());
}
this->ir_current_ =
be_global->repository ()->create_enum (
node->repoID (),
node->local_name ()->get_string (),
node->version (),
members
ACE_ENV_ARG_PARAMETER
);
ACE_TRY_CHECK;
CORBA::Contained_ptr tmp =
CORBA::Contained::_narrow (this->ir_current_.in ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
// Since the enclosing UnionDef hasn't been created
// yet, we don't have a scope, so this nested EnumDef
// (which was created at global scope) goes on the
// queue to be moved later.
this->move_queue_.enqueue_tail (tmp);
node->ifr_added (1);
}
else
{
// If the line below is true, we are clobbering a previous
// entry (from another IDL file) of another type. In that
// case we do what other ORB vendors do, and destroy the
// original entry, create the new one, and let the user beware.
if (node->ifr_added () == 0)
{
prev_def->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
// This call will take the other branch.
return this->visit_enum (node);
}
this->ir_current_ =
CORBA::IDLType::_narrow (prev_def.in ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (
ACE_ANY_EXCEPTION,
ACE_TEXT ("ifr_adding_visitor_union::visit_enum")
);
return -1;
}
ACE_ENDTRY;
return 0;
}
int
ifr_adding_visitor_union::visit_union (AST_Union *node)
{
ACE_DECLARE_NEW_CORBA_ENV;
ACE_TRY
{
CORBA::Contained_var prev_def =
be_global->repository ()->lookup_id (node->repoID ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
if (CORBA::is_nil (prev_def.in ()))
{
// Get the discrimintor node.
AST_ConcreteType *disc_type = node->disc_type ();
// Since the IDL compiler stores enum label values as ulongs,
// we need to get the typecode to insert the label value into
// an Any.
if (disc_type->node_type () == AST_Decl::NT_enum)
{
CORBA::Contained_var disc_def =
be_global->repository ()->lookup_id (disc_type->repoID ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
if (CORBA::is_nil (disc_def.in ()))
{
ACE_ERROR_RETURN ((
LM_ERROR,
ACE_TEXT ("(%N:%l) ifr_adding_visitor_union::")
ACE_TEXT ("visit_union -")
ACE_TEXT (" discriminator not found in repository\n")
),
-1
);
}
CORBA::IDLType_var idl_def =
CORBA::IDLType::_narrow (disc_def.in ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
this->disc_tc_ = idl_def->type (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
}
if (this->visit_scope (node) == -1)
{
ACE_ERROR_RETURN ((
LM_ERROR,
ACE_TEXT ("(%N:%l) ifr_adding_visitor_union::visit_union -")
ACE_TEXT (" visit_scope failed\n")
),
-1
);
}
// This will put an IR object for the discriminator in ir_current_.
if (disc_type->ast_accept (this) == -1)
{
ACE_ERROR_RETURN ((
LM_ERROR,
ACE_TEXT ("(%N:%l) ifr_adding_visitor_union::visit_union -")
ACE_TEXT (" failed to accept visitor\n")
),
-1
);
}
if (this->is_nested_)
{
this->ir_current_ =
be_global->holding_scope ()->create_union (
node->repoID (),
node->local_name ()->get_string (),
node->version (),
this->ir_current_.in (),
this->members_
ACE_ENV_ARG_PARAMETER
);
}
else
{
CORBA::Container_ptr current_scope =
CORBA::Container::_nil ();
if (be_global->ifr_scopes ().top (current_scope) != 0)
{
ACE_ERROR_RETURN ((
LM_ERROR,
ACE_TEXT ("(%N:%l) ifr_adding_visitor_union::")
ACE_TEXT ("visit_union -")
ACE_TEXT (" scope stack is empty\n")
),
-1
);
}
this->ir_current_ =
current_scope->create_union (
node->repoID (),
node->local_name ()->get_string (),
node->version (),
this->ir_current_.in (),
this->members_
ACE_ENV_ARG_PARAMETER
);
}
ACE_TRY_CHECK;
size_t size = this->move_queue_.size ();
if (size > 0)
{
CORBA::Contained_var traveller;
CORBA::Container_var new_container =
CORBA::Container::_narrow (this->ir_current_.in ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
for (size_t i = 0; i < size; ++i)
{
this->move_queue_.dequeue_head (traveller);
CORBA::String_var name = traveller->name (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
CORBA::String_var version =
traveller->version (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
traveller->move (new_container.in (),
name.in (),
version.in ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
}
node->ifr_added (1);
} // if (CORBA::is_nil (...))
else
{
// If the line below is true, we are clobbering a previous
// entry (from another IDL file) of another type. In that
// case we do what other ORB vendors do, and destroy the
// original entry, create the new one, and let the user beware.
if (node->ifr_added () == 0)
{
prev_def->destroy (ACE_ENV_SINGLE_ARG_PARAMETER);
ACE_TRY_CHECK;
// This call will take the other branch.
return this->visit_union (node);
}
this->ir_current_ =
CORBA::IDLType::_narrow (prev_def.in ()
ACE_ENV_ARG_PARAMETER);
ACE_TRY_CHECK;
}
}
ACE_CATCHANY
{
ACE_PRINT_EXCEPTION (
ACE_ANY_EXCEPTION,
ACE_TEXT ("ifr_adding_visitor_union::visit_union")
);
return -1;
}
ACE_ENDTRY;
return 0;
}
CORBA::IDLType_ptr
ifr_adding_visitor_union::ir_current (void) const
{
return this->ir_current_.in ();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -