2 //=============================================================================
6 * Visitor that generates code that passes the argument variable to the
9 * @author Aniruddha Gokhale
11 //=============================================================================
15 // ************************************************************************
16 // Visitor to generate code for passing argument to the marshal/demarshal
18 // ************************************************************************
20 be_visitor_args_marshal_ss::
21 be_visitor_args_marshal_ss (be_visitor_context
*ctx
)
22 : be_visitor_args (ctx
)
26 be_visitor_args_marshal_ss::
27 ~be_visitor_args_marshal_ss ()
31 int be_visitor_args_marshal_ss::visit_argument (
34 this->ctx_
->node (node
);
35 be_type
*bt
= dynamic_cast<be_type
*> (node
->field_type ());
39 ACE_ERROR_RETURN ((LM_ERROR
,
40 ACE_TEXT ("be_visitor_args_marshal_ss::")
41 ACE_TEXT ("visit_argument - ")
42 ACE_TEXT ("Bad argument type\n")),
46 // Different types have different mappings when used as in/out or
47 // inout parameters. Let this visitor deal with the type
49 TAO_OutStream
*os
= this->ctx_
->stream ();
51 if (this->ctx_
->sub_state () == TAO_CodeGen::TAO_CDR_INPUT
)
53 switch (this->direction ())
55 case AST_Argument::dir_IN
:
56 case AST_Argument::dir_INOUT
:
57 *os
<< be_nl
<< "(_tao_in >> ";
59 case AST_Argument::dir_OUT
:
63 else if (this->ctx_
->sub_state () == TAO_CodeGen::TAO_CDR_OUTPUT
)
65 switch (this->direction ())
67 case AST_Argument::dir_IN
:
69 case AST_Argument::dir_INOUT
:
70 case AST_Argument::dir_OUT
:
71 *os
<< be_nl
<< "(_tao_out << ";
77 ACE_ERROR_RETURN ((LM_ERROR
,
78 ACE_TEXT ("be_visitor_args_marshal_ss::")
79 ACE_TEXT ("visit_argument - ")
80 ACE_TEXT ("Bad substate\n")),
84 if (bt
->accept (this) == -1)
86 ACE_ERROR_RETURN ((LM_ERROR
,
87 ACE_TEXT ("be_visitor_args_marshal_ss::")
88 ACE_TEXT ("visit_argument - ")
89 ACE_TEXT ("cannot accept visitor\n")),
93 if (this->ctx_
->sub_state () == TAO_CodeGen::TAO_CDR_INPUT
)
95 switch (this->direction ())
97 case AST_Argument::dir_IN
:
98 case AST_Argument::dir_INOUT
:
101 case AST_Argument::dir_OUT
:
105 else if (this->ctx_
->sub_state () == TAO_CodeGen::TAO_CDR_OUTPUT
)
107 switch (this->direction ())
109 case AST_Argument::dir_IN
:
111 case AST_Argument::dir_INOUT
:
112 case AST_Argument::dir_OUT
:
119 ACE_ERROR_RETURN ((LM_ERROR
,
120 ACE_TEXT ("be_visitor_args_marshal_ss::")
121 ACE_TEXT ("visit_argument - ")
122 ACE_TEXT ("Bad substate\n")),
129 int be_visitor_args_marshal_ss::visit_array (be_array
*)
131 TAO_OutStream
*os
= this->ctx_
->stream ();
133 dynamic_cast<be_argument
*> (this->ctx_
->node ());
134 const char *lname
= arg
->local_name ()->get_string ();
136 if (this->ctx_
->sub_state () == TAO_CodeGen::TAO_CDR_INPUT
)
138 switch (this->direction ())
140 case AST_Argument::dir_IN
:
141 case AST_Argument::dir_INOUT
:
142 *os
<< "_tao_forany_" << lname
;
144 case AST_Argument::dir_OUT
:
148 else if (this->ctx_
->sub_state () == TAO_CodeGen::TAO_CDR_OUTPUT
)
150 switch (this->direction ())
152 case AST_Argument::dir_IN
:
154 case AST_Argument::dir_INOUT
:
155 case AST_Argument::dir_OUT
:
156 *os
<< "_tao_forany_" << lname
;
162 ACE_ERROR_RETURN ((LM_ERROR
,
163 ACE_TEXT ("be_visitor_args_marshal_ss::")
164 ACE_TEXT ("visit_array - ")
165 ACE_TEXT ("Bad substate\n")),
172 int be_visitor_args_marshal_ss::visit_enum (be_enum
*)
174 TAO_OutStream
*os
= this->ctx_
->stream ();
176 dynamic_cast<be_argument
*> (this->ctx_
->node ());
177 const char *lname
= arg
->local_name ()->get_string ();
179 if (this->ctx_
->sub_state () == TAO_CodeGen::TAO_CDR_INPUT
)
181 switch (this->direction ())
183 case AST_Argument::dir_IN
:
184 case AST_Argument::dir_INOUT
:
187 case AST_Argument::dir_OUT
:
191 else if (this->ctx_
->sub_state () == TAO_CodeGen::TAO_CDR_OUTPUT
)
193 switch (this->direction ())
195 case AST_Argument::dir_IN
:
197 case AST_Argument::dir_INOUT
:
198 case AST_Argument::dir_OUT
:
205 ACE_ERROR_RETURN ((LM_ERROR
,
206 ACE_TEXT ("be_visitor_args_marshal_ss::")
207 ACE_TEXT ("visit_enum - ")
208 ACE_TEXT ("Bad substate\n")),
215 int be_visitor_args_marshal_ss::visit_interface (
218 return this->emit_common ();
221 int be_visitor_args_marshal_ss::visit_interface_fwd (
224 return this->emit_common ();
227 int be_visitor_args_marshal_ss::visit_valuebox (
230 return this->emit_common ();
233 int be_visitor_args_marshal_ss::visit_valuetype (
236 return this->emit_common ();
239 int be_visitor_args_marshal_ss::visit_valuetype_fwd (
242 return this->emit_common ();
245 int be_visitor_args_marshal_ss::visit_predefined_type (
246 be_predefined_type
*node
)
248 return this->gen_pd_arg (node
, false);
251 int be_visitor_args_marshal_ss::visit_sequence (be_sequence
*)
253 TAO_OutStream
*os
= this->ctx_
->stream ();
255 dynamic_cast<be_argument
*> (this->ctx_
->node ());
256 const char *lname
= arg
->local_name ()->get_string ();
258 if (this->ctx_
->sub_state () == TAO_CodeGen::TAO_CDR_INPUT
)
260 switch (this->direction ())
262 case AST_Argument::dir_IN
:
263 case AST_Argument::dir_INOUT
:
266 case AST_Argument::dir_OUT
:
270 else if (this->ctx_
->sub_state () == TAO_CodeGen::TAO_CDR_OUTPUT
)
272 switch (this->direction ())
274 case AST_Argument::dir_IN
:
276 case AST_Argument::dir_INOUT
:
279 case AST_Argument::dir_OUT
:
280 *os
<< lname
<< ".in ()";
286 ACE_ERROR_RETURN ((LM_ERROR
,
287 ACE_TEXT ("be_visitor_args_marshal_ss::")
288 ACE_TEXT ("visit_interface - ")
289 ACE_TEXT ("Bad substate\n")),
296 int be_visitor_args_marshal_ss::visit_string (be_string
*node
)
298 TAO_OutStream
*os
= this->ctx_
->stream ();
300 dynamic_cast<be_argument
*> (this->ctx_
->node ());
301 const char *lname
= arg
->local_name ()->get_string ();
302 ACE_CDR::ULong bound
= node
->max_size ()->ev ()->u
.ulval
;
304 (node
->width () != static_cast<long> (sizeof (char)));
306 if (this->ctx_
->sub_state () == TAO_CodeGen::TAO_CDR_INPUT
)
308 switch (this->direction ())
310 case AST_Argument::dir_IN
:
311 case AST_Argument::dir_INOUT
:
314 *os
<< lname
<< ".out ()";
318 *os
<< "::ACE_InputCDR::to_"
319 << (wide
? "w" : "" ) << "string ("
320 << lname
<< ".out (), " << bound
<< ")";
324 case AST_Argument::dir_OUT
:
328 else if (this->ctx_
->sub_state () == TAO_CodeGen::TAO_CDR_OUTPUT
)
330 // We need to make a distinction between
331 // bounded and unbounded strings.
334 switch (this->direction ())
336 case AST_Argument::dir_IN
:
338 case AST_Argument::dir_INOUT
:
339 case AST_Argument::dir_OUT
:
340 *os
<< lname
<< ".in ()";
346 switch (this->direction ())
348 case AST_Argument::dir_IN
:
350 case AST_Argument::dir_INOUT
:
351 case AST_Argument::dir_OUT
:
352 *os
<< "::ACE_OutputCDR::from_"
353 << (wide
? "w" : "" ) << "string (("
354 << (wide
? "CORBA::WChar" : "char") << " *)"
355 << lname
<< ".in (), " << bound
<< ")";
363 ACE_ERROR_RETURN ((LM_ERROR
,
364 ACE_TEXT ("be_visitor_args_marshal_ss::")
365 ACE_TEXT ("visit_string - ")
366 ACE_TEXT ("Bad substate\n")),
373 int be_visitor_args_marshal_ss::visit_structure (be_structure
*node
)
375 return this->emit_common2 (node
);
378 int be_visitor_args_marshal_ss::visit_union (be_union
*node
)
380 return this->emit_common2 (node
);
383 int be_visitor_args_marshal_ss::visit_typedef (be_typedef
*node
)
385 this->ctx_
->alias (node
);
387 if (node
->primitive_base_type ()->accept (this) == -1)
389 ACE_ERROR_RETURN ((LM_ERROR
,
390 ACE_TEXT ("be_visitor_args_marshal_ss::")
391 ACE_TEXT ("visit_typedef - ")
392 ACE_TEXT ("accept on primitive ")
393 ACE_TEXT ("type failed\n")),
397 this->ctx_
->alias (nullptr);
402 be_visitor_args_marshal_ss::visit_component (
406 return this->visit_interface (node
);
410 be_visitor_args_marshal_ss::visit_component_fwd (
411 be_component_fwd
*node
414 return this->visit_interface_fwd (node
);
418 be_visitor_args_marshal_ss::visit_eventtype (
422 return this->visit_valuetype (node
);
426 be_visitor_args_marshal_ss::visit_eventtype_fwd (
427 be_eventtype_fwd
*node
430 return this->visit_valuetype_fwd (node
);
434 be_visitor_args_marshal_ss::visit_home (
438 return this->visit_interface (node
);
442 be_visitor_args_marshal_ss::emit_common ()
444 TAO_OutStream
*os
= this->ctx_
->stream ();
446 dynamic_cast<be_argument
*> (this->ctx_
->node ());
447 const char *lname
= arg
->local_name ()->get_string ();
449 if (this->ctx_
->sub_state () == TAO_CodeGen::TAO_CDR_INPUT
)
451 switch (this->direction ())
453 case AST_Argument::dir_IN
:
454 case AST_Argument::dir_INOUT
:
455 *os
<< lname
<< ".out ()";
457 case AST_Argument::dir_OUT
:
461 else if (this->ctx_
->sub_state () == TAO_CodeGen::TAO_CDR_OUTPUT
)
463 switch (this->direction ())
465 case AST_Argument::dir_IN
:
467 case AST_Argument::dir_INOUT
:
468 case AST_Argument::dir_OUT
:
469 *os
<< lname
<< ".in ()";
475 ACE_ERROR_RETURN ((LM_ERROR
,
476 ACE_TEXT ("be_visitor_args_marshal_ss")
477 ACE_TEXT ("::emit_common - ")
478 ACE_TEXT ("Bad substate\n")),
487 be_visitor_args_marshal_ss::emit_common2 (be_type
*node
)
489 TAO_OutStream
*os
= this->ctx_
->stream ();
491 dynamic_cast<be_argument
*> (this->ctx_
->node ());
492 const char *lname
= arg
->local_name ()->get_string ();
493 AST_Type::SIZE_TYPE st
= node
->size_type ();
495 if (this->ctx_
->sub_state () == TAO_CodeGen::TAO_CDR_INPUT
)
497 switch (this->direction ())
499 case AST_Argument::dir_IN
:
500 case AST_Argument::dir_INOUT
:
503 case AST_Argument::dir_OUT
:
507 else if (this->ctx_
->sub_state () == TAO_CodeGen::TAO_CDR_OUTPUT
)
509 switch (this->direction ())
511 case AST_Argument::dir_IN
:
513 case AST_Argument::dir_INOUT
:
516 case AST_Argument::dir_OUT
:
518 << (st
== AST_Type::VARIABLE
? ".in ()" : "");
525 ACE_ERROR_RETURN ((LM_ERROR
,
526 ACE_TEXT ("be_visitor_args_marshal_ss")
527 ACE_TEXT ("::emit_common2 - ")
528 ACE_TEXT ("Bad substate\n")),