Use =default for skeleton copy constructor
[ACE_TAO.git] / TAO / TAO_IDL / be / be_visitor_argument / marshal_ss.cpp
blob6b3f0e041bf7b96f3db503cf1caa2d3d8f962728
2 //=============================================================================
3 /**
4 * @file marshal_ss.cpp
6 * Visitor that generates code that passes the argument variable to the
7 * marshal operations.
9 * @author Aniruddha Gokhale
11 //=============================================================================
13 #include "argument.h"
15 // ************************************************************************
16 // Visitor to generate code for passing argument to the marshal/demarshal
17 // routines
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 (
32 be_argument *node)
34 this->ctx_->node (node);
35 be_type *bt = dynamic_cast<be_type*> (node->field_type ());
37 if (!bt)
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")),
43 -1);
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 >> ";
58 break;
59 case AST_Argument::dir_OUT:
60 break;
63 else if (this->ctx_->sub_state () == TAO_CodeGen::TAO_CDR_OUTPUT)
65 switch (this->direction ())
67 case AST_Argument::dir_IN:
68 break;
69 case AST_Argument::dir_INOUT:
70 case AST_Argument::dir_OUT:
71 *os << be_nl << "(_tao_out << ";
72 break;
75 else
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")),
81 -1);
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")),
90 -1);
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:
99 *os << ")";
100 break;
101 case AST_Argument::dir_OUT:
102 break;
105 else if (this->ctx_->sub_state () == TAO_CodeGen::TAO_CDR_OUTPUT)
107 switch (this->direction ())
109 case AST_Argument::dir_IN:
110 break;
111 case AST_Argument::dir_INOUT:
112 case AST_Argument::dir_OUT:
113 *os << ")";
114 break;
117 else
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")),
123 -1);
126 return 0;
129 int be_visitor_args_marshal_ss::visit_array (be_array *)
131 TAO_OutStream *os = this->ctx_->stream ();
132 be_argument *arg =
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;
143 break;
144 case AST_Argument::dir_OUT:
145 break;
148 else if (this->ctx_->sub_state () == TAO_CodeGen::TAO_CDR_OUTPUT)
150 switch (this->direction ())
152 case AST_Argument::dir_IN:
153 break;
154 case AST_Argument::dir_INOUT:
155 case AST_Argument::dir_OUT:
156 *os << "_tao_forany_" << lname;
157 break;
160 else
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")),
166 -1);
169 return 0;
172 int be_visitor_args_marshal_ss::visit_enum (be_enum *)
174 TAO_OutStream *os = this->ctx_->stream ();
175 be_argument *arg =
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:
185 *os << lname;
186 break;
187 case AST_Argument::dir_OUT:
188 break;
191 else if (this->ctx_->sub_state () == TAO_CodeGen::TAO_CDR_OUTPUT)
193 switch (this->direction ())
195 case AST_Argument::dir_IN:
196 break;
197 case AST_Argument::dir_INOUT:
198 case AST_Argument::dir_OUT:
199 *os << lname;
200 break;
203 else
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")),
209 -1);
212 return 0;
215 int be_visitor_args_marshal_ss::visit_interface (
216 be_interface *)
218 return this->emit_common ();
221 int be_visitor_args_marshal_ss::visit_interface_fwd (
222 be_interface_fwd *)
224 return this->emit_common ();
227 int be_visitor_args_marshal_ss::visit_valuebox (
228 be_valuebox *)
230 return this->emit_common ();
233 int be_visitor_args_marshal_ss::visit_valuetype (
234 be_valuetype *)
236 return this->emit_common ();
239 int be_visitor_args_marshal_ss::visit_valuetype_fwd (
240 be_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 ();
254 be_argument *arg =
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:
264 *os << lname;
265 break;
266 case AST_Argument::dir_OUT:
267 break;
270 else if (this->ctx_->sub_state () == TAO_CodeGen::TAO_CDR_OUTPUT)
272 switch (this->direction ())
274 case AST_Argument::dir_IN:
275 break;
276 case AST_Argument::dir_INOUT:
277 *os << lname;
278 break;
279 case AST_Argument::dir_OUT:
280 *os << lname << ".in ()";
281 break;
284 else
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")),
290 -1);
293 return 0;
296 int be_visitor_args_marshal_ss::visit_string (be_string *node)
298 TAO_OutStream *os = this->ctx_->stream ();
299 be_argument *arg =
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;
303 bool wide =
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:
312 if (bound == 0)
314 *os << lname << ".out ()";
316 else
318 *os << "::ACE_InputCDR::to_"
319 << (wide ? "w" : "" ) << "string ("
320 << lname << ".out (), " << bound << ")";
323 break;
324 case AST_Argument::dir_OUT:
325 break;
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.
332 if (bound == 0)
334 switch (this->direction ())
336 case AST_Argument::dir_IN:
337 break;
338 case AST_Argument::dir_INOUT:
339 case AST_Argument::dir_OUT:
340 *os << lname << ".in ()";
341 break;
344 else
346 switch (this->direction ())
348 case AST_Argument::dir_IN:
349 break;
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 << ")";
357 break;
361 else
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")),
367 -1);
370 return 0;
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")),
394 -1);
397 this->ctx_->alias (nullptr);
398 return 0;
402 be_visitor_args_marshal_ss::visit_component (
403 be_component *node
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 (
419 be_eventtype *node
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 (
435 be_home *node
438 return this->visit_interface (node);
442 be_visitor_args_marshal_ss::emit_common ()
444 TAO_OutStream *os = this->ctx_->stream ();
445 be_argument *arg =
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 ()";
456 break;
457 case AST_Argument::dir_OUT:
458 break;
461 else if (this->ctx_->sub_state () == TAO_CodeGen::TAO_CDR_OUTPUT)
463 switch (this->direction ())
465 case AST_Argument::dir_IN:
466 break;
467 case AST_Argument::dir_INOUT:
468 case AST_Argument::dir_OUT:
469 *os << lname << ".in ()";
470 break;
473 else
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")),
479 -1);
482 return 0;
487 be_visitor_args_marshal_ss::emit_common2 (be_type *node)
489 TAO_OutStream *os = this->ctx_->stream ();
490 be_argument *arg =
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:
501 *os << lname;
502 break;
503 case AST_Argument::dir_OUT:
504 break;
507 else if (this->ctx_->sub_state () == TAO_CodeGen::TAO_CDR_OUTPUT)
509 switch (this->direction ())
511 case AST_Argument::dir_IN:
512 break;
513 case AST_Argument::dir_INOUT:
514 *os << lname;
515 break;
516 case AST_Argument::dir_OUT:
517 *os << lname
518 << (st == AST_Type::VARIABLE ? ".in ()" : "");
520 break;
523 else
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")),
529 -1);
532 return 0;