cdr_op_cs.cpp
来自「这是广泛使用的通信开源项目,对于大容量,高并发的通讯要求完全能够胜任,他广泛可用」· C++ 代码 · 共 927 行 · 第 1/2 页
CPP
927 行
"(%N:%l) be_visitor_sequence_cdr_op_cs::"
"visit_predefined_type - "
"bad primitive type for optimized code gen\n"),
-1);
}
// Handle special case to avoid compiler errors.
switch (node->pt ())
{
case AST_PredefinedType::PT_char:
switch (this->ctx_->sub_state ())
{
case TAO_CodeGen::TAO_CDR_INPUT:
*os << " ((char *)_tao_sequence.get_buffer (), ";
break;
case TAO_CodeGen::TAO_CDR_OUTPUT:
*os << " ((const char *)_tao_sequence.get_buffer (), ";
break;
default:
// error
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_sequence_cdr_op_cs"
"::visit_predefined_type - "
"bad codegen substate\n"),
-1);
}
break;
default:
*os << " (_tao_sequence.get_buffer (), ";
break;
}
*os << "_tao_sequence.length ());" << be_uidt_nl;
if (node->pt () == AST_PredefinedType::PT_octet && sequence->unbounded ())
{
*os << "\n#endif /* TAO_NO_COPY_OCTET_SEQUENCES == 0 */" << be_nl;
}
return 0;
}
int
be_visitor_sequence_cdr_op_cs::visit_string (be_string *node)
{
return this->visit_node (node);
}
int
be_visitor_sequence_cdr_op_cs::visit_structure (be_structure *node)
{
return this->visit_node (node);
}
int
be_visitor_sequence_cdr_op_cs::visit_union (be_union *node)
{
return this->visit_node (node);
}
int
be_visitor_sequence_cdr_op_cs::visit_typedef (be_typedef *node)
{
this->ctx_->alias (node);
be_type *bt = node->primitive_base_type ();
if (!bt || (bt->accept (this) == -1))
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_sequence_cdr_op_cs::"
"visit_typedef - "
"Bad primitive type\n"),
-1);
}
this->ctx_->alias (0);
return 0;
}
int
be_visitor_sequence_cdr_op_cs::visit_node (be_type *bt)
{
TAO_OutStream *os = this->ctx_->stream ();
be_sequence *node = this->ctx_->be_node_as_sequence ();
if (!node)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_sequence_cdr_op_cs::"
"visit_node - "
"bad sequence node\n"),
-1);
}
be_visitor_context ctx (*this->ctx_);
be_visitor_sequence_base visitor (&ctx);
// Initialize a boolean variable.
*os << "CORBA::Boolean _tao_marshal_flag = 1;" << be_nl << be_nl;
// We get here if the "type" of individual elements of the sequence is not a
// primitive type. In this case, we are left with no other alternative but
// to encode/decode element by element.
AST_Expression *expr = node->max_size ();
if (expr == 0 || (expr != 0 && expr->ev () == 0))
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_sequence_cdr_op_cs::"
"visit_node - "
"bad sequence dimension\n"),
-1);
}
if (expr->ev ()->et == AST_Expression::EV_ulong)
{
*os << "for (CORBA::ULong i = 0; i < _tao_seq_len"
<< " && _tao_marshal_flag; "
<< "++i)" << be_idt_nl
<< "{" << be_idt_nl;
}
else
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_sequence_cdr_op_cs::"
"visit_node - "
"bad sequence dimension value\n"),
-1);
}
AST_Decl::NodeType nt = bt->node_type ();
be_typedef *td = 0;
if (nt == AST_Decl::NT_typedef)
{
td = be_typedef::narrow_from_decl (bt);
nt = td->base_node_type ();
}
switch (this->ctx_->sub_state ())
{
case TAO_CodeGen::TAO_CDR_INPUT:
switch (nt)
{
case AST_Decl::NT_array:
if (bt->accept (&visitor) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_sequence_cdr_op_cs::"
"visit_node - "
"base type visit failed\n"),
-1);
}
*os << "_forany tmp (";
if (bt->accept (&visitor) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_sequence_cdr_op_cs::"
"visit_node - "
"base type visit failed\n"),
-1);
}
*os << "_alloc ());" << be_nl;
*os << "_tao_marshal_flag = (strm >> tmp);" << be_nl;
if (bt->accept (&visitor) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_sequence_cdr_op_cs::"
"visit_node - "
"base type visit failed\n"),
-1);
}
*os << "_copy (_tao_sequence[i], tmp.in ());" << be_nl;
if (bt->accept (&visitor) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_sequence_cdr_op_cs::"
"visit_node - "
"base type visit failed\n"),
-1);
}
*os << "_free (tmp.inout ());" << be_uidt_nl;
break;
case AST_Decl::NT_string:
case AST_Decl::NT_wstring:
{
be_string *str =
be_string::narrow_from_decl (
td == 0 ? bt : td->primitive_base_type ()
);
if (!str)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_sequence_cdr_op_cs::"
"visit_node - "
"bad string node\n"),
-1);
}
if (str->max_size ()->ev ()->u.ulval == 0)
{
// Unbounded.
*os << "_tao_marshal_flag = (strm >> _tao_sequence[i].out ());"
<< be_uidt_nl;
}
else
{
if (str->width () == (long) sizeof (char))
{
*os << "_tao_marshal_flag = (strm >> "
<< "CORBA::Any::to_string (_tao_sequence[i].out (), ";
}
else
{
*os << "_tao_marshal_flag = (strm >> "
<< "CORBA::Any::to_wstring (_tao_sequence[i].out (), ";
}
*os << str->max_size ()->ev ()->u.ulval << "));"
<< be_uidt_nl;
}
}
break;
case AST_Decl::NT_interface:
case AST_Decl::NT_interface_fwd:
case AST_Decl::NT_valuetype:
case AST_Decl::NT_valuetype_fwd:
*os << "_tao_marshal_flag = (strm >> _tao_sequence[i].out ());";
break;
case AST_Decl::NT_pre_defined:
{
// We need to separately handle this case of pseudo objects
// because they have a _var type.
be_predefined_type *pt =
be_predefined_type::narrow_from_decl (
td == 0 ? bt : td->primitive_base_type ()
);
if (!pt)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_sequence_cdr_op_cs::"
"visit_node - "
"bad predefined type node\n"),
-1);
}
switch (pt->pt ())
{
case AST_PredefinedType::PT_pseudo:
case AST_PredefinedType::PT_object:
case AST_PredefinedType::PT_value:
*os << "_tao_marshal_flag = (strm >> _tao_sequence[i].out ());";
break;
case AST_PredefinedType::PT_char:
*os << "_tao_marshal_flag =" << be_idt_nl
<< "(strm >> CORBA::Any::to_char (_tao_sequence[i]));"
<< be_uidt;
break;
case AST_PredefinedType::PT_wchar:
*os << "_tao_marshal_flag =" << be_idt_nl
<< "(strm >> CORBA::Any::to_wchar (_tao_sequence[i]));"
<< be_uidt;
break;
case AST_PredefinedType::PT_boolean:
*os << "_tao_marshal_flag =" << be_idt_nl
<< "(strm >> CORBA::Any::to_boolean (_tao_sequence[i]));"
<< be_uidt;
break;
case AST_PredefinedType::PT_octet:
*os << "_tao_marshal_flag =" << be_idt_nl
<< "(strm >> CORBA::Any::to_octet (_tao_sequence[i]));"
<< be_uidt;
break;
default:
*os << "_tao_marshal_flag = (strm >> _tao_sequence[i]);";
break;
}
}
break;
default:
*os << "_tao_marshal_flag = (strm >> _tao_sequence[i]);";
break;
}
*os << be_uidt_nl
<< "}";
break;
case TAO_CodeGen::TAO_CDR_OUTPUT:
switch (nt)
{
case AST_Decl::NT_array:
if (bt->accept (&visitor) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_sequence_cdr_op_cs::"
"visit_node - "
"base type visit failed\n"),
-1);
}
*os << "_var tmp_var (" << be_idt << be_idt_nl;
if (bt->accept (&visitor) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_sequence_cdr_op_cs::"
"visit_node - "
"base type visit failed\n"),
-1);
}
*os << "_dup (\n";
// Even though the following arg is declared const in the
// function signature, MSVC++ 5.0 needs the const cast,
// and many other compilers just won't do it.
*os << "#if defined (_MSC_VER) && (_MSC_VER <= 1100)";
os->indent ();
*os << be_idt << be_idt_nl;
*os << "ACE_const_cast (const " << this->ctx_->node ()->name ()
<< ", _tao_sequence)[i]\n";
*os << "#else";
os->indent ();
*os << be_nl;
*os << "_tao_sequence[i]\n";
*os << "#endif /* defined (_MSC_VER) && (_MSC_VER <= 1100) */";
os->indent ();
*os << be_uidt_nl;
*os << ")" << be_uidt << be_uidt_nl;
*os << ");" << be_uidt_nl;
if (bt->accept (&visitor) == -1)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_sequence_cdr_op_cs::"
"visit_node - "
"base type visit failed\n"),
-1);
}
*os << "_forany tmp (tmp_var.inout ());" << be_nl;
*os << "_tao_marshal_flag = (strm << tmp);";
break;
case AST_Decl::NT_interface:
case AST_Decl::NT_interface_fwd:
*os << "_tao_marshal_flag =" << be_idt_nl;
if (bt->is_defined ())
{
*os << "_tao_sequence[i].in ()->marshal (strm);" << be_uidt;
}
else
{
*os << "TAO::Objref_Traits<" << bt->name () << ">::tao_marshal ("
<< be_idt << be_idt_nl
<< "_tao_sequence[i].in (), strm" << be_uidt_nl
<< ");" << be_uidt << be_uidt;
}
break;
case AST_Decl::NT_string:
case AST_Decl::NT_wstring:
case AST_Decl::NT_valuetype:
case AST_Decl::NT_valuetype_fwd:
*os << "_tao_marshal_flag = (strm << _tao_sequence[i].in ());";
break;
case AST_Decl::NT_pre_defined:
{
be_predefined_type *pt =
be_predefined_type::narrow_from_decl (
td == 0 ? bt : td->primitive_base_type ()
);
if (!pt)
{
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_sequence_cdr_op_cs::"
"visit_node - "
"bad predefined type node\n"),
-1);
}
switch (pt->pt ())
{
case AST_PredefinedType::PT_pseudo:
case AST_PredefinedType::PT_object:
case AST_PredefinedType::PT_value:
*os << "_tao_marshal_flag = (strm << _tao_sequence[i].in ());";
break;
case AST_PredefinedType::PT_char:
*os << "_tao_marshal_flag =" << be_idt_nl
<< "(strm << CORBA::Any::from_char (_tao_sequence[i]));"
<< be_uidt;
break;
case AST_PredefinedType::PT_wchar:
*os << "_tao_marshal_flag =" << be_idt_nl
<< "(strm << CORBA::Any::from_wchar (_tao_sequence[i]));"
<< be_uidt;
break;
case AST_PredefinedType::PT_boolean:
*os << "_tao_marshal_flag =" << be_idt_nl
<< "(strm << CORBA::Any::from_boolean (_tao_sequence[i]));"
<< be_uidt;
break;
case AST_PredefinedType::PT_octet:
*os << "_tao_marshal_flag =" << be_idt_nl
<< "(strm << CORBA::Any::from_octet (_tao_sequence[i]));"
<< be_uidt;
break;
default:
*os << "_tao_marshal_flag = (strm << _tao_sequence[i]);";
break;
}
}
break;
default:
*os << "_tao_marshal_flag = (strm << _tao_sequence[i]);";
break;
}
*os << be_uidt_nl
<< "}";
break;
default:
ACE_ERROR_RETURN ((LM_ERROR,
"(%N:%l) be_visitor_sequence_cdr_op_cs::"
"visit_node - "
"bad sub state\n"),
-1);
}
*os << be_uidt_nl << be_nl;
*os << "return _tao_marshal_flag;" << be_uidt_nl;
return 0;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?