2
* orbit-imodule-utils.c:
4
* Copyright (C) 2002 Sun Microsystems, Inc.
7
* This library is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Library General Public
9
* License as published by the Free Software Foundation; either
10
* version 2 of the License, or (at your option) any later version.
12
* This library is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Library General Public License for more details.
17
* You should have received a copy of the GNU Library General Public
18
* License along with this library; if not, write to the
19
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20
* Boston, MA 02111-1307, USA.
23
* Mark McLoughlin <mark@skynet.ie>
24
* Elliot Lee <sopwith@redhat.com
29
#include <orbit/orbit.h>
31
#include "orbit-imodule-utils.h"
32
#include "orbit-imodule-libidl-utils.h"
34
static CORBA_StructMemberSeq *
35
ORBit_imodule_get_struct_members (GHashTable *typecodes,
37
CORBA_Environment *ev)
39
CORBA_StructMemberSeq *members;
44
g_return_val_if_fail (IDL_NODE_TYPE (tree) == IDLN_TYPE_STRUCT ||
45
IDL_NODE_TYPE (tree) == IDLN_EXCEPT_DCL, NULL);
47
for (l = IDL_TYPE_STRUCT (tree).member_list; l; l = IDL_LIST (l).next)
48
num_members += IDL_list_length (IDL_MEMBER (IDL_LIST (l).data).dcls);
50
members = CORBA_StructMemberSeq__alloc ();
52
members->_length = members->_maximum = num_members;
53
members->_buffer = CORBA_StructMemberSeq_allocbuf (members->_length);
54
members->_release = CORBA_TRUE;
56
for (i = 0, l = IDL_TYPE_STRUCT (tree).member_list; l; l = IDL_LIST (l).next) {
60
subtc = ORBit_imodule_get_typecode (
61
typecodes, IDL_MEMBER (IDL_LIST (l).data).type_spec);
63
for (dcl = IDL_MEMBER (IDL_LIST (l).data).dcls; dcl;
64
dcl = IDL_LIST (dcl).next, i++) {
65
CORBA_StructMember *member = &members->_buffer [i];
68
if (IDL_NODE_TYPE (dcl) == IDLN_IDENT)
69
name = IDL_IDENT (dcl).str;
70
else /* IDLN_TYPE_ARRAY */
71
name = IDL_IDENT (IDL_TYPE_ARRAY (dcl).ident).str;
73
member->name = CORBA_string_dup (name);
74
member->type = (CORBA_TypeCode)
75
CORBA_Object_duplicate ((CORBA_Object) subtc, ev);
76
member->type_def = CORBA_OBJECT_NIL; /* Not used? */
79
CORBA_Object_release ((CORBA_Object) subtc, ev);
82
g_assert (i == num_members);
88
ORBit_imodule_jam_int (IDL_tree src, CORBA_TypeCode tc, gpointer dest)
92
switch (IDL_NODE_TYPE (src)) {
94
val = IDL_BOOLEAN (src).value ? 1 : 0;
97
val = IDL_CHAR (src).value [0];
100
val = IDL_INTEGER (src).value;
103
g_assert_not_reached ();
108
case CORBA_tk_boolean:
111
*(CORBA_boolean *) dest = val;
114
case CORBA_tk_ushort:
115
*(CORBA_short *) dest = val;
119
*(CORBA_long *) dest = val;
122
g_assert_not_reached ();
128
ORBit_imodule_setup_label_any (CORBA_TypeCode tc,
132
if (!node) { /* default case */
133
label->_type = TC_CORBA_octet;
134
label->_value = ORBit_small_alloc (TC_CORBA_octet);
135
*(CORBA_octet *) label->_value = -1;
139
label->_type = (CORBA_TypeCode)
140
CORBA_Object_duplicate (
141
(CORBA_Object) tc, NULL);
142
label->_value = ORBit_small_alloc (tc);
144
switch (IDL_NODE_TYPE (node)) {
148
ORBit_imodule_jam_int (node, tc, label->_value);
152
g_assert (tc->kind == CORBA_tk_float);
153
*(CORBA_float *) label->_value = IDL_FLOAT (node).value;
155
case IDLN_BINOP: /* drop through */
159
if (IDL_NODE_TYPE (node) == IDLN_BINOP)
160
val = _IDL_binop_eval (IDL_BINOP (node).op,
161
IDL_BINOP (node).left,
162
IDL_BINOP (node).right);
164
val = _IDL_unaryop_eval (IDL_BINOP (node).op,
165
IDL_UNARYOP (node).operand);
167
ORBit_imodule_jam_int (val, tc, label->_value);
174
g_assert (label->_type->kind == CORBA_tk_enum);
175
for (val = 0; val < label->_type->sub_parts; val++)
176
if (!strcmp (IDL_IDENT (node).str, label->_type->subnames [val]))
178
g_assert (val < label->_type->sub_parts);
179
*(CORBA_long *) label->_value = val;
183
g_assert_not_reached ();
188
static CORBA_UnionMemberSeq *
189
ORBit_imodule_get_union_members (GHashTable *typecodes,
191
CORBA_TypeCode switchtc,
192
CORBA_Environment *ev)
194
CORBA_UnionMemberSeq *members;
199
g_return_val_if_fail (IDL_NODE_TYPE (tree) == IDLN_TYPE_UNION, NULL);
201
for (l = IDL_TYPE_UNION (tree).switch_body; l; l = IDL_LIST (l).next)
202
num_members += IDL_list_length (IDL_CASE_STMT (IDL_LIST (l).data).labels);
204
members = CORBA_UnionMemberSeq__alloc ();
206
members->_length = members->_maximum = num_members;
207
members->_buffer = CORBA_UnionMemberSeq_allocbuf (members->_length);
208
members->_release = CORBA_TRUE;
210
for (i = 0, l = IDL_TYPE_UNION (tree).switch_body; l; l = IDL_LIST (l).next) {
211
CORBA_TypeCode subtc;
212
IDL_tree member, label, dcl;
214
member = IDL_CASE_STMT (IDL_LIST (l).data).element_spec;
215
g_assert (IDL_NODE_TYPE (member) == IDLN_MEMBER);
217
subtc = ORBit_imodule_get_typecode (
218
typecodes, IDL_MEMBER (member).type_spec);
219
dcl = IDL_LIST (IDL_MEMBER (member).dcls).data;
221
for (label = IDL_CASE_STMT (IDL_LIST (l).data).labels; label;
222
label = IDL_LIST (label).next, i++) {
223
CORBA_UnionMember *umember = &members->_buffer [i];
225
ORBit_imodule_setup_label_any (
226
switchtc, IDL_LIST (label).data, &umember->label);
228
umember->label._release = CORBA_TRUE;
230
umember->name = CORBA_string_dup (IDL_IDENT (dcl).str);
231
umember->type = (CORBA_TypeCode)
232
CORBA_Object_duplicate ((CORBA_Object) subtc, ev);
233
umember->type_def = CORBA_OBJECT_NIL; /* Not used? */
236
CORBA_Object_release ((CORBA_Object) subtc, ev);
239
g_assert (i == num_members);
244
static CORBA_EnumMemberSeq *
245
ORBit_imodule_get_enum_members (IDL_tree tree,
246
CORBA_Environment *ev)
248
CORBA_EnumMemberSeq *members;
253
g_return_val_if_fail (IDL_NODE_TYPE (tree) == IDLN_TYPE_ENUM, NULL);
255
num_members = IDL_list_length (IDL_TYPE_ENUM (tree).enumerator_list);
257
members = CORBA_EnumMemberSeq__alloc ();
259
members->_length = members->_maximum = num_members;
260
members->_buffer = CORBA_EnumMemberSeq_allocbuf (members->_length);
261
members->_release = CORBA_TRUE;
263
for (i = 0, l = IDL_TYPE_ENUM (tree).enumerator_list; l; i++, l = IDL_LIST (l).next)
264
members->_buffer [i] = CORBA_string_dup (IDL_IDENT (IDL_LIST (l).data).str);
266
g_assert (i == num_members);
271
static CORBA_TypeCode
272
ORBit_imodule_lookup_typecode (GHashTable *typecodes,
276
return CORBA_OBJECT_NIL;
278
return (CORBA_TypeCode) CORBA_Object_duplicate (
279
g_hash_table_lookup (typecodes, repo_id),
284
ORBit_imodule_register_typecode (GHashTable *typecodes,
288
g_return_if_fail (g_hash_table_lookup (typecodes, repo_id) == NULL);
290
g_hash_table_insert (
291
typecodes, g_strdup (repo_id),
292
CORBA_Object_duplicate ((CORBA_Object) tc, NULL));
296
ORBit_imodule_new_typecodes (void)
298
return g_hash_table_new_full (
299
g_str_hash, g_str_equal,
301
(GDestroyNotify) CORBA_Object_release);
305
ORBit_imodule_free_typecodes (GHashTable *typecodes)
307
g_hash_table_destroy (typecodes);
311
CORBA_sequence_CORBA_TypeCode *sequence;
316
typecodes_hash_foreach (const char *repo_id,
318
TypecodesHashIter *iter)
320
g_assert (iter->iter < iter->sequence->_length);
322
iter->sequence->_buffer [iter->iter++] =
323
(CORBA_TypeCode) CORBA_Object_duplicate ((CORBA_Object) tc, NULL);
326
CORBA_sequence_CORBA_TypeCode *
327
ORBit_imodule_get_typecodes_seq (GHashTable *typecodes)
329
CORBA_sequence_CORBA_TypeCode *retval;
330
TypecodesHashIter iter;
332
retval = CORBA_sequence_CORBA_TypeCode__alloc ();
333
retval->_length = retval->_maximum = g_hash_table_size (typecodes);
334
retval->_release = TRUE;
335
retval->_buffer = CORBA_sequence_CORBA_TypeCode_allocbuf (retval->_length);
337
iter.sequence = retval;
340
g_hash_table_foreach (typecodes, (GHFunc) typecodes_hash_foreach, &iter);
342
g_assert (iter.iter == retval->_length);
348
ORBit_imodule_get_typespec (IDL_tree tree)
350
IDL_tree retval = NULL;
355
switch (IDL_NODE_TYPE (tree)) {
356
case IDLN_TYPE_INTEGER:
357
case IDLN_TYPE_FLOAT:
358
case IDLN_TYPE_FIXED:
360
case IDLN_TYPE_WIDE_CHAR:
361
case IDLN_TYPE_STRING:
362
case IDLN_TYPE_WIDE_STRING:
363
case IDLN_TYPE_BOOLEAN:
364
case IDLN_TYPE_OCTET:
366
case IDLN_TYPE_OBJECT:
368
case IDLN_TYPE_SEQUENCE:
369
case IDLN_TYPE_ARRAY:
370
case IDLN_TYPE_STRUCT:
371
case IDLN_TYPE_UNION:
372
case IDLN_EXCEPT_DCL:
373
case IDLN_FORWARD_DCL:
376
case IDLN_TYPE_TYPECODE:
380
retval = ORBit_imodule_get_typespec (
381
IDL_TYPE_DCL (tree).type_spec);
384
retval = ORBit_imodule_get_typespec (
385
IDL_PARAM_DCL (tree).param_type_spec);
388
retval = ORBit_imodule_get_typespec (
389
IDL_MEMBER (tree).type_spec);
393
retval = ORBit_imodule_get_typespec (
394
IDL_get_parent_node (tree, IDLN_ANY, NULL));
397
g_error ("Cannot get typespec for %s",
398
IDL_tree_type_names [IDL_NODE_TYPE (tree)]);
406
ORBit_imodule_find_c_align (IDL_tree node)
410
node = ORBit_imodule_get_typespec (node);
412
switch (IDL_NODE_TYPE (node)) {
413
case IDLN_TYPE_INTEGER:
414
switch (IDL_TYPE_INTEGER (node).f_type) {
415
case IDL_INTEGER_TYPE_SHORT:
416
c_align = ORBIT_ALIGNOF_CORBA_SHORT;
418
case IDL_INTEGER_TYPE_LONG:
419
c_align = ORBIT_ALIGNOF_CORBA_LONG;
421
case IDL_INTEGER_TYPE_LONGLONG:
422
c_align = ORBIT_ALIGNOF_CORBA_LONG_LONG;
426
case IDLN_TYPE_FLOAT:
427
switch (IDL_TYPE_FLOAT (node).f_type) {
428
case IDL_FLOAT_TYPE_FLOAT:
429
c_align = ORBIT_ALIGNOF_CORBA_FLOAT;
431
case IDL_FLOAT_TYPE_DOUBLE:
432
c_align = ORBIT_ALIGNOF_CORBA_DOUBLE;
434
case IDL_FLOAT_TYPE_LONGDOUBLE:
435
c_align = ORBIT_ALIGNOF_CORBA_LONG_DOUBLE;
440
c_align = ORBIT_ALIGNOF_CORBA_LONG;
442
case IDLN_TYPE_CHAR: /* drop through */
443
case IDLN_TYPE_BOOLEAN:
444
case IDLN_TYPE_OCTET:
445
c_align = ORBIT_ALIGNOF_CORBA_CHAR;
447
case IDLN_TYPE_WIDE_CHAR:
448
c_align = ORBIT_ALIGNOF_CORBA_SHORT;
450
case IDLN_TYPE_UNION: {
451
IDL_tree l = IDL_TYPE_UNION (node).switch_body;
453
c_align = ORBIT_ALIGNOF_CORBA_STRUCT;
455
for (; l; l = IDL_LIST (l).next) {
456
IDL_tree subtype = IDL_MEMBER (IDL_CASE_STMT (
457
IDL_LIST (l).data).element_spec).type_spec;
459
c_align = MAX (c_align, ORBit_imodule_find_c_align (subtype));
463
case IDLN_EXCEPT_DCL: /* drop through */
464
case IDLN_TYPE_STRUCT: {
465
IDL_tree l = IDL_TYPE_STRUCT (node).member_list;
467
for (; l; l = IDL_LIST (l).next) {
468
IDL_tree member = IDL_MEMBER (IDL_LIST (l).data).type_spec;
470
c_align = MAX (c_align, ORBit_imodule_find_c_align (member));
474
case IDLN_TYPE_STRING: /* drop through */
475
case IDLN_TYPE_WIDE_STRING:
476
case IDLN_TYPE_OBJECT:
477
case IDLN_TYPE_TYPECODE:
478
case IDLN_FORWARD_DCL:
480
c_align = ORBIT_ALIGNOF_CORBA_POINTER;
482
case IDLN_TYPE_ARRAY: {
485
subtype = IDL_TYPE_DCL (
486
IDL_get_parent_node (
487
node, IDLN_TYPE_DCL, NULL)).type_spec;
489
c_align = ORBit_imodule_find_c_align (subtype);
492
case IDLN_TYPE_SEQUENCE:
493
c_align = MAX (MAX (ORBIT_ALIGNOF_CORBA_STRUCT,
494
ORBIT_ALIGNOF_CORBA_LONG),
495
ORBIT_ALIGNOF_CORBA_POINTER);
498
c_align = MAX (ORBIT_ALIGNOF_CORBA_STRUCT,
499
ORBIT_ALIGNOF_CORBA_POINTER);
502
g_error ("Can't find alignment %s\n",
503
IDL_tree_type_names [IDL_NODE_TYPE (node)]);
511
ORBit_imodule_get_typecode (GHashTable *typecodes,
514
CORBA_Environment env;
515
CORBA_TypeCode retval = CORBA_OBJECT_NIL;
518
return CORBA_OBJECT_NIL;
520
CORBA_exception_init (&env);
522
switch (IDL_NODE_TYPE (tree)) {
524
retval = ORBit_imodule_get_typecode (
525
typecodes, IDL_MEMBER (tree).type_spec);
528
retval = (CORBA_TypeCode)
529
CORBA_Object_duplicate (
530
(CORBA_Object) TC_CORBA_any, NULL);
532
case IDLN_TYPE_FLOAT:
533
switch (IDL_TYPE_FLOAT (tree).f_type) {
534
case IDL_FLOAT_TYPE_FLOAT:
535
retval = TC_CORBA_float;
537
case IDL_FLOAT_TYPE_DOUBLE:
538
retval = TC_CORBA_double;
540
case IDL_FLOAT_TYPE_LONGDOUBLE:
541
retval = TC_CORBA_long_double;
545
case IDLN_TYPE_FIXED:
546
retval = CORBA_ORB_create_fixed_tc (NULL,
547
IDL_INTEGER (IDL_TYPE_FIXED (tree).positive_int_const).value,
548
IDL_INTEGER (IDL_TYPE_FIXED (tree).integer_lit).value, &env);
550
case IDLN_TYPE_INTEGER:
551
if (!IDL_TYPE_INTEGER (tree).f_signed)
552
switch (IDL_TYPE_INTEGER (tree).f_type) {
553
case IDL_INTEGER_TYPE_SHORT:
554
retval = TC_CORBA_unsigned_short;
556
case IDL_INTEGER_TYPE_LONGLONG:
557
retval = TC_CORBA_unsigned_long_long;
559
case IDL_INTEGER_TYPE_LONG:
560
retval = TC_CORBA_unsigned_long;
563
g_assert_not_reached ();
566
switch (IDL_TYPE_INTEGER (tree).f_type) {
567
case IDL_INTEGER_TYPE_SHORT:
568
retval = TC_CORBA_short;
570
case IDL_INTEGER_TYPE_LONGLONG:
571
retval = TC_CORBA_long_long;
573
case IDL_INTEGER_TYPE_LONG:
574
retval = TC_CORBA_long;
577
g_assert_not_reached ();
580
case IDLN_TYPE_STRING:
581
retval = (CORBA_TypeCode)
582
CORBA_Object_duplicate (
583
(CORBA_Object) TC_CORBA_string, NULL);
585
case IDLN_TYPE_WIDE_STRING:
586
retval = (CORBA_TypeCode)
587
CORBA_Object_duplicate (
588
(CORBA_Object) TC_CORBA_wstring, NULL);
590
case IDLN_TYPE_OCTET:
591
retval = (CORBA_TypeCode)
592
CORBA_Object_duplicate (
593
(CORBA_Object) TC_CORBA_octet, NULL);
596
retval = (CORBA_TypeCode)
597
CORBA_Object_duplicate (
598
(CORBA_Object) TC_CORBA_char, NULL);
600
case IDLN_TYPE_WIDE_CHAR:
601
retval = (CORBA_TypeCode)
602
CORBA_Object_duplicate (
603
(CORBA_Object) TC_CORBA_wchar, NULL);
605
case IDLN_TYPE_BOOLEAN:
606
retval = (CORBA_TypeCode)
607
CORBA_Object_duplicate (
608
(CORBA_Object) TC_CORBA_boolean, NULL);
610
case IDLN_TYPE_STRUCT:
611
retval = ORBit_imodule_lookup_typecode (
613
IDL_IDENT (IDL_TYPE_STRUCT (tree).ident).repo_id);
616
CORBA_StructMemberSeq *members;
618
members = ORBit_imodule_get_struct_members (
619
typecodes, tree, &env);
621
retval = CORBA_ORB_create_struct_tc (NULL,
622
IDL_IDENT (IDL_TYPE_STRUCT (tree).ident).repo_id,
623
IDL_IDENT (IDL_TYPE_STRUCT (tree).ident).str,
626
ORBit_imodule_register_typecode (
628
IDL_IDENT (IDL_TYPE_STRUCT (tree).ident).repo_id, retval);
630
CORBA_free (members);
633
case IDLN_EXCEPT_DCL:
634
retval = ORBit_imodule_lookup_typecode (
636
IDL_IDENT (IDL_EXCEPT_DCL (tree).ident).repo_id);
639
CORBA_StructMemberSeq *members;
641
members = ORBit_imodule_get_struct_members (
642
typecodes, tree, &env);
644
retval = CORBA_ORB_create_exception_tc (NULL,
645
IDL_IDENT (IDL_EXCEPT_DCL (tree).ident).repo_id,
646
IDL_IDENT (IDL_EXCEPT_DCL (tree).ident).str,
649
ORBit_imodule_register_typecode (
651
IDL_IDENT (IDL_EXCEPT_DCL (tree).ident).repo_id, retval);
653
CORBA_free (members);
656
case IDLN_TYPE_ARRAY: {
657
CORBA_TypeCode subtc;
661
sizer = IDL_list_nth (IDL_TYPE_ARRAY (tree).size_list,
662
IDL_list_length (IDL_TYPE_ARRAY (tree).size_list) - 1);
663
g_assert (IDL_NODE_TYPE (IDL_LIST (sizer).data) == IDLN_INTEGER);
665
type_dcl = IDL_NODE_UP (IDL_NODE_UP (tree));
666
g_assert (IDL_NODE_TYPE (type_dcl) == IDLN_TYPE_DCL);
668
subtc = ORBit_imodule_get_typecode (
669
typecodes, IDL_TYPE_DCL (type_dcl).type_spec),
670
retval = CORBA_ORB_create_array_tc (NULL,
671
IDL_INTEGER (IDL_LIST (sizer).data).value,
673
retval->c_align = subtc->c_align;
674
CORBA_Object_release ((CORBA_Object) subtc, NULL);
676
for (sizer = IDL_LIST (sizer).prev; sizer; sizer = IDL_LIST (sizer).prev) {
678
retval = CORBA_ORB_create_array_tc (NULL,
679
IDL_INTEGER (IDL_LIST (sizer).data).value,
681
retval->c_align = subtc->c_align;
682
CORBA_Object_release ((CORBA_Object) subtc, NULL);
686
retval = ORBit_imodule_create_alias_typecode (
687
typecodes, IDL_TYPE_ARRAY (tree).ident, subtc);
688
CORBA_Object_release ((CORBA_Object) subtc, NULL);
691
case IDLN_TYPE_UNION:
692
retval = ORBit_imodule_lookup_typecode (
694
IDL_IDENT (IDL_TYPE_UNION (tree).ident).repo_id);
697
CORBA_UnionMemberSeq *members;
698
CORBA_TypeCode switchtc;
700
switchtc = ORBit_imodule_get_typecode (
701
typecodes, IDL_TYPE_UNION (tree).switch_type_spec);
703
members = ORBit_imodule_get_union_members (
704
typecodes, tree, switchtc, &env);
705
retval = CORBA_ORB_create_union_tc (NULL,
706
IDL_IDENT (IDL_TYPE_UNION (tree).ident).repo_id,
707
IDL_IDENT (IDL_TYPE_UNION (tree).ident).str,
708
switchtc, members, &env);
710
CORBA_Object_release ((CORBA_Object) switchtc, NULL);
712
ORBit_imodule_register_typecode (
714
IDL_IDENT (IDL_TYPE_UNION (tree).ident).repo_id, retval);
716
CORBA_free (members);
720
retval = ORBit_imodule_lookup_typecode (
722
IDL_IDENT (IDL_TYPE_ENUM (tree).ident).repo_id);
724
CORBA_EnumMemberSeq *members;
726
members = ORBit_imodule_get_enum_members (tree, &env);
728
retval = CORBA_ORB_create_enum_tc (NULL,
729
IDL_IDENT (IDL_TYPE_ENUM (tree).ident).repo_id,
730
IDL_IDENT (IDL_TYPE_ENUM (tree).ident).str,
733
ORBit_imodule_register_typecode (
735
IDL_IDENT (IDL_TYPE_ENUM (tree).ident).repo_id, retval);
737
CORBA_free (members);
741
retval = ORBit_imodule_lookup_typecode (
742
typecodes, IDL_IDENT (tree).repo_id);
743
g_assert (retval != NULL);
745
case IDLN_TYPE_SEQUENCE: {
746
CORBA_TypeCode subtc;
749
if (IDL_TYPE_SEQUENCE (tree).positive_int_const)
750
bound = IDL_INTEGER (IDL_TYPE_SEQUENCE (tree).positive_int_const).value;
752
subtc = ORBit_imodule_get_typecode (
753
typecodes, IDL_TYPE_SEQUENCE (tree).simple_type_spec),
754
retval = CORBA_ORB_create_sequence_tc (NULL,
756
CORBA_Object_release ((CORBA_Object) subtc, NULL);
758
* FIXME: and what about recursive sequences?
762
case IDLN_FORWARD_DCL:
764
retval = ORBit_imodule_lookup_typecode (
766
IDL_IDENT (IDL_TYPE_ENUM (tree).ident).repo_id);
768
retval = CORBA_ORB_create_interface_tc (NULL,
769
IDL_IDENT (IDL_TYPE_ENUM (tree).ident).repo_id,
770
IDL_IDENT (IDL_TYPE_ENUM (tree).ident).str,
773
ORBit_imodule_register_typecode (
775
IDL_IDENT (IDL_TYPE_ENUM (tree).ident).repo_id, retval);
778
case IDLN_TYPE_OBJECT:
779
retval = (CORBA_TypeCode)
780
CORBA_Object_duplicate (
781
(CORBA_Object) TC_CORBA_Object, NULL);
783
case IDLN_TYPE_TYPECODE:
784
retval = (CORBA_TypeCode)
785
CORBA_Object_duplicate (
786
(CORBA_Object) TC_CORBA_TypeCode, NULL);
789
g_error ("We were asked to get a typecode for a %s",
790
IDL_tree_type_names [IDL_NODE_TYPE (tree)]);
794
if (retval && retval->c_align == 0)
795
retval->c_align = ORBit_imodule_find_c_align (tree);
797
if (env._major != CORBA_NO_EXCEPTION)
798
g_warning ("ORBit_imodule_get_typecode: exception %s", env._id);
800
CORBA_exception_free (&env);
806
ORBit_imodule_create_alias_typecode (GHashTable *typecodes,
808
CORBA_TypeCode original_type)
810
CORBA_Environment env;
811
CORBA_TypeCode retval;
813
CORBA_exception_init (&env);
815
g_return_val_if_fail (IDL_NODE_TYPE (tree) == IDLN_IDENT, NULL);
816
g_return_val_if_fail (g_hash_table_lookup (typecodes,
817
IDL_IDENT (tree).repo_id) == NULL, NULL);
819
retval = CORBA_ORB_create_alias_tc (NULL,
820
IDL_IDENT (tree).repo_id,
821
IDL_IDENT (tree).str,
822
original_type, &env);
824
ORBit_imodule_register_typecode (
825
typecodes, IDL_IDENT (tree).repo_id, retval);
827
if (env._major != CORBA_NO_EXCEPTION)
828
g_warning ("ORBit_imodule_create_alias_typecode: exception %s", env._id);
830
CORBA_exception_free (&env);
836
ORBit_imodule_type_is_fixed_length (IDL_tree tree)
838
gboolean is_fixed = TRUE;
842
typespec = ORBit_imodule_get_typespec (tree);
844
switch (IDL_NODE_TYPE (typespec)) {
845
case IDLN_TYPE_FLOAT:
846
case IDLN_TYPE_INTEGER:
849
case IDLN_TYPE_WIDE_CHAR:
850
case IDLN_TYPE_OCTET:
851
case IDLN_TYPE_BOOLEAN:
854
case IDLN_TYPE_SEQUENCE:
855
case IDLN_TYPE_STRING:
856
case IDLN_TYPE_WIDE_STRING:
857
case IDLN_TYPE_OBJECT:
858
case IDLN_FORWARD_DCL:
862
case IDLN_TYPE_TYPECODE:
865
case IDLN_TYPE_UNION:
866
for (iter = IDL_TYPE_UNION (typespec).switch_body;
867
iter; iter = IDL_LIST (iter).next)
868
is_fixed &= ORBit_imodule_type_is_fixed_length (
869
IDL_LIST (IDL_CASE_STMT (
870
IDL_LIST (iter).data).element_spec).data);
872
case IDLN_EXCEPT_DCL:
873
case IDLN_TYPE_STRUCT:
874
for (iter = IDL_TYPE_STRUCT (typespec).member_list;
875
iter; iter = IDL_LIST (iter).next)
876
is_fixed &= ORBit_imodule_type_is_fixed_length (IDL_LIST (iter).data);
878
case IDLN_TYPE_ARRAY:
879
is_fixed = ORBit_imodule_type_is_fixed_length (
880
IDL_TYPE_DCL (IDL_get_parent_node (
881
typespec, IDLN_TYPE_DCL, NULL)).type_spec);
884
is_fixed = ORBit_imodule_type_is_fixed_length (
885
IDL_TYPE_DCL (typespec).type_spec);
889
is_fixed = ORBit_imodule_type_is_fixed_length (IDL_NODE_UP (typespec));
892
is_fixed = ORBit_imodule_type_is_fixed_length (IDL_MEMBER (typespec).type_spec);
895
g_error ("Cannot determine if type %s is fixed-length",
896
IDL_tree_type_names [IDL_NODE_TYPE (typespec)]);
904
ORBit_imodule_traverse_helper (IDL_tree tree,
907
GHashTable *visited_nodes)
911
if (g_hash_table_lookup (visited_nodes, tree))
914
g_hash_table_insert (visited_nodes, tree, GINT_TO_POINTER (1));
916
for (curitem = IDL_INTERFACE (tree).inheritance_spec; curitem;
917
curitem = IDL_LIST (curitem).next)
918
ORBit_imodule_traverse_helper (
919
IDL_get_parent_node (IDL_LIST (curitem).data, IDLN_INTERFACE, NULL),
920
callback, user_data, visited_nodes);
922
callback (tree, user_data);
926
ORBit_imodule_traverse_parents (IDL_tree tree,
930
GHashTable *visited_nodes = g_hash_table_new (NULL, g_direct_equal);
932
g_return_if_fail (tree != NULL);
933
g_return_if_fail (callback != NULL);
935
if (IDL_NODE_TYPE (tree) != IDLN_INTERFACE)
936
tree = IDL_get_parent_node (tree, IDLN_INTERFACE, NULL);
941
ORBit_imodule_traverse_helper (tree, callback, user_data, visited_nodes);
943
g_hash_table_destroy (visited_nodes);