383
oidl_marshal_tree_dump(IDL_tree tree, int indent_level)
389
switch(IDL_NODE_TYPE(tree)) {
391
for(node = tree; node; node = IDL_LIST(node).next) {
392
oidl_marshal_tree_dump(IDL_LIST(node).data, indent_level);
396
do_indent(indent_level);
397
g_print("Module %s:\n", IDL_IDENT(IDL_MODULE(tree).ident).str);
398
oidl_marshal_tree_dump(IDL_MODULE(tree).definition_list, indent_level + INDENT_INCREMENT_2);
401
do_indent(indent_level);
402
g_print("Interface %s:\n", IDL_IDENT(IDL_INTERFACE(tree).ident).str);
403
oidl_marshal_tree_dump(IDL_INTERFACE(tree).body, indent_level + INDENT_INCREMENT_2);
406
do_indent(indent_level);
407
g_print("Operation %s:\n", IDL_IDENT(IDL_OP_DCL(tree).ident).str);
409
oidl_marshal_node_dump(((OIDL_Op_Info *)tree->data)->in_stubs, indent_level + INDENT_INCREMENT_2);
410
oidl_marshal_node_dump(((OIDL_Op_Info *)tree->data)->out_stubs, indent_level + INDENT_INCREMENT_2);
412
oidl_marshal_node_dump(((OIDL_Op_Info *)tree->data)->in_skels, indent_level + INDENT_INCREMENT_2);
413
oidl_marshal_node_dump(((OIDL_Op_Info *)tree->data)->out_skels, indent_level + INDENT_INCREMENT_2);
418
IDL_tree curnode, attr_name;
420
for(curnode = IDL_ATTR_DCL(tree).simple_declarations; curnode; curnode = IDL_LIST(curnode).next) {
421
attr_name = IDL_LIST(curnode).data;
423
oidl_marshal_tree_dump(((OIDL_Attr_Info *)attr_name->data)->op1, indent_level + INDENT_INCREMENT_2);
424
if(((OIDL_Attr_Info *)attr_name->data)->op2)
425
oidl_marshal_tree_dump(((OIDL_Attr_Info *)attr_name->data)->op2, indent_level + INDENT_INCREMENT_2);
435
oidl_marshal_node_dump(OIDL_Marshal_Node *tree, int indent_level)
439
do_indent(indent_level);
441
if(!tree) { g_print("Nil\n"); return; }
445
g_print("Recursive loopback to %p\n", tree);
451
ctmp = oidl_marshal_node_fqn(tree);
453
g_print("\"%s\" (\"%s\") ", tree->name, ctmp);
455
g_print("(\"%s\") ", ctmp);
458
g_print("(%s %p): [", nodenames[tree->type], tree);
459
if(tree->flags & MN_INOUT)
461
if(tree->flags & MN_NSROOT)
463
if(tree->flags & MN_NEED_TMPVAR)
464
g_print("NEED_TMPVAR ");
465
if(tree->flags & MN_NOMARSHAL)
466
g_print("NOMARSHAL ");
467
if(tree->flags & MN_ISSEQ)
469
if(tree->flags & MN_ISSTRING)
470
g_print("ISSTRING ");
471
if(tree->flags & MN_LOOPED)
473
if(tree->flags & MN_COALESCABLE)
474
g_print("COALESCABLE ");
475
if(tree->flags & MN_ENDIAN_DEPENDANT)
476
g_print("ENDIAN_DEPENDANT ");
477
if(tree->flags & MN_DEMARSHAL_UPDATE_AFTER)
478
g_print("DEMARSHAL_UPDATE_AFTER ");
479
if(tree->flags & MN_RECURSIVE_TOP)
480
g_print("RECURSIVE_TOP ");
481
if(tree->flags & MN_TOPLEVEL)
482
g_print("TOPLEVEL ");
483
if(tree->flags & MN_PARAM_INOUT)
484
g_print("PARAM_INOUT ");
485
if(tree->flags & MN_NEED_CURPTR_LOCAL)
486
g_print("NEED_CURPTR_LOCAL ");
487
if(tree->flags & MN_NEED_CURPTR_RECVBUF)
488
g_print("NEED_CURPTR_RECVBUF ");
492
g_print("pre-check %d+%s*%s ", tree->pre->len, tree->pre->mult_const,
493
tree->pre->mult_expr?tree->pre->mult_expr->name:"(null)");
495
g_print("post-check %d+%s*%s ", tree->post->len, tree->post->mult_const,
496
tree->post->mult_expr?tree->post->mult_expr->name:"(null)");
498
g_print("*%d arch (%d,%d) iiop (%d,%d)\n", tree->nptrs,
499
tree->arch_head_align, tree->arch_tail_align, tree->iiop_head_align, tree->iiop_tail_align);
503
do_indent(indent_level + INDENT_INCREMENT_1);
504
g_print("loop_var:\n");
505
oidl_marshal_node_dump(tree->u.loop_info.loop_var, indent_level + INDENT_INCREMENT_2);
506
do_indent(indent_level + INDENT_INCREMENT_1);
507
g_print("length_var:\n");
508
oidl_marshal_node_dump(tree->u.loop_info.length_var, indent_level + INDENT_INCREMENT_2);
509
do_indent(indent_level + INDENT_INCREMENT_1);
510
g_print("contents:\n");
511
oidl_marshal_node_dump(tree->u.loop_info.contents, indent_level + INDENT_INCREMENT_2);
514
do_indent(indent_level + INDENT_INCREMENT_1);
515
g_print("datum_size: %d\n", tree->u.datum_info.datum_size);
520
do_indent(indent_level + INDENT_INCREMENT_1);
521
g_print("subnodes:\n");
522
for(ltmp = tree->u.set_info.subnodes; ltmp; ltmp = g_slist_next(ltmp)) {
523
oidl_marshal_node_dump(ltmp->data, indent_level + INDENT_INCREMENT_2);
532
do_indent(indent_level + INDENT_INCREMENT_1);
533
g_print("discrim:\n");
534
oidl_marshal_node_dump(tree->u.switch_info.discrim, indent_level + INDENT_INCREMENT_2);
535
do_indent(indent_level + INDENT_INCREMENT_1);
537
for(ltmp = tree->u.switch_info.cases; ltmp; ltmp = g_slist_next(ltmp)) {
538
oidl_marshal_node_dump(ltmp->data, indent_level + INDENT_INCREMENT_2);
547
do_indent(indent_level + INDENT_INCREMENT_1);
548
g_print("labels:\n");
549
for(ltmp = tree->u.case_info.labels; ltmp; ltmp = g_slist_next(ltmp)) {
550
oidl_marshal_node_dump(ltmp->data, indent_level + INDENT_INCREMENT_2);
553
g_print("contents:\n");
554
oidl_marshal_node_dump(tree->u.case_info.contents, indent_level + INDENT_INCREMENT_2);
557
case MARSHAL_COMPLEX:
560
do_indent(indent_level + INDENT_INCREMENT_1);
561
g_print("amount: %ld\n", tree->u.const_info.amount);
564
g_warning("Don't know any details about %s nodes", nodenames[tree->type]);
572
orbit_idl_get_array_type(IDL_tree tree)
576
parent = IDL_get_parent_node(tree, IDLN_ANY, NULL);
577
g_assert(IDL_NODE_TYPE(parent) == IDLN_LIST);
579
parent = IDL_get_parent_node(parent, IDLN_ANY, NULL);
580
switch(IDL_NODE_TYPE(parent)) {
582
return IDL_MEMBER(parent).type_spec;
585
return IDL_TYPE_DCL(parent).type_spec;
588
g_assert(IDL_NODE_TYPE(parent) == IDLN_MEMBER
589
|| IDL_NODE_TYPE(parent) == IDLN_TYPE_DCL);
596
orbit_idl_member_get_name(IDL_tree tree)
598
switch(IDL_NODE_TYPE(tree)) {
599
case IDLN_TYPE_ARRAY:
600
return orbit_idl_member_get_name(IDL_TYPE_ARRAY(tree).ident);
603
return IDL_IDENT(tree).str;
606
g_error("Don't know how to get member name of a %s", IDL_tree_type_names[IDL_NODE_TYPE(tree)]);
613
orbit_idl_node_foreach(OIDL_Marshal_Node *node, GFunc func, gpointer user_data)
622
func(node, user_data);
626
orbit_idl_node_foreach(node->u.loop_info.loop_var, func, user_data);
627
orbit_idl_node_foreach(node->u.loop_info.length_var, func, user_data);
628
orbit_idl_node_foreach(node->u.loop_info.contents, func, user_data);
634
orbit_idl_node_foreach(node->u.switch_info.discrim, func, user_data);
636
for(ltmp = node->u.switch_info.cases; ltmp; ltmp = g_slist_next(ltmp))
637
orbit_idl_node_foreach((OIDL_Marshal_Node *)ltmp->data, func, user_data);
644
for(ltmp = node->u.case_info.labels; ltmp; ltmp = g_slist_next(ltmp))
645
orbit_idl_node_foreach((OIDL_Marshal_Node *)ltmp->data, func, user_data);
647
orbit_idl_node_foreach(node->u.case_info.contents, func, user_data);
654
for(ltmp = node->u.set_info.subnodes; ltmp; ltmp = g_slist_next(ltmp))
655
orbit_idl_node_foreach((OIDL_Marshal_Node *)ltmp->data, func, user_data);
665
375
IDL_tree_traverse_helper(IDL_tree p, GFunc f,
666
376
gconstpointer func_data,
667
GHashTable *visited_nodes)
377
GHashTable *visited_nodes,
378
gboolean include_self)
669
380
IDL_tree curitem;
671
if(g_hash_table_lookup(visited_nodes, p))
382
if (g_hash_table_lookup (visited_nodes, p))
674
g_hash_table_insert(visited_nodes, p, ((gpointer)1));
385
g_hash_table_insert (visited_nodes, p, ((gpointer)1));
676
for(curitem = IDL_INTERFACE(p).inheritance_spec; curitem;
677
curitem = IDL_LIST(curitem).next) {
678
IDL_tree_traverse_helper(IDL_get_parent_node(IDL_LIST(curitem).data, IDLN_INTERFACE, NULL), f, func_data, visited_nodes);
387
for (curitem = IDL_INTERFACE (p).inheritance_spec; curitem;
388
curitem = IDL_LIST (curitem).next) {
389
IDL_tree_traverse_helper (IDL_get_parent_node
390
(IDL_LIST (curitem).data, IDLN_INTERFACE, NULL), f, func_data, visited_nodes, TRUE);
681
f(p, (gpointer)func_data);
685
IDL_tree_traverse_parents(IDL_tree p,
687
gconstpointer func_data)
689
GHashTable *visited_nodes = g_hash_table_new(NULL, g_direct_equal);
694
if(IDL_NODE_TYPE(p) != IDLN_INTERFACE)
695
p = IDL_get_parent_node(p, IDLN_INTERFACE, NULL);
700
IDL_tree_traverse_helper(p, f, func_data, visited_nodes);
702
g_hash_table_destroy(visited_nodes);
394
f(p, (gpointer)func_data);
398
IDL_tree_traverse_parents_full (IDL_tree p,
400
gconstpointer func_data,
401
gboolean include_self)
403
GHashTable *visited_nodes = g_hash_table_new (NULL, g_direct_equal);
408
if (IDL_NODE_TYPE(p) != IDLN_INTERFACE)
409
p = IDL_get_parent_node (p, IDLN_INTERFACE, NULL);
414
IDL_tree_traverse_helper (p, f, func_data, visited_nodes, include_self);
416
g_hash_table_destroy (visited_nodes);
420
IDL_tree_traverse_parents (IDL_tree p,
422
gconstpointer func_data)
424
IDL_tree_traverse_parents_full (p, f, func_data, TRUE);
705
427
/* For use by below function */
753
475
from the IDLN_* enums into an index into nptrrefs_required (typeoffsets)
756
oidl_param_info(IDL_tree param, IDL_ParamRole role, gboolean *isSlice)
758
const int * const typeoffsets = orbit_cbe_get_typeoffsets_table ();
759
const int nptrrefs_required[][4] = {
760
{0,1,1,0} /* float */,
761
{0,1,1,0} /* double */,
762
{0,1,1,0} /* long double */,
763
{1,1,1,0} /* fixed_d_s 3 */,
764
{0,1,1,0} /* boolean */,
765
{0,1,1,0} /* char */,
766
{0,1,1,0} /* wchar */,
767
{0,1,1,0} /* octet */,
768
{0,1,1,0} /* enum */,
769
{0,1,1,0} /* objref */,
770
{1,1,1,0} /* fixed struct 10 */,
771
{1,1,1,0} /* fixed union */,
772
{0,1,1,0} /* string */,
773
{0,1,1,0} /* wstring */,
774
{1,1,2,1} /* sequence */,
775
{0,0,0,0} /* fixed array */,
776
{1,1,2,1} /* any 16 */
786
/* Now, how do we use this table? :) */
787
param = orbit_cbe_get_typespec(param);
791
switch(IDL_NODE_TYPE(param)) {
792
case IDLN_TYPE_STRUCT:
793
case IDLN_TYPE_UNION:
794
if(((role == DATA_RETURN) || (role == DATA_OUT))
795
&& !orbit_cbe_type_is_fixed_length(param))
798
case IDLN_TYPE_ARRAY:
799
if ( role == DATA_RETURN ) {
802
} else if (role==DATA_OUT && !orbit_cbe_type_is_fixed_length(param)) {
808
if ( IDL_NATIVE(param).user_type
809
&& strcmp(IDL_NATIVE(param).user_type,"IDL_variable_length_struct")==0 ) {
810
return role==DATA_OUT ? 2 : 1;
818
typeidx = typeoffsets[IDL_NODE_TYPE(param)];
819
g_assert(typeidx >= 0);
822
case DATA_IN: role = 0; break;
823
case DATA_INOUT: role = 1; break;
824
case DATA_OUT: role = 2; break;
825
case DATA_RETURN: role = 3; break;
826
default: g_assert_not_reached();
829
retval += nptrrefs_required[typeidx][role];
834
oidl_param_numptrs(IDL_tree param, IDL_ParamRole role)
837
return oidl_param_info(param, role, &isSlice);
478
oidl_param_info(IDL_tree in_param, IDL_ParamRole role, gboolean *isSlice)
481
const int * const typeoffsets = orbit_cbe_get_typeoffsets_table ();
482
const int nptrrefs_required[][4] = {
483
{0,1,1,0} /* float */,
484
{0,1,1,0} /* double */,
485
{0,1,1,0} /* long double */,
486
{1,1,1,0} /* fixed_d_s 3 */,
487
{0,1,1,0} /* boolean */,
488
{0,1,1,0} /* char */,
489
{0,1,1,0} /* wchar */,
490
{0,1,1,0} /* octet */,
491
{0,1,1,0} /* enum */,
492
{0,1,1,0} /* objref */,
493
{1,1,1,0} /* fixed struct 10 */,
494
{1,1,1,0} /* fixed union */,
495
{0,1,1,0} /* string */,
496
{0,1,1,0} /* wstring */,
497
{1,1,2,1} /* sequence */,
498
{0,0,0,0} /* fixed array */,
499
{1,1,2,1} /* any 16 */
509
/* Now, how do we use this table? :) */
510
param = orbit_cbe_get_typespec (in_param);
514
switch (IDL_NODE_TYPE (param)) {
515
case IDLN_TYPE_STRUCT:
516
case IDLN_TYPE_UNION:
517
if (((role == DATA_RETURN) || (role == DATA_OUT)) &&
518
!orbit_cbe_type_is_fixed_length(param))
522
case IDLN_TYPE_ARRAY:
523
if ( role == DATA_RETURN ) {
527
} else if (role == DATA_OUT &&
528
!orbit_cbe_type_is_fixed_length (param)) {
535
if ( IDL_NATIVE (param).user_type
536
&& strcmp (IDL_NATIVE (param).user_type,
537
"IDL_variable_length_struct") == 0 )
538
return role == DATA_OUT ? 2 : 1;
541
case IDLN_EXCEPT_DCL:
542
fprintf (stderr, "Error: exception declared at '%s:%d' cannot be "
543
"used as a method parameter\n", in_param->_file,
552
typeidx = typeoffsets [IDL_NODE_TYPE (param)];
553
g_assert (typeidx >= 0);
569
g_assert_not_reached ();
573
retval += nptrrefs_required [typeidx] [role];