📄 be_interface.cpp
字号:
"-a -o -t -p -K"
" "
"opname_ -L C++"
" "
"-Z TAO_%s_Perfect_Hash_OpTable"
" "
"-N lookup",
idl_global->gperf_path (),
flat_name);
break;
// Binary search methods from GPERF. Everythis and the -B flag.
case BE_GlobalData::TAO_BINARY_SEARCH:
process_options.command_line ("%s"
" "
"-B"
" "
"-m -M -J -c -C"
" "
"-D -E -T -f 0"
" "
"-F 0,0,0"
" "
"-a -o -t -p -K"
" "
"opname_ -L C++"
" "
"-Z TAO_%s_Binary_Search_OpTable"
" "
"-N lookup",
idl_global->gperf_path (),
flat_name);
break;
// Linear search methods from GPERF. Everything and the -z flag.
case BE_GlobalData::TAO_LINEAR_SEARCH:
process_options.command_line ("%s"
" "
"-b"
" "
"-m -M -J -c -C"
" "
"-D -E -T -f 0"
" "
"-F 0,0,0"
" "
"-a -o -t -p -K"
" "
"opname_ -L C++"
" "
"-Z TAO_%s_Linear_Search_OpTable"
" "
"-N lookup",
idl_global->gperf_path (),
flat_name);
break;
default:
ACE_ERROR ((LM_ERROR,
"tao_idl:ERROR:%N:%l:Unknown Operation Lookup Strategy\n"));
result = -1;
}
if (result != -1)
{
// Spawn a process for gperf.
if (process.spawn (process_options) == -1)
{
ACE_ERROR ((LM_ERROR,
"Error:%p:Couldnt spawn a process for gperf program\n",
"process.spawn"));
result = -1;
}
// Wait for gperf to complete.
else if (process.wait () == -1)
{
ACE_ERROR ((LM_ERROR,
"Error:%p:Error on waiting for completion of gperf program.\n",
"process.wait"));
result = -1;
}
// Adjust the file offset to the EOF for the server skeleton
// file.
ACE_OS::fseek (this->strategy_->get_out_stream()->file (),
0,
SEEK_END);
}
ACE_OS::close (output);
ACE_OS::close (input);
return result;
}
// Create an instance of this perfect hash table.
void
be_interface::gen_perfect_hash_instance (const char *flat_name)
{
// Outstream.
TAO_OutStream *os = this->strategy_->get_out_stream ();
*os << be_nl
<< "static TAO_" << flat_name << "_Perfect_Hash_OpTable"
<< " "
<< "tao_" << flat_name << "_optable;";
}
// Create an instance of the binary search optable.
void
be_interface::gen_binary_search_instance (const char *flat_name)
{
// Outstream.
TAO_OutStream *os = this->strategy_->get_out_stream ();
*os << be_nl
<< "static TAO_" << flat_name << "_Binary_Search_OpTable"
<< " "
<< "tao_" << flat_name << "_optable;";
}
// Create an instance of this perfect hash table.
void
be_interface::gen_linear_search_instance (const char *flat_name)
{
// Outstream.
TAO_OutStream *os = this->strategy_->get_out_stream ();
*os << be_nl
<< "static TAO_" << flat_name << "_Linear_Search_OpTable"
<< " "
<< "tao_" << flat_name << "_optable;";
}
int
be_interface::is_a_helper (be_interface * /*derived*/,
be_interface *bi,
TAO_OutStream *os)
{
// Emit the comparison code.
*os << "!ACE_OS::strcmp (" << be_idt << be_idt_nl
<< "(char *)value," << be_nl
<< "\"" << bi->repoID () << "\"" << be_uidt_nl
<< ") ||" << be_uidt_nl;
return 0;
}
int
be_interface::queryinterface_helper (be_interface *derived,
be_interface *ancestor,
TAO_OutStream *os)
{
// Emit the comparison code.
*os << "(type == ACE_reinterpret_cast ("
<< be_idt << be_idt <<be_idt << be_idt << be_idt << be_idt_nl
<< "ptrdiff_t," << be_nl;
be_decl *scope =
be_scope::narrow_from_scope (ancestor->defined_in ())->decl ();
be_decl *derived_scope =
be_scope::narrow_from_scope (derived->defined_in ())->decl ();
// If the ancestor is in the root scope, we can use the local name.
if (scope->node_type () == AST_Decl::NT_root)
{
*os << "&" << ancestor->local_name () << "::_tao_class_id)"
<< be_uidt_nl;
}
// Or, if it's defined in a scope different than the child's, the
// ACE_NESTED_CLASS macro won't work - we use the scoped name.
else if (scope != derived_scope)
{
*os << "&::" << ancestor->name () << "::_tao_class_id)"
<< be_uidt_nl;
}
// The ACE_NESTED_CLASS macro is necessary in this case.
else
{
*os << "&ACE_NESTED_CLASS (::" << scope->name () << ", "
<< ancestor->local_name () << ")" << "::_tao_class_id)"
<< be_uidt_nl;
}
*os << ")" << be_uidt << be_uidt << be_uidt << be_uidt_nl
<< "{" << be_idt_nl;
if (derived == ancestor)
{
*os << "retv = ACE_reinterpret_cast (void*, this);" << be_uidt_nl;
}
else
{
*os << "retv =" << be_idt_nl
<< "ACE_reinterpret_cast (" << be_idt << be_idt_nl
<< "void *," << be_nl
<< "ACE_static_cast (" << be_idt << be_idt_nl
<< ancestor->full_name () << "_ptr," << be_nl
<< "this" << be_uidt_nl
<< ")" << be_uidt << be_uidt_nl
<< ");" << be_uidt << be_uidt << be_uidt_nl;
}
*os << "}" << be_uidt_nl
<< "else if ";
return 0;
}
int
be_interface::downcast_helper (be_interface * /* derived */,
be_interface *base,
TAO_OutStream *os)
{
// Abstract interfaces have no code generated on the skeleton side.
if (base->is_abstract ())
{
return 0;
}
*os << "if (ACE_OS::strcmp (logical_type_id," << be_nl
<< " \""
<< base->repoID () << "\") == 0)" << be_idt_nl
<< "{" << be_idt_nl
<< "return ACE_static_cast ("
<< base->full_skel_name () << "_ptr, this);" << be_uidt_nl
<< "}" << be_uidt_nl << be_nl;
return 0;
}
int
be_interface::gen_skel_helper (be_interface *derived,
be_interface *ancestor,
TAO_OutStream *os)
{
// If derived and ancestor are same, skip it.
if (derived == ancestor)
{
return 0;
}
// If an operation or an attribute is abstract (declared in an
// abstract interface), we will either generate the full
// definition (if there are no concrete interfaces between the
// abstract ancestor and us) or, if there is a concrete ancestor
// in between, we will catch its definition elsewhere in this
// traversal.
if (ancestor->is_abstract ())
{
return 0;
}
// Else generate code that does the cast to the appropriate type.
if (ancestor->nmembers () > 0)
{
// If there are elements in ancestor scope i.e., any operations and
// attributes defined by "ancestor", become methods on the derived class
// which call the corresponding method of the base class by doing the
// proper casting.
for (UTL_ScopeActiveIterator si (ancestor, 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)
{
*os << be_nl << be_nl << "// TAO_IDL - Generated from" << be_nl
<< "// " << __FILE__ << ":" << __LINE__;
*os << be_nl << be_nl;
if (os->stream_type () == TAO_OutStream::TAO_SVR_HDR)
{
// Generate the static method corresponding to this method.
*os << "static void" << be_nl
<< d->local_name ()
<< "_skel (" << be_idt << be_idt_nl
<< "TAO_ServerRequest &req, " << be_nl
<< "void *obj," << be_nl
<< "void *context" << be_nl
<< "ACE_ENV_ARG_DECL_WITH_DEFAULTS" << be_uidt_nl
<< ");" << be_uidt;
}
else
{ // Generate code in the inline file.
// Generate the static method corresponding to this method.
*os << "ACE_INLINE" << be_nl
<< "void" << be_nl
<< derived->full_skel_name () << "::"
<< d->local_name ()
<< "_skel (" << be_idt << be_idt_nl
<< "TAO_ServerRequest &req," << be_nl
<< "void *obj," << be_nl
<< "void *context" << be_nl
<< "ACE_ENV_ARG_DECL" << be_uidt_nl
<< ")" << be_uidt_nl
<< "{" << be_idt_nl;
*os << ancestor->full_skel_name ()
<< "_ptr impl = ("
<< derived->full_skel_name ()
<< "_ptr) obj;" << be_nl;
*os << ancestor->full_skel_name ()
<< "::" << d->local_name ()
<< "_skel (" << be_idt << be_idt_nl
<< "req," << be_nl
<< "(" << ancestor->full_skel_name ()
<< "_ptr) impl," << be_nl
<< "context" << be_nl
<< "ACE_ENV_ARG_PARAMETER" << be_uidt_nl
<< ");" << be_uidt << be_uidt_nl
<< "}";
}
}
else if (d->node_type () == AST_Decl::NT_attr)
{
AST_Attribute *attr = AST_Attribute::narrow_from_decl (d);
if (attr == 0)
{
return -1;
}
*os << be_nl << be_nl;
if (os->stream_type () == TAO_OutStream::TAO_SVR_HDR)
{
// Generate the static method corresponding to this method.
*os << "static void" << be_nl
<< "_get_" << d->local_name ()
<< "_skel (" << be_idt << be_idt_nl
<< "TAO_ServerRequest &req," << be_nl
<< "void *obj," << be_nl
<< "void *context" << be_nl
<< "ACE_ENV_ARG_DECL_WITH_DEFAULTS" << be_uidt_nl
<< ");" << be_uidt;
}
else
{ // Generate code in the inline file.
// Generate the static method corresponding to this method.
*os << "ACE_INLINE" << be_nl
<< "void" << be_nl
<< derived->full_skel_name () << "::_get_"
<< d->local_name ()
<< "_skel (" << be_idt << be_idt_nl
<< "TAO_ServerRequest &req," << be_nl
<< "void *obj," << be_nl
<< "void *context" << be_nl
<< "ACE_ENV_ARG_DECL" << be_uidt_nl
<< ")" << be_uidt_nl
<< "{" << be_idt_nl
<< ancestor->full_skel_name ()
<< "_ptr impl = ("
<< derived->full_skel_name ()
<< "_ptr) obj;" << be_nl;
*os << ancestor->full_skel_name ()
<< "::_get_" << d->local_name ()
<< "_skel (" << be_idt << be_idt_nl
<< "req," << be_nl
<< "(" << ancestor->full_skel_name ()
<< "_ptr) impl," << be_nl
<< "context" << be_nl
<< "ACE_ENV_ARG_PARAMETER" << be_uidt_nl
<< ");" << be_uidt << be_uidt_nl
<< "}";
}
if (!attr->readonly ())
{
*os << be_nl << be_nl;
if (os->stream_type () == TAO_OutStream::TAO_SVR_HDR)
{
// Generate the static method corresponding to
// this method.
*os << "static void" << be_nl
<< "_set_" << d->local_name ()
<< "_skel (" << be_idt << be_idt_nl
<< "TAO_ServerRequest &req," << be_nl
<< "void *obj," << be_nl
<< "void *context" << be_nl
<< "ACE_ENV_ARG_DECL_WITH_DEFAULTS" << be_uidt_nl
<< ");" << be_uidt;
}
else
{ // Generate code in the inline file.
// Generate the static method corresponding to
// this method.
*os << "ACE_INLINE" << be_nl
<< "void" << be_nl
<< derived->full_skel_name ()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -