]> rtime.felk.cvut.cz Git - frescor/forb.git/blob - forb-idl/forb-idl-c-stubs.c
Imported orbit-idl sources (renamed to forb-idl)
[frescor/forb.git] / forb-idl / forb-idl-c-stubs.c
1 #include "config.h"
2
3 #include "orbit-idl-c-backend.h"
4
5 #include <string.h>
6
7 static void
8 cs_output_stub (IDL_tree     tree,
9                 OIDL_C_Info *ci,
10                 int         *idx)
11 {
12         FILE     *of = ci->fh;
13         char     *iface_id;
14         char     *opname;
15         gboolean  has_retval, has_args;
16
17         g_return_if_fail (idx != NULL);
18
19         iface_id = IDL_ns_ident_to_qstring (
20                         IDL_IDENT_TO_NS (IDL_INTERFACE (
21                                 IDL_get_parent_node (tree, IDLN_INTERFACE, NULL)
22                                         ).ident), "_", 0);
23         opname = IDL_ns_ident_to_qstring (IDL_IDENT_TO_NS (IDL_OP_DCL (tree).ident), "_", 0);
24
25         has_retval = IDL_OP_DCL (tree).op_type_spec != NULL;
26         has_args   = IDL_OP_DCL (tree).parameter_dcls != NULL;
27
28         orbit_cbe_op_write_proto (of, tree, "", FALSE);
29
30         fprintf (of, "{\n");
31
32         if (has_retval) {
33                 orbit_cbe_write_param_typespec (of, tree);
34                 fprintf (of, " " ORBIT_RETVAL_VAR_NAME ";\n");
35         }
36 #if 0
37         fprintf (ci->fh, "POA_%s__epv *%s;\n", iface_id, ORBIT_EPV_VAR_NAME);
38         fprintf (ci->fh, "gpointer _ORBIT_servant;\n");
39
40         /* in-proc part */
41         fprintf (ci->fh, "if ((%s = ORBit_c_stub_invoke\n", ORBIT_EPV_VAR_NAME);
42         fprintf (ci->fh, "              (_obj, %s__classid, &_ORBIT_servant,\n", iface_id);
43         fprintf (ci->fh, "               G_STRUCT_OFFSET (POA_%s__epv, %s)))) {\n",
44                  iface_id, IDL_IDENT (IDL_OP_DCL (tree).ident).str);
45
46         fprintf (ci->fh, "if (ORBit_small_flags & ORBIT_SMALL_FAST_LOCALS && \n");
47         fprintf (ci->fh, "    ORBIT_STUB_IsBypass (_obj, %s__classid) && \n", iface_id);
48         fprintf (ci->fh, "    (%s = (POA_%s__epv*) ORBIT_STUB_GetEpv (_obj, %s__classid))->%s) {\n",
49                  ORBIT_EPV_VAR_NAME, iface_id, iface_id, IDL_IDENT (IDL_OP_DCL (tree).ident).str);
50
51         fprintf (ci->fh, "ORBIT_STUB_PreCall (_obj);\n");
52
53         fprintf (ci->fh, "%s%s->%s (_ORBIT_servant, ",
54                  IDL_OP_DCL (tree).op_type_spec? ORBIT_RETVAL_VAR_NAME " = ":"",
55                  ORBIT_EPV_VAR_NAME,
56                  IDL_IDENT (IDL_OP_DCL (tree).ident).str);
57
58         for (node = IDL_OP_DCL (tree).parameter_dcls; node; node = IDL_LIST (node).next)
59                 fprintf (ci->fh, "%s, ",
60                          IDL_IDENT (IDL_PARAM_DCL (IDL_LIST (node).data).simple_declarator).str);
61
62         if (IDL_OP_DCL (tree).context_expr)
63                 fprintf (ci->fh, "_ctx, ");
64
65         fprintf (ci->fh, "ev);\n");
66
67         fprintf (ci->fh, "ORBit_stub_post_invoke (_obj, %s);\n", ORBIT_EPV_VAR_NAME);
68
69         fprintf (of, " } else { /* remote marshal */\n");
70 #endif
71
72         /* remote invocation part */
73         if (has_args)
74                 orbit_cbe_flatten_args (tree, of, "_args");
75
76         fprintf (of, "ORBit_c_stub_invoke (_obj, "
77                  "&%s__iinterface.methods, %d, ", iface_id, *idx);
78
79         if (has_retval)
80                 fprintf (of, "&_ORBIT_retval, ");
81         else
82                 fprintf (of, "NULL, ");
83
84         if (has_args)
85                 fprintf (of, "_args, ");
86         else
87                 fprintf (of, "NULL, ");
88
89         if (IDL_OP_DCL (tree).context_expr)
90                 fprintf (ci->fh, "_ctx, ");
91         else
92                 fprintf (ci->fh, "NULL, ");
93                 
94         fprintf (of, "ev, ");
95
96         fprintf (of, "%s__classid, G_STRUCT_OFFSET (POA_%s__epv, %s),\n",
97                  iface_id, iface_id, IDL_IDENT (IDL_OP_DCL (tree).ident).str);
98         fprintf (of, "(ORBitSmallSkeleton) _ORBIT_skel_small_%s);\n\n", opname);
99
100         if (has_retval)
101                 fprintf (of, "return " ORBIT_RETVAL_VAR_NAME ";\n");
102
103         fprintf (of, "}\n");
104
105         g_free (iface_id);
106
107         (*idx)++;
108 }
109
110 static void
111 cs_output_stubs (IDL_tree     tree,
112                  OIDL_C_Info *ci,
113                  int         *idx)
114 {
115         if (!tree)
116                 return;
117
118         switch (IDL_NODE_TYPE (tree)) {
119         case IDLN_MODULE:
120                 cs_output_stubs (IDL_MODULE (tree).definition_list, ci, idx);
121                 break;
122         case IDLN_LIST: {
123                 IDL_tree sub;
124
125                 for (sub = tree; sub; sub = IDL_LIST (sub).next)
126                         cs_output_stubs (IDL_LIST (sub).data, ci, idx);
127                 break;
128                 }
129         case IDLN_ATTR_DCL: {
130                 IDL_tree node;
131       
132                 for (node = IDL_ATTR_DCL (tree).simple_declarations; node; node = IDL_LIST (node).next) {
133                         OIDL_Attr_Info *ai;
134
135                         ai = IDL_LIST (node).data->data;
136         
137                         cs_output_stubs (ai->op1, ci, idx);
138
139                         if (ai->op2)
140                                 cs_output_stubs (ai->op2, ci, idx);
141                 }
142                 break;
143                 }
144         case IDLN_INTERFACE: {
145                 int real_idx = 0;
146
147                 cs_output_stubs (IDL_INTERFACE (tree).body, ci, &real_idx);
148                 break;
149                 }
150         case IDLN_OP_DCL:
151                 cs_output_stub (tree, ci, idx);
152                 break;
153         default:
154                 break;
155         }
156 }
157
158 void
159 orbit_idl_output_c_stubs (IDL_tree       tree,
160                           OIDL_Run_Info *rinfo,
161                           OIDL_C_Info   *ci)
162 {
163         fprintf (ci->fh, OIDL_C_WARNING);
164         fprintf (ci->fh, "#include <string.h>\n");
165         fprintf (ci->fh, "#define ORBIT2_STUBS_API\n");
166         fprintf (ci->fh, "#include \"%s.h\"\n\n", ci->base_name);
167
168         cs_output_stubs (tree, ci, NULL);
169 }