1 /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*-
2 * GObject introspection: Parsed GIR
3 *
4 * Copyright (C) 2005 Matthias Clasen
5 *
6 * SPDX-License-Identifier: LGPL-2.1-or-later
7 *
8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2 of the License, or (at your option) any later version.
12 *
13 * This library is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with this library; if not, write to the
20 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
21 * Boston, MA 02111-1307, USA.
22 */
23
24 #pragma once
25
26 #include <glib.h>
27
28 #include "girmodule-private.h"
29
30 G_BEGIN_DECLS
31
32 typedef struct _GIIrNode GIIrNode;
33 typedef struct _GIIrNodeFunction GIIrNodeFunction;
34 typedef struct _GIIrNodeParam GIIrNodeParam;
35 typedef struct _GIIrNodeType GIIrNodeType;
36 typedef struct _GIIrNodeInterface GIIrNodeInterface;
37 typedef struct _GIIrNodeSignal GIIrNodeSignal;
38 typedef struct _GIIrNodeProperty GIIrNodeProperty;
39 typedef struct _GIIrNodeVFunc GIIrNodeVFunc;
40 typedef struct _GIIrNodeField GIIrNodeField;
41 typedef struct _GIIrNodeValue GIIrNodeValue;
42 typedef struct _GIIrNodeEnum GIIrNodeEnum;
43 typedef struct _GIIrNodeBoxed GIIrNodeBoxed;
44 typedef struct _GIIrNodeStruct GIIrNodeStruct;
45 typedef struct _GIIrNodeConstant GIIrNodeConstant;
46 typedef struct _GIIrNodeXRef GIIrNodeXRef;
47 typedef struct _GIIrNodeUnion GIIrNodeUnion;
48
49 typedef enum
50 {
51 GI_IR_NODE_INVALID = 0,
52 GI_IR_NODE_FUNCTION = 1,
53 GI_IR_NODE_CALLBACK = 2,
54 GI_IR_NODE_STRUCT = 3,
55 GI_IR_NODE_BOXED = 4,
56 GI_IR_NODE_ENUM = 5,
57 GI_IR_NODE_FLAGS = 6,
58 GI_IR_NODE_OBJECT = 7,
59 GI_IR_NODE_INTERFACE = 8,
60 GI_IR_NODE_CONSTANT = 9,
61 GI_IR_NODE_INVALID_0 = 10, /* DELETED - used to be ERROR_DOMAIN */
62 GI_IR_NODE_UNION = 11,
63 GI_IR_NODE_PARAM = 12,
64 GI_IR_NODE_TYPE = 13,
65 GI_IR_NODE_PROPERTY = 14,
66 GI_IR_NODE_SIGNAL = 15,
67 GI_IR_NODE_VALUE = 16,
68 GI_IR_NODE_VFUNC = 17,
69 GI_IR_NODE_FIELD = 18,
70 GI_IR_NODE_XREF = 19
71 } GIIrNodeTypeId;
72
73 struct _GIIrNode
74 {
75 GIIrNodeTypeId type;
76 gchar *name;
77 GIIrModule *module;
78
79 guint32 offset; /* Assigned as we build the typelib */
80
81 GHashTable *attributes;
82 };
83
84 struct _GIIrNodeXRef
85 {
86 GIIrNode node;
87
88 gchar *namespace;
89 };
90
91 struct _GIIrNodeFunction
92 {
93 GIIrNode node;
94
95 gboolean deprecated;
96 gboolean is_varargs; /* Not in typelib yet */
97
98 gboolean is_method;
99 gboolean is_setter;
100 gboolean is_getter;
101 gboolean is_constructor;
102 gboolean wraps_vfunc;
103 gboolean throws;
104 gboolean instance_transfer_full;
105
106 gchar *symbol;
107 char *property;
108
109 GIIrNodeParam *result;
110 GList *parameters;
111 };
112
113 struct _GIIrNodeType
114 {
115 GIIrNode node;
116
117 gboolean is_pointer;
118 gboolean is_basic;
119 gboolean is_array;
120 gboolean is_glist;
121 gboolean is_gslist;
122 gboolean is_ghashtable;
123 gboolean is_interface;
124 gboolean is_error;
125 gint tag;
126
127 gchar *unparsed;
128
129 gboolean zero_terminated;
130 gboolean has_length;
131 gint length;
132 gboolean has_size;
133 gint size;
134 gint array_type;
135
136 GIIrNodeType *parameter_type1;
137 GIIrNodeType *parameter_type2;
138
139 gchar *giinterface;
140 gchar **errors;
141 };
142
143 struct _GIIrNodeParam
144 {
145 GIIrNode node;
146
147 gboolean in;
148 gboolean out;
149 gboolean caller_allocates;
150 gboolean optional;
151 gboolean retval;
152 gboolean nullable;
153 gboolean skip;
154 gboolean transfer;
155 gboolean shallow_transfer;
156 GIScopeType scope;
157
158 gint8 closure;
159 gint8 destroy;
160
161 GIIrNodeType *type;
162 };
163
164 struct _GIIrNodeProperty
165 {
166 GIIrNode node;
167
168 gboolean deprecated;
169
170 gchar *name;
171 gboolean readable;
172 gboolean writable;
173 gboolean construct;
174 gboolean construct_only;
175 gboolean transfer;
176 gboolean shallow_transfer;
177
178 char *setter;
179 char *getter;
180
181 GIIrNodeType *type;
182 };
183
184 struct _GIIrNodeSignal
185 {
186 GIIrNode node;
187
188 gboolean deprecated;
189
190 gboolean run_first;
191 gboolean run_last;
192 gboolean run_cleanup;
193 gboolean no_recurse;
194 gboolean detailed;
195 gboolean action;
196 gboolean no_hooks;
197 gboolean instance_transfer_full;
198
199 gboolean has_class_closure;
200 gboolean true_stops_emit;
201
202 gint class_closure;
203
204 GList *parameters;
205 GIIrNodeParam *result;
206 };
207
208 struct _GIIrNodeVFunc
209 {
210 GIIrNode node;
211
212 gboolean is_varargs; /* Not in typelib yet */
213 gboolean must_chain_up;
214 gboolean must_be_implemented;
215 gboolean must_not_be_implemented;
216 gboolean is_class_closure;
217 gboolean throws;
218 gboolean instance_transfer_full;
219
220 char *invoker;
221
222 GList *parameters;
223 GIIrNodeParam *result;
224
225 gint offset;
226 };
227
228 struct _GIIrNodeField
229 {
230 GIIrNode node;
231
232 gboolean readable;
233 gboolean writable;
234 gint bits;
235 gint offset;
236 GIIrNodeFunction *callback;
237
238 GIIrNodeType *type;
239 };
240
241 struct _GIIrNodeInterface
242 {
243 GIIrNode node;
244
245 gboolean abstract;
246 gboolean deprecated;
247 gboolean fundamental;
248 gboolean final_;
249
250 gchar *gtype_name;
251 gchar *gtype_init;
252
253 gchar *ref_func;
254 gchar *unref_func;
255 gchar *set_value_func;
256 gchar *get_value_func;
257
258 gchar *parent;
259 gchar *glib_type_struct;
260
261 GList *interfaces;
262 GList *prerequisites;
263
264 gint alignment;
265 gint size;
266
267 GList *members;
268 };
269
270 struct _GIIrNodeValue
271 {
272 GIIrNode node;
273
274 gboolean deprecated;
275
276 gint64 value;
277 };
278
279 struct _GIIrNodeConstant
280 {
281 GIIrNode node;
282
283 gboolean deprecated;
284
285 GIIrNodeType *type;
286
287 gchar *value;
288 };
289
290 struct _GIIrNodeEnum
291 {
292 GIIrNode node;
293
294 gboolean deprecated;
295 gint storage_type;
296
297 gchar *gtype_name;
298 gchar *gtype_init;
299 gchar *error_domain;
300
301 GList *values;
302 GList *methods;
303 };
304
305 struct _GIIrNodeBoxed
306 {
307 GIIrNode node;
308
309 gboolean deprecated;
310
311 gchar *gtype_name;
312 gchar *gtype_init;
313
314 gint alignment;
315 gint size;
316
317 GList *members;
318 };
319
320 struct _GIIrNodeStruct
321 {
322 GIIrNode node;
323
324 gboolean deprecated;
325 gboolean disguised;
326 gboolean opaque;
327 gboolean pointer;
328 gboolean is_gtype_struct;
329 gboolean foreign;
330
331 gchar *gtype_name;
332 gchar *gtype_init;
333
334 gchar *copy_func;
335 gchar *free_func;
336
337 gint alignment;
338 gint size;
339
340 GList *members;
341 };
342
343 struct _GIIrNodeUnion
344 {
345 GIIrNode node;
346
347 gboolean deprecated;
348
349 GList *members;
350 GList *discriminators;
351
352 gchar *gtype_name;
353 gchar *gtype_init;
354
355 gchar *copy_func;
356 gchar *free_func;
357
358 gint alignment;
359 gint size;
360
361 gint discriminator_offset;
362 GIIrNodeType *discriminator_type;
363 };
364
365
366 GIIrNode *gi_ir_node_new (GIIrNodeTypeId type,
367 GIIrModule *module);
368 void gi_ir_node_free (GIIrNode *node);
369 guint32 gi_ir_node_get_size (GIIrNode *node);
370 guint32 gi_ir_node_get_full_size (GIIrNode *node);
371 void gi_ir_node_build_typelib (GIIrNode *node,
372 GIIrNode *parent,
373 GIIrTypelibBuild *build,
374 guint32 *offset,
375 guint32 *offset2,
376 guint16 *count2);
377 int gi_ir_node_cmp (GIIrNode *node,
378 GIIrNode *other);
379 gboolean gi_ir_node_can_have_member (GIIrNode *node);
380 void gi_ir_node_add_member (GIIrNode *node,
381 GIIrNodeFunction *member);
382 guint32 gi_ir_write_string (const gchar *str,
383 GHashTable *strings,
384 guchar *data,
385 guint32 *offset);
386
387 const gchar * gi_ir_node_param_direction_string (GIIrNodeParam * node);
388 const gchar * gi_ir_node_type_to_string (GIIrNodeTypeId type);
389
390 GIIrNode *gi_ir_find_node (GIIrTypelibBuild *build,
391 GIIrModule *module,
392 const char *name);
393
394 /* In giroffsets.c */
395
396 void gi_ir_node_compute_offsets (GIIrTypelibBuild *build,
397 GIIrNode *node);
398
399
400 G_END_DECLS