📄 be_interface.cpp
字号:
TAO_OutStream *os = factory->make_outstream ();
if (os == 0)
{
ACE_ERROR_RETURN ((LM_ERROR,
"be_visitor_interface_ss"
"::"
"visit_interface-"
"make_outstream failed\n"),
-1);
}
// Store the outstream with the codegen singleton.
tao_cg->gperf_input_stream (os);
// Open the temp file.
if (os->open (temp_file,
TAO_OutStream::TAO_GPERF_INPUT) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"be_visitor_interface_ss"
"::"
"visit_interface-"
"gperf_input.tmp file open failed\n"),
-1);
}
// Add the gperf input header.
this->gen_gperf_input_header (os);
// Make sure the queues are empty.
this->insert_queue.reset ();
this->del_queue.reset ();
// Insert ourselves in the queue.
if (insert_queue.enqueue_tail (this) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_interface::gen_operation_table - "
"error generating entries\n"),
-1);
}
// Traverse the graph.
TAO_IDL_Gen_OpTable_Worker worker (skeleton_class_name);
if (this->traverse_inheritance_graph (worker, os) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_interface::gen_operation_table - "
"inheritance graph traversal failed\n"),
-1);
}
*os << "_is_a,&"
<< skeleton_class_name
<< "::_is_a_skel, 0, 0" << be_nl;
this->skel_count_++;
*os << "_non_existent,&"
<< skeleton_class_name
<< "::_non_existent_skel, 0, 0" << be_nl;
this->skel_count_++;
*os << "_component,&"
<< skeleton_class_name
<< "::_component_skel, 0, 0" << be_nl;
this->skel_count_++;
*os << "_interface,&"
<< skeleton_class_name
<< "::_interface_skel, 0, 0" << be_nl;
this->skel_count_++;
// Input to the gperf is ready. Run gperf and get things
// done. This method also unlinks the temp file that we used
// for the gperf.
this->gen_gperf_things (flat_name);
}
break;
default:
ACE_ERROR_RETURN ((LM_ERROR,
"be_interface"
"::"
"gen_operation_table"
"unknown op_lookup_strategy\n"),
-1);
}
return 0;
}
// Output the header (type declaration and %%) to the gperf's input
// file.
void
be_interface::gen_gperf_input_header (TAO_OutStream *os)
{
*os << "class TAO_operation_db_entry {\n"
<< "public:\n"
<< "\tchar *opname_;" << "\n"
<< "\tTAO_Skeleton skel_ptr_;" << "\n"
<< "};" << "\n"
<< "%%"
<< "\n";
}
// we separate the generation of operation table entries from the
// "gen_operation_table" method. This enables us to invoke generation of
// entries for interfaces from which we inherit without any additional
// code. The parameter "derived" is the one for which the entire operation
// table is being built.
int
be_interface::gen_optable_entries (be_interface *derived_interface,
const char *full_skeleton_name,
TAO_OutStream *os)
{
int lookup_strategy =
be_global->lookup_strategy ();
if (lookup_strategy == BE_GlobalData::TAO_DYNAMIC_HASH)
{
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_op)
{
// We are an operation node.
*os << "{\"" << d->original_local_name () << "\", &"
<< full_skeleton_name << "::"
<< d->local_name () << "_skel,";
if (be_global->gen_thru_poa_collocation ())
{
*os << " &"
<< derived_interface->full_thru_poa_proxy_impl_name ()
<< "::" << d->local_name ();
}
else
{
*os << " 0";
}
*os << ",";
if (be_global->gen_direct_collocation ())
{
*os << " &"
<< derived_interface->full_direct_proxy_impl_name ()
<< "::" << d->local_name ();
}
else
{
*os << " 0";
}
*os << "}," << be_nl;
this->skel_count_++;
}
else if (d->node_type () == AST_Decl::NT_attr)
{
AST_Attribute *attr =
AST_Attribute::narrow_from_decl (d);
if (attr == 0)
return -1;
// Generate only the "get" entry if we are
// readonly.
*os << "{\"_get_" << d->original_local_name ()
<< "\", &" << full_skeleton_name
<< "::_get_" << d->local_name () << "_skel,";
if (be_global->gen_thru_poa_collocation ())
{
*os << " &"
<< derived_interface->full_thru_poa_proxy_impl_name ()
<< "::_get_" << d->local_name ();
}
else
{
*os << " 0";
}
*os << ",";
if (be_global->gen_direct_collocation ())
{
*os << " &"
<< derived_interface->full_direct_proxy_impl_name ()
<< "::_get_" << d->local_name ();
}
else
{
*os << " 0";
}
*os << "}," << be_nl;
this->skel_count_++;
if (!attr->readonly ())
{
// The set method
*os << "{\"_set_" << d->original_local_name ()
<< "\", &" << full_skeleton_name
<< "::_set_" << d->local_name () << "_skel,";
if (be_global->gen_thru_poa_collocation ())
{
*os << " &"
<< derived_interface->full_thru_poa_proxy_impl_name ()
<< "::_set_" << d->local_name ();
}
else
{
*os << " 0";
}
*os << ",";
if (be_global->gen_direct_collocation ())
{
*os << " &"
<< derived_interface->full_direct_proxy_impl_name ()
<< "::_set_" << d->local_name ();
}
else
{
*os << " 0";
}
*os << "}," << be_nl;
this->skel_count_++;
}
}
}
}
else if (lookup_strategy == BE_GlobalData::TAO_LINEAR_SEARCH
|| lookup_strategy == BE_GlobalData::TAO_BINARY_SEARCH
|| lookup_strategy == BE_GlobalData::TAO_PERFECT_HASH)
{
// We call GPERF for all these three strategies.
// Init the outstream.
// @@ We probably do no need to do this, the "right" <os>
// argument is passed down!!
os = tao_cg->gperf_input_stream ();
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_op)
{
// Generate operation name.
// We are an operation node. We use the original
// operation name, not the one with _cxx_ in it.
*os << d->original_local_name () << ",&"
<< full_skeleton_name << "::"
<< d->local_name () << "_skel,";
if (be_global->gen_thru_poa_collocation ())
{
*os << " &"
<< derived_interface->full_thru_poa_proxy_impl_name ();
*os << "::" << d->local_name ();
}
else
{
*os << " 0";
}
*os << ",";
if (be_global->gen_direct_collocation ())
{
*os << " &"
<< derived_interface->full_direct_proxy_impl_name ();
*os << "::" << d->local_name ();
}
else
{
*os << " 0";
}
*os << "\n";
this->skel_count_++;
}
else if (d->node_type () == AST_Decl::NT_attr)
{
AST_Attribute *attr =
AST_Attribute::narrow_from_decl (d);
if (attr == 0)
{
return -1;
}
// Generate only the "get" entry if we are readonly.
*os << "_get_" << d->original_local_name () << ",&"
<< full_skeleton_name << "::_get_"
<< d->local_name () << "_skel,";
if (be_global->gen_thru_poa_collocation ())
{
*os << " &"
<< derived_interface->full_thru_poa_proxy_impl_name ()
<< "::_get_" << d->local_name ();
}
else
{
*os << " 0";
}
*os << ",";
if (be_global->gen_direct_collocation ())
{
*os << " &"
<< derived_interface->full_direct_proxy_impl_name ()
<< "::_get_" << d->local_name ();
}
else
{
*os << " 0";
}
*os << "\n";
this->skel_count_++;
if (!attr->readonly ())
{
// The set method
*os << "_set_" << d->original_local_name () << ",&"
<< full_skeleton_name << "::_set_"
<< d->local_name () << "_skel,";
if (be_global->gen_thru_poa_collocation ())
{
*os << " &"
<< derived_interface->full_thru_poa_proxy_impl_name ()
<< "::_set_" << d->local_name ();
}
else
{
*os << " 0";
}
*os << ",";
if (be_global->gen_direct_collocation ())
{
*os << " &"
<< derived_interface->full_direct_proxy_impl_name ()
<< "::_set_" << d->local_name ();
}
else
{
*os << " 0";
}
*os << "\n";
this->skel_count_++;
}
}
}
}
else
{
ACE_ERROR_RETURN ((LM_ERROR,
"be_interface::gen_optable_entries - "
"unknown op_lookup_strategy\n"),
-1);
}
return 0;
}
void
be_interface::gen_collocated_skel_body (be_interface *derived,
be_interface *ancestor,
AST_Decl *d,
const char *prefix,
idl_bool direct,
UTL_ExceptList *list,
TAO_OutStream *os)
{
*os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
<< "// " << __FILE__ << ":" << __LINE__;
// Generate the static method corresponding to this method.
*os << be_nl << be_nl
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -