gobject-introspection 3.3.8 → 3.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/ext/gobject-introspection/extconf.rb +4 -4
  3. data/ext/gobject-introspection/gobject_introspection.def +2 -1
  4. data/ext/gobject-introspection/rb-gi-arg-info.c +33 -1
  5. data/ext/gobject-introspection/rb-gi-argument.c +384 -3291
  6. data/ext/gobject-introspection/rb-gi-arguments-in.c +2229 -0
  7. data/ext/gobject-introspection/rb-gi-arguments-out.c +929 -0
  8. data/ext/gobject-introspection/rb-gi-arguments.c +850 -0
  9. data/ext/gobject-introspection/rb-gi-array-type.c +54 -0
  10. data/ext/gobject-introspection/rb-gi-callback.c +242 -0
  11. data/ext/gobject-introspection/rb-gi-conversions.h +0 -43
  12. data/ext/gobject-introspection/rb-gi-direction.c +36 -0
  13. data/ext/gobject-introspection/rb-gi-field-info.c +172 -81
  14. data/ext/gobject-introspection/rb-gi-function-info.c +15 -1404
  15. data/ext/gobject-introspection/rb-gi-private-arg-info.h +24 -0
  16. data/ext/gobject-introspection/rb-gi-private-arguments-in.h +26 -0
  17. data/ext/gobject-introspection/rb-gi-private-arguments-out.h +28 -0
  18. data/ext/gobject-introspection/rb-gi-private-arguments.h +107 -0
  19. data/ext/gobject-introspection/rb-gi-private-array-type.h +26 -0
  20. data/ext/gobject-introspection/rb-gi-private-callback.h +41 -0
  21. data/ext/gobject-introspection/rb-gi-private-direction.h +24 -0
  22. data/ext/gobject-introspection/rb-gi-private-transfer.h +24 -0
  23. data/ext/gobject-introspection/rb-gi-private.h +11 -5
  24. data/ext/gobject-introspection/rb-gi-struct-info.c +2 -0
  25. data/ext/gobject-introspection/rb-gi-transfer.c +36 -0
  26. data/ext/gobject-introspection/rb-gi-type-info.c +1 -13
  27. data/ext/gobject-introspection/rb-gobject-introspection.c +4 -1
  28. data/ext/gobject-introspection/rb-gobject-introspection.h +5 -23
  29. data/lib/gobject-introspection/arg-info.rb +2 -0
  30. data/lib/gobject-introspection/callable-info.rb +1 -1
  31. data/lib/gobject-introspection/loader.rb +0 -39
  32. data/lib/gobject-introspection/type-tag.rb +39 -2
  33. metadata +21 -5
@@ -0,0 +1,929 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright (C) 2012-2019 Ruby-GNOME Project Team
4
+ *
5
+ * This library is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU Lesser General Public
7
+ * License as published by the Free Software Foundation; either
8
+ * version 2.1 of the License, or (at your option) any later version.
9
+ *
10
+ * This library is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ * Lesser General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Lesser General Public
16
+ * License along with this library; if not, write to the Free Software
17
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18
+ * MA 02110-1301 USA
19
+ */
20
+
21
+ #include "rb-gi-private.h"
22
+
23
+ static void
24
+ rb_gi_arguments_out_free_immediate_value(RBGIArguments *args,
25
+ RBGIArgMetadata *metadata,
26
+ gpointer user_data)
27
+ {
28
+ xfree(metadata->out_arg->v_pointer);
29
+ }
30
+
31
+ static void
32
+ rb_gi_arguments_out_free_string(RBGIArguments *args,
33
+ RBGIArgMetadata *metadata,
34
+ gpointer user_data)
35
+ {
36
+ gchar **target = metadata->out_arg->v_pointer;
37
+ if (metadata->transfer != GI_TRANSFER_NOTHING) {
38
+ g_free(*target);
39
+ }
40
+ xfree(target);
41
+ }
42
+
43
+ static void
44
+ rb_gi_arguments_out_free_array_c_uint8(RBGIArguments *args,
45
+ RBGIArgMetadata *metadata,
46
+ gpointer user_data)
47
+ {
48
+ guint8 **target = metadata->out_arg->v_pointer;
49
+ switch (metadata->transfer) {
50
+ case GI_TRANSFER_NOTHING:
51
+ break;
52
+ case GI_TRANSFER_CONTAINER:
53
+ case GI_TRANSFER_EVERYTHING:
54
+ g_free(*target);
55
+ break;
56
+ default:
57
+ rb_raise(rb_eNotImpError,
58
+ "TODO: [%s] %s free GIArgument(%s)[%s]",
59
+ metadata->name,
60
+ rb_gi_direction_to_string(metadata->direction),
61
+ g_type_tag_to_string(metadata->type.tag),
62
+ rb_gi_transfer_to_string(metadata->transfer));
63
+ }
64
+ xfree(target);
65
+ }
66
+
67
+ static void
68
+ rb_gi_arguments_out_free_array_c_string(RBGIArguments *args,
69
+ RBGIArgMetadata *metadata,
70
+ gpointer user_data)
71
+ {
72
+ gchar ***target = metadata->out_arg->v_pointer;
73
+ switch (metadata->transfer) {
74
+ case GI_TRANSFER_NOTHING:
75
+ break;
76
+ case GI_TRANSFER_CONTAINER:
77
+ g_free(*target);
78
+ break;
79
+ case GI_TRANSFER_EVERYTHING:
80
+ g_strfreev(*target);
81
+ break;
82
+ default:
83
+ rb_raise(rb_eNotImpError,
84
+ "TODO: [%s] %s free GIArgument(%s)[%s]",
85
+ metadata->name,
86
+ rb_gi_direction_to_string(metadata->direction),
87
+ g_type_tag_to_string(metadata->type.tag),
88
+ rb_gi_transfer_to_string(metadata->transfer));
89
+ }
90
+ xfree(target);
91
+ }
92
+
93
+ static void
94
+ rb_gi_arguments_out_free_array_c_interface(RBGIArguments *args,
95
+ RBGIArgMetadata *metadata,
96
+ gpointer user_data)
97
+ {
98
+ gpointer **target = metadata->out_arg->v_pointer;
99
+ switch (metadata->transfer) {
100
+ case GI_TRANSFER_NOTHING:
101
+ break;
102
+ case GI_TRANSFER_CONTAINER:
103
+ g_free(*target);
104
+ break;
105
+ case GI_TRANSFER_EVERYTHING:
106
+ default:
107
+ rb_raise(rb_eNotImpError,
108
+ "TODO: [%s] %s free GIArgument(%s)[%s]",
109
+ metadata->name,
110
+ rb_gi_direction_to_string(metadata->direction),
111
+ g_type_tag_to_string(metadata->type.tag),
112
+ rb_gi_transfer_to_string(metadata->transfer));
113
+ }
114
+ xfree(target);
115
+ }
116
+
117
+ static void
118
+ rb_gi_arguments_out_free_array_array_interface_struct(RBGIArguments *args,
119
+ RBGIArgMetadata *metadata,
120
+ gpointer user_data)
121
+ {
122
+ GArray *target = metadata->out_arg->v_pointer;
123
+ switch (metadata->transfer) {
124
+ case GI_TRANSFER_NOTHING:
125
+ break;
126
+ case GI_TRANSFER_CONTAINER:
127
+ case GI_TRANSFER_EVERYTHING:
128
+ default:
129
+ rb_raise(rb_eNotImpError,
130
+ "TODO: [%s] %s free GIArgument(%s)[%s]",
131
+ metadata->name,
132
+ rb_gi_direction_to_string(metadata->direction),
133
+ g_type_tag_to_string(metadata->type.tag),
134
+ rb_gi_transfer_to_string(metadata->transfer));
135
+ }
136
+ g_array_free(target, TRUE);
137
+ }
138
+
139
+ static void
140
+ rb_gi_arguments_out_free_interface_struct(RBGIArguments *args,
141
+ RBGIArgMetadata *metadata,
142
+ gpointer user_data)
143
+ {
144
+ gpointer *target = metadata->out_arg->v_pointer;
145
+ GType gtype = metadata->type.interface_gtype;
146
+ switch (metadata->transfer) {
147
+ case GI_TRANSFER_NOTHING:
148
+ break;
149
+ case GI_TRANSFER_CONTAINER:
150
+ case GI_TRANSFER_EVERYTHING:
151
+ if (gtype == G_TYPE_VALUE) {
152
+ g_value_unset((GValue *)target);
153
+ break;
154
+ } else if (G_TYPE_IS_BOXED(gtype)) {
155
+ if (*target) {
156
+ g_boxed_free(gtype, *target);
157
+ }
158
+ break;
159
+ }
160
+ default:
161
+ rb_raise(rb_eNotImpError,
162
+ "TODO: [%s] %s free GIArgument(%s)[%s]",
163
+ metadata->name,
164
+ rb_gi_direction_to_string(metadata->direction),
165
+ g_type_tag_to_string(metadata->type.tag),
166
+ rb_gi_transfer_to_string(metadata->transfer));
167
+ break;
168
+ }
169
+ xfree(target);
170
+ }
171
+
172
+ static void
173
+ rb_gi_arguments_out_free_interface_object(RBGIArguments *args,
174
+ RBGIArgMetadata *metadata,
175
+ gpointer user_data)
176
+ {
177
+ GObject **target = metadata->out_arg->v_pointer;
178
+ switch (metadata->transfer) {
179
+ case GI_TRANSFER_NOTHING:
180
+ break;
181
+ case GI_TRANSFER_CONTAINER:
182
+ case GI_TRANSFER_EVERYTHING:
183
+ if (*target) {
184
+ g_object_unref(*target);
185
+ }
186
+ break;
187
+ default:
188
+ rb_raise(rb_eNotImpError,
189
+ "TODO: [%s] %s free GIArgument(%s)[%s]",
190
+ metadata->name,
191
+ rb_gi_direction_to_string(metadata->direction),
192
+ g_type_tag_to_string(metadata->type.tag),
193
+ rb_gi_transfer_to_string(metadata->transfer));
194
+ }
195
+ xfree(target);
196
+ }
197
+
198
+ static void
199
+ rb_gi_arguments_out_free_list(RBGIArguments *args,
200
+ RBGIArgMetadata *metadata,
201
+ gpointer user_data)
202
+ {
203
+ gpointer *target = metadata->out_arg->v_pointer;
204
+ switch (metadata->transfer) {
205
+ case GI_TRANSFER_NOTHING:
206
+ break;
207
+ case GI_TRANSFER_CONTAINER:
208
+ if (metadata->type.tag == GI_TYPE_TAG_GLIST) {
209
+ g_list_free(*((GList **)target));
210
+ } else {
211
+ g_slist_free(*((GSList **)target));
212
+ }
213
+ break;
214
+ default:
215
+ rb_raise(rb_eNotImpError,
216
+ "TODO: [%s] %s free GIArgument(%s)[%s]",
217
+ metadata->name,
218
+ rb_gi_direction_to_string(metadata->direction),
219
+ g_type_tag_to_string(metadata->type.tag),
220
+ rb_gi_transfer_to_string(metadata->transfer));
221
+ break;
222
+ }
223
+ xfree(target);
224
+ }
225
+
226
+ static void
227
+ rb_gi_arguments_out_free_hash(RBGIArguments *args,
228
+ RBGIArgMetadata *metadata,
229
+ gpointer user_data)
230
+ {
231
+ GHashTable *target = metadata->out_arg->v_pointer;
232
+ if (metadata->transfer != GI_TRANSFER_NOTHING) {
233
+ rb_raise(rb_eNotImpError,
234
+ "TODO: [%s] %s free GIArgument(%s)[%s]",
235
+ metadata->name,
236
+ rb_gi_direction_to_string(metadata->direction),
237
+ g_type_tag_to_string(metadata->type.tag),
238
+ rb_gi_transfer_to_string(metadata->transfer));
239
+ }
240
+ xfree(target);
241
+ }
242
+
243
+ static void
244
+ rb_gi_arguments_out_free_error(RBGIArguments *args,
245
+ RBGIArgMetadata *metadata,
246
+ gpointer user_data)
247
+ {
248
+ GError **target = metadata->out_arg->v_pointer;
249
+ if (metadata->transfer != GI_TRANSFER_NOTHING) {
250
+ rb_raise(rb_eNotImpError,
251
+ "TODO: [%s] %s free GIArgument(%s)[%s]",
252
+ metadata->name,
253
+ rb_gi_direction_to_string(metadata->direction),
254
+ g_type_tag_to_string(metadata->type.tag),
255
+ rb_gi_transfer_to_string(metadata->transfer));
256
+ }
257
+ xfree(target);
258
+ }
259
+
260
+ static void
261
+ rb_gi_arguments_out_init_arg_array_c(RBGIArguments *args,
262
+ RBGIArgMetadata *metadata)
263
+ {
264
+ GIArgument *argument = metadata->out_arg;
265
+ switch (metadata->element_type.tag) {
266
+ case GI_TYPE_TAG_VOID:
267
+ case GI_TYPE_TAG_BOOLEAN:
268
+ case GI_TYPE_TAG_INT8:
269
+ rb_raise(rb_eNotImpError,
270
+ "TODO: [%s] %s allocates GIArgument(array)[c][%s]",
271
+ metadata->name,
272
+ rb_gi_direction_to_string(metadata->direction),
273
+ g_type_tag_to_string(metadata->element_type.tag));
274
+ break;
275
+ case GI_TYPE_TAG_UINT8:
276
+ if (metadata->output_buffer_p) {
277
+ if (!rb_type_p(metadata->rb_arg, RUBY_T_STRING)) {
278
+ rb_raise(rb_eNotImpError,
279
+ "[%s::%s] %s allocates GIArgument(%s)[%s]: "
280
+ "output buffer isn't String: <%" PRIsVALUE ">",
281
+ args->name,
282
+ metadata->name,
283
+ rb_gi_direction_to_string(metadata->direction),
284
+ g_type_tag_to_string(metadata->type.tag),
285
+ rb_gi_transfer_to_string(metadata->transfer),
286
+ metadata->rb_arg);
287
+ }
288
+ RBGIArgMetadata *length_metadata = metadata->array_length_metadata;
289
+ if (!length_metadata) {
290
+ rb_raise(rb_eNotImpError,
291
+ "TODO: [%s::%s] %s allocates GIArgument(%s)[%s]: "
292
+ "output buffer without length",
293
+ args->name,
294
+ metadata->name,
295
+ rb_gi_direction_to_string(metadata->direction),
296
+ g_type_tag_to_string(metadata->type.tag),
297
+ rb_gi_transfer_to_string(metadata->transfer));
298
+ }
299
+ argument->v_pointer = RSTRING_PTR(metadata->rb_arg);
300
+ length_metadata->out_arg->v_size = RSTRING_LEN(metadata->rb_arg);
301
+ } else {
302
+ argument->v_pointer = ALLOC(guint8 *);
303
+ metadata->free_func = rb_gi_arguments_out_free_array_c_uint8;
304
+ }
305
+ break;
306
+ case GI_TYPE_TAG_INT16:
307
+ case GI_TYPE_TAG_UINT16:
308
+ case GI_TYPE_TAG_INT32:
309
+ case GI_TYPE_TAG_UINT32:
310
+ case GI_TYPE_TAG_INT64:
311
+ case GI_TYPE_TAG_UINT64:
312
+ case GI_TYPE_TAG_FLOAT:
313
+ case GI_TYPE_TAG_DOUBLE:
314
+ case GI_TYPE_TAG_GTYPE:
315
+ rb_raise(rb_eNotImpError,
316
+ "TODO: [%s] %s allocates GIArgument(array)[c][%s]",
317
+ metadata->name,
318
+ rb_gi_direction_to_string(metadata->direction),
319
+ g_type_tag_to_string(metadata->element_type.tag));
320
+ break;
321
+ case GI_TYPE_TAG_UTF8:
322
+ argument->v_pointer = ALLOC(gchar **);
323
+ metadata->free_func = rb_gi_arguments_out_free_array_c_string;
324
+ break;
325
+ case GI_TYPE_TAG_FILENAME:
326
+ case GI_TYPE_TAG_ARRAY:
327
+ rb_raise(rb_eNotImpError,
328
+ "TODO: [%s] %s allocates GIArgument(array)[c][%s]",
329
+ metadata->name,
330
+ rb_gi_direction_to_string(metadata->direction),
331
+ g_type_tag_to_string(metadata->element_type.tag));
332
+ break;
333
+ case GI_TYPE_TAG_INTERFACE:
334
+ argument->v_pointer = ALLOC(gpointer *);
335
+ metadata->free_func = rb_gi_arguments_out_free_array_c_interface;
336
+ break;
337
+ case GI_TYPE_TAG_GLIST:
338
+ case GI_TYPE_TAG_GSLIST:
339
+ case GI_TYPE_TAG_GHASH:
340
+ case GI_TYPE_TAG_ERROR:
341
+ case GI_TYPE_TAG_UNICHAR:
342
+ rb_raise(rb_eNotImpError,
343
+ "TODO: [%s] %s allocates GIArgument(array)[c][%s]",
344
+ metadata->name,
345
+ rb_gi_direction_to_string(metadata->direction),
346
+ g_type_tag_to_string(metadata->element_type.tag));
347
+ break;
348
+ default:
349
+ g_assert_not_reached();
350
+ break;
351
+ }
352
+ }
353
+
354
+ static void
355
+ rb_gi_arguments_out_init_arg_array_array_interface(RBGIArguments *args,
356
+ RBGIArgMetadata *metadata)
357
+ {
358
+ GIArgument *argument = metadata->out_arg;
359
+ switch (metadata->element_type.interface_type) {
360
+ case GI_INFO_TYPE_INVALID:
361
+ case GI_INFO_TYPE_FUNCTION:
362
+ case GI_INFO_TYPE_CALLBACK:
363
+ rb_raise(rb_eNotImpError,
364
+ "TODO: [%s] %s allocates "
365
+ "GIArgument(array)[array][interface(%s)](%s)",
366
+ metadata->name,
367
+ rb_gi_direction_to_string(metadata->direction),
368
+ g_info_type_to_string(metadata->element_type.interface_type),
369
+ g_type_name(metadata->element_type.interface_gtype));
370
+ break;
371
+ case GI_INFO_TYPE_STRUCT:
372
+ {
373
+ gsize raw_struct_size;
374
+ guint struct_size;
375
+
376
+ raw_struct_size =
377
+ g_struct_info_get_size(metadata->element_type.interface_info);
378
+ struct_size = (guint)raw_struct_size;
379
+ argument->v_pointer = g_array_new(metadata->zero_terminated_p,
380
+ TRUE,
381
+ struct_size);
382
+ metadata->free_func =
383
+ rb_gi_arguments_out_free_array_array_interface_struct;
384
+ }
385
+ break;
386
+ case GI_INFO_TYPE_BOXED:
387
+ case GI_INFO_TYPE_ENUM:
388
+ case GI_INFO_TYPE_FLAGS:
389
+ case GI_INFO_TYPE_OBJECT:
390
+ case GI_INFO_TYPE_INTERFACE:
391
+ case GI_INFO_TYPE_CONSTANT:
392
+ case GI_INFO_TYPE_INVALID_0:
393
+ case GI_INFO_TYPE_UNION:
394
+ case GI_INFO_TYPE_VALUE:
395
+ case GI_INFO_TYPE_SIGNAL:
396
+ case GI_INFO_TYPE_VFUNC:
397
+ case GI_INFO_TYPE_PROPERTY:
398
+ case GI_INFO_TYPE_FIELD:
399
+ case GI_INFO_TYPE_ARG:
400
+ case GI_INFO_TYPE_TYPE:
401
+ case GI_INFO_TYPE_UNRESOLVED:
402
+ rb_raise(rb_eNotImpError,
403
+ "TODO: [%s] %s allocates "
404
+ "GIArgument(array)[array][interface(%s)](%s)",
405
+ metadata->name,
406
+ rb_gi_direction_to_string(metadata->direction),
407
+ g_info_type_to_string(metadata->element_type.interface_type),
408
+ g_type_name(metadata->element_type.interface_gtype));
409
+ break;
410
+ default:
411
+ g_assert_not_reached();
412
+ break;
413
+ }
414
+ }
415
+
416
+ static void
417
+ rb_gi_arguments_out_init_arg_array_array(RBGIArguments *args,
418
+ RBGIArgMetadata *metadata)
419
+ {
420
+ switch (metadata->element_type.tag) {
421
+ case GI_TYPE_TAG_VOID:
422
+ case GI_TYPE_TAG_BOOLEAN:
423
+ case GI_TYPE_TAG_INT8:
424
+ case GI_TYPE_TAG_UINT8:
425
+ case GI_TYPE_TAG_INT16:
426
+ case GI_TYPE_TAG_UINT16:
427
+ case GI_TYPE_TAG_INT32:
428
+ case GI_TYPE_TAG_UINT32:
429
+ case GI_TYPE_TAG_INT64:
430
+ case GI_TYPE_TAG_UINT64:
431
+ case GI_TYPE_TAG_FLOAT:
432
+ case GI_TYPE_TAG_DOUBLE:
433
+ case GI_TYPE_TAG_GTYPE:
434
+ case GI_TYPE_TAG_UTF8:
435
+ case GI_TYPE_TAG_FILENAME:
436
+ case GI_TYPE_TAG_ARRAY:
437
+ rb_raise(rb_eNotImpError,
438
+ "TODO: [%s] %s allocates GIArgument(array)[array][%s]",
439
+ metadata->name,
440
+ rb_gi_direction_to_string(metadata->direction),
441
+ g_type_tag_to_string(metadata->element_type.tag));
442
+ break;
443
+ case GI_TYPE_TAG_INTERFACE:
444
+ rb_gi_arguments_out_init_arg_array_array_interface(args, metadata);
445
+ break;
446
+ case GI_TYPE_TAG_GLIST:
447
+ case GI_TYPE_TAG_GSLIST:
448
+ case GI_TYPE_TAG_GHASH:
449
+ case GI_TYPE_TAG_ERROR:
450
+ case GI_TYPE_TAG_UNICHAR:
451
+ rb_raise(rb_eNotImpError,
452
+ "TODO: [%s] %s allocates GIArgument(array)[array][%s]",
453
+ metadata->name,
454
+ rb_gi_direction_to_string(metadata->direction),
455
+ g_type_tag_to_string(metadata->element_type.tag));
456
+ break;
457
+ default:
458
+ g_assert_not_reached();
459
+ break;
460
+ }
461
+ }
462
+
463
+ static void
464
+ rb_gi_arguments_out_init_arg_array(RBGIArguments *args,
465
+ RBGIArgMetadata *metadata)
466
+ {
467
+ switch (metadata->array_type) {
468
+ case GI_ARRAY_TYPE_C:
469
+ rb_gi_arguments_out_init_arg_array_c(args, metadata);
470
+ break;
471
+ case GI_ARRAY_TYPE_ARRAY:
472
+ rb_gi_arguments_out_init_arg_array_array(args, metadata);
473
+ break;
474
+ case GI_ARRAY_TYPE_PTR_ARRAY:
475
+ rb_raise(rb_eNotImpError,
476
+ "TODO: [%s] %s allocates GIArgument(array)[ptr-array][%s]",
477
+ metadata->name,
478
+ rb_gi_direction_to_string(metadata->direction),
479
+ g_type_tag_to_string(metadata->element_type.tag));
480
+ break;
481
+ case GI_ARRAY_TYPE_BYTE_ARRAY:
482
+ rb_raise(rb_eNotImpError,
483
+ "TODO: [%s] %s allocates GIArgument(array)[byte-array][%s]",
484
+ metadata->name,
485
+ rb_gi_direction_to_string(metadata->direction),
486
+ g_type_tag_to_string(metadata->element_type.tag));
487
+ break;
488
+ default:
489
+ g_assert_not_reached();
490
+ break;
491
+ }
492
+ }
493
+
494
+ static void
495
+ rb_gi_arguments_out_init_arg_interface(RBGIArguments *args,
496
+ RBGIArgMetadata *metadata)
497
+ {
498
+ GIArgument *argument = metadata->out_arg;
499
+ switch (metadata->type.interface_type) {
500
+ case GI_INFO_TYPE_INVALID:
501
+ case GI_INFO_TYPE_FUNCTION:
502
+ case GI_INFO_TYPE_CALLBACK:
503
+ rb_raise(rb_eNotImpError,
504
+ "TODO: allocates GIArgument(interface)[%s] for output",
505
+ g_info_type_to_string(metadata->type.interface_type));
506
+ break;
507
+ case GI_INFO_TYPE_STRUCT:
508
+ {
509
+ gsize struct_size;
510
+
511
+ /* Should we care gtype?
512
+ Related: rb_gi_arguments_out_arg_clear_interface() */
513
+ struct_size = g_struct_info_get_size(metadata->type.interface_info);
514
+ argument->v_pointer = xmalloc(struct_size);
515
+ memset(argument->v_pointer, 0, struct_size);
516
+ metadata->free_func = rb_gi_arguments_out_free_interface_struct;
517
+ }
518
+ break;
519
+ case GI_INFO_TYPE_BOXED:
520
+ rb_raise(rb_eNotImpError,
521
+ "TODO: allocates GIArgument(interface)[%s] for output",
522
+ g_info_type_to_string(metadata->type.interface_type));
523
+ break;
524
+ case GI_INFO_TYPE_ENUM:
525
+ {
526
+ gint *pointer = ALLOC(gint);
527
+ *pointer = 0;
528
+ argument->v_pointer = pointer;
529
+ metadata->free_func = rb_gi_arguments_out_free_immediate_value;
530
+ }
531
+ break;
532
+ case GI_INFO_TYPE_FLAGS:
533
+ {
534
+ guint *pointer = ALLOC(guint);
535
+ *pointer = 0;
536
+ argument->v_pointer = pointer;
537
+ metadata->free_func = rb_gi_arguments_out_free_immediate_value;
538
+ }
539
+ break;
540
+ case GI_INFO_TYPE_OBJECT:
541
+ case GI_INFO_TYPE_INTERFACE:
542
+ {
543
+ gpointer *pointer = ALLOC(gpointer);
544
+ *pointer = NULL;
545
+ argument->v_pointer = pointer;
546
+ metadata->free_func = rb_gi_arguments_out_free_interface_object;
547
+ }
548
+ break;
549
+ case GI_INFO_TYPE_CONSTANT:
550
+ case GI_INFO_TYPE_INVALID_0:
551
+ case GI_INFO_TYPE_UNION:
552
+ case GI_INFO_TYPE_VALUE:
553
+ case GI_INFO_TYPE_SIGNAL:
554
+ case GI_INFO_TYPE_VFUNC:
555
+ case GI_INFO_TYPE_PROPERTY:
556
+ case GI_INFO_TYPE_FIELD:
557
+ case GI_INFO_TYPE_ARG:
558
+ case GI_INFO_TYPE_TYPE:
559
+ case GI_INFO_TYPE_UNRESOLVED:
560
+ rb_raise(rb_eNotImpError,
561
+ "TODO: [%s] %s allocates GIArgument(interface)[%s]",
562
+ metadata->name,
563
+ rb_gi_direction_to_string(metadata->direction),
564
+ g_info_type_to_string(metadata->type.interface_type));
565
+ break;
566
+ default:
567
+ g_assert_not_reached();
568
+ break;
569
+ }
570
+ }
571
+
572
+ static void
573
+ rb_gi_arguments_out_init_arg(RBGIArguments *args,
574
+ RBGIArgMetadata *metadata)
575
+ {
576
+ GIArgument *argument = metadata->out_arg;
577
+
578
+ if (metadata->array_length_p &&
579
+ metadata->array_metadata &&
580
+ metadata->array_metadata->output_buffer_p) {
581
+ return;
582
+ }
583
+
584
+ memset(argument, 0, sizeof(GIArgument));
585
+ switch (metadata->type.tag) {
586
+ case GI_TYPE_TAG_VOID:
587
+ if (metadata->pointer_p) {
588
+ gpointer *pointer = ALLOC(gpointer);
589
+ *pointer = NULL;
590
+ argument->v_pointer = pointer;
591
+ metadata->free_func = rb_gi_arguments_out_free_immediate_value;
592
+ }
593
+ break;
594
+ case GI_TYPE_TAG_BOOLEAN:
595
+ {
596
+ gboolean *pointer = ALLOC(gboolean);
597
+ *pointer = FALSE;
598
+ argument->v_pointer = pointer;
599
+ metadata->free_func = rb_gi_arguments_out_free_immediate_value;
600
+ }
601
+ break;
602
+ case GI_TYPE_TAG_INT8:
603
+ {
604
+ gint8 *pointer = ALLOC(gint8);
605
+ *pointer = 0;
606
+ argument->v_pointer = pointer;
607
+ metadata->free_func = rb_gi_arguments_out_free_immediate_value;
608
+ }
609
+ break;
610
+ case GI_TYPE_TAG_UINT8:
611
+ {
612
+ guint8 *pointer = ALLOC(guint8);
613
+ *pointer = 0;
614
+ argument->v_pointer = pointer;
615
+ metadata->free_func = rb_gi_arguments_out_free_immediate_value;
616
+ }
617
+ break;
618
+ case GI_TYPE_TAG_INT16:
619
+ {
620
+ gint16 *pointer = ALLOC(gint16);
621
+ *pointer = 0;
622
+ argument->v_pointer = pointer;
623
+ metadata->free_func = rb_gi_arguments_out_free_immediate_value;
624
+ }
625
+ break;
626
+ case GI_TYPE_TAG_UINT16:
627
+ {
628
+ guint16 *pointer = ALLOC(guint16);
629
+ *pointer = 0;
630
+ argument->v_pointer = pointer;
631
+ metadata->free_func = rb_gi_arguments_out_free_immediate_value;
632
+ }
633
+ break;
634
+ case GI_TYPE_TAG_INT32:
635
+ {
636
+ gint32 *pointer = ALLOC(gint32);
637
+ *pointer = 0;
638
+ argument->v_pointer = pointer;
639
+ metadata->free_func = rb_gi_arguments_out_free_immediate_value;
640
+ }
641
+ break;
642
+ case GI_TYPE_TAG_UINT32:
643
+ {
644
+ guint32 *pointer = ALLOC(guint32);
645
+ *pointer = 0;
646
+ argument->v_pointer = pointer;
647
+ metadata->free_func = rb_gi_arguments_out_free_immediate_value;
648
+ }
649
+ break;
650
+ case GI_TYPE_TAG_INT64:
651
+ {
652
+ gint64 *pointer = ALLOC(gint64);
653
+ *pointer = 0;
654
+ argument->v_pointer = pointer;
655
+ metadata->free_func = rb_gi_arguments_out_free_immediate_value;
656
+ }
657
+ break;
658
+ case GI_TYPE_TAG_UINT64:
659
+ {
660
+ guint64 *pointer = ALLOC(guint64);
661
+ *pointer = 0;
662
+ argument->v_pointer = pointer;
663
+ metadata->free_func = rb_gi_arguments_out_free_immediate_value;
664
+ }
665
+ break;
666
+ case GI_TYPE_TAG_FLOAT:
667
+ {
668
+ gfloat *pointer = ALLOC(gfloat);
669
+ *pointer = 0.0;
670
+ argument->v_pointer = pointer;
671
+ metadata->free_func = rb_gi_arguments_out_free_immediate_value;
672
+ }
673
+ break;
674
+ case GI_TYPE_TAG_DOUBLE:
675
+ {
676
+ gdouble *pointer = ALLOC(gdouble);
677
+ *pointer = 0.0;
678
+ argument->v_pointer = pointer;
679
+ metadata->free_func = rb_gi_arguments_out_free_immediate_value;
680
+ }
681
+ break;
682
+ case GI_TYPE_TAG_GTYPE:
683
+ {
684
+ GType *pointer = ALLOC(GType);
685
+ *pointer = G_TYPE_INVALID;
686
+ argument->v_pointer = pointer;
687
+ metadata->free_func = rb_gi_arguments_out_free_immediate_value;
688
+ }
689
+ break;
690
+ case GI_TYPE_TAG_UTF8:
691
+ case GI_TYPE_TAG_FILENAME:
692
+ {
693
+ gchar **pointer = ALLOC(gchar *);
694
+ *pointer = NULL;
695
+ argument->v_pointer = pointer;
696
+ metadata->free_func = rb_gi_arguments_out_free_string;
697
+ }
698
+ break;
699
+ case GI_TYPE_TAG_ARRAY:
700
+ rb_gi_arguments_out_init_arg_array(args, metadata);
701
+ break;
702
+ case GI_TYPE_TAG_INTERFACE:
703
+ rb_gi_arguments_out_init_arg_interface(args, metadata);
704
+ break;
705
+ case GI_TYPE_TAG_GLIST:
706
+ case GI_TYPE_TAG_GSLIST:
707
+ {
708
+ gpointer *pointer = ALLOC(gpointer);
709
+ *pointer = NULL;
710
+ argument->v_pointer = pointer;
711
+ metadata->free_func = rb_gi_arguments_out_free_list;
712
+ }
713
+ break;
714
+ case GI_TYPE_TAG_GHASH:
715
+ {
716
+ gpointer *pointer = ALLOC(gpointer);
717
+ *pointer = NULL;
718
+ argument->v_pointer = pointer;
719
+ metadata->free_func = rb_gi_arguments_out_free_hash;
720
+ }
721
+ break;
722
+ case GI_TYPE_TAG_ERROR:
723
+ {
724
+ GError **pointer = ALLOC(GError *);
725
+ *pointer = NULL;
726
+ argument->v_pointer = pointer;
727
+ metadata->free_func = rb_gi_arguments_out_free_error;
728
+ }
729
+ break;
730
+ case GI_TYPE_TAG_UNICHAR:
731
+ {
732
+ gunichar *pointer = ALLOC(gunichar);
733
+ *pointer = 0;
734
+ argument->v_pointer = pointer;
735
+ metadata->free_func = rb_gi_arguments_out_free_immediate_value;
736
+ }
737
+ break;
738
+ default:
739
+ g_assert_not_reached();
740
+ break;
741
+ }
742
+ }
743
+
744
+ void
745
+ rb_gi_arguments_out_init(RBGIArguments *args)
746
+ {
747
+ guint i;
748
+
749
+ for (i = 0; i < args->metadata->len; i++) {
750
+ RBGIArgMetadata *metadata;
751
+
752
+ metadata = g_ptr_array_index(args->metadata, i);
753
+ if (metadata->direction != GI_DIRECTION_OUT) {
754
+ continue;
755
+ }
756
+
757
+ if (args->rb_mode_p) {
758
+ rb_gi_arguments_out_init_arg(args, metadata);
759
+ } else {
760
+ GIArgument *argument = &(g_array_index(args->out_args,
761
+ GIArgument,
762
+ metadata->out_arg_index));
763
+ argument->v_pointer = *((gpointer *)(args->raw_args[i]));
764
+ }
765
+ }
766
+ }
767
+
768
+ void
769
+ rb_gi_arguments_out_clear(RBGIArguments *args)
770
+ {
771
+ guint i;
772
+
773
+ for (i = 0; i < args->metadata->len; i++) {
774
+ RBGIArgMetadata *metadata;
775
+
776
+ metadata = g_ptr_array_index(args->metadata, i);
777
+ if (metadata->direction != GI_DIRECTION_OUT) {
778
+ continue;
779
+ }
780
+
781
+ if (metadata->free_func) {
782
+ metadata->free_func(args, metadata, metadata->free_func_data);
783
+ }
784
+ }
785
+ }
786
+
787
+ static VALUE
788
+ rb_gi_arguments_out_to_ruby_arg(RBGIArguments *args,
789
+ RBGIArgMetadata *metadata,
790
+ GIArgument *argument)
791
+ {
792
+ /* TODO */
793
+ if (metadata->output_buffer_p) {
794
+ return metadata->rb_arg;
795
+ }
796
+
797
+ GIArgument normalized_argument;
798
+ gboolean duplicate = FALSE;
799
+
800
+ memset(&normalized_argument, 0, sizeof(GIArgument));
801
+ switch (metadata->type.tag) {
802
+ case GI_TYPE_TAG_VOID:
803
+ if (metadata->pointer_p) {
804
+ normalized_argument.v_pointer = *((gpointer *)(argument->v_pointer));
805
+ }
806
+ break;
807
+ case GI_TYPE_TAG_BOOLEAN:
808
+ normalized_argument.v_boolean = *((gboolean *)(argument->v_pointer));
809
+ break;
810
+ case GI_TYPE_TAG_INT8:
811
+ normalized_argument.v_int8 = *((gint8 *)(argument->v_pointer));
812
+ break;
813
+ case GI_TYPE_TAG_UINT8:
814
+ normalized_argument.v_uint8 = *((guint8 *)(argument->v_pointer));
815
+ break;
816
+ case GI_TYPE_TAG_INT16:
817
+ normalized_argument.v_int16 = *((gint16 *)(argument->v_pointer));
818
+ break;
819
+ case GI_TYPE_TAG_UINT16:
820
+ normalized_argument.v_uint16 = *((guint16 *)(argument->v_pointer));
821
+ break;
822
+ case GI_TYPE_TAG_INT32:
823
+ normalized_argument.v_int32 = *((gint32 *)(argument->v_pointer));
824
+ break;
825
+ case GI_TYPE_TAG_UINT32:
826
+ normalized_argument.v_uint32 = *((guint32 *)(argument->v_pointer));
827
+ break;
828
+ case GI_TYPE_TAG_INT64:
829
+ normalized_argument.v_int64 = *((gint64 *)(argument->v_pointer));
830
+ break;
831
+ case GI_TYPE_TAG_UINT64:
832
+ normalized_argument.v_uint64 = *((guint64 *)(argument->v_pointer));
833
+ break;
834
+ case GI_TYPE_TAG_FLOAT:
835
+ normalized_argument.v_float = *((gfloat *)(argument->v_pointer));
836
+ break;
837
+ case GI_TYPE_TAG_DOUBLE:
838
+ normalized_argument.v_double = *((gdouble *)(argument->v_pointer));
839
+ break;
840
+ case GI_TYPE_TAG_GTYPE:
841
+ normalized_argument.v_size = *((GType *)(argument->v_pointer));
842
+ break;
843
+ case GI_TYPE_TAG_UTF8:
844
+ case GI_TYPE_TAG_FILENAME:
845
+ normalized_argument.v_string = *((gchar **)(argument->v_pointer));
846
+ break;
847
+ case GI_TYPE_TAG_ARRAY:
848
+ case GI_TYPE_TAG_INTERFACE:
849
+ case GI_TYPE_TAG_GLIST:
850
+ case GI_TYPE_TAG_GSLIST:
851
+ case GI_TYPE_TAG_GHASH:
852
+ if (metadata->caller_allocates_p) {
853
+ duplicate = TRUE;
854
+ normalized_argument.v_pointer = argument->v_pointer;
855
+ } else {
856
+ normalized_argument.v_pointer = *((gpointer *)(argument->v_pointer));
857
+ }
858
+ break;
859
+ case GI_TYPE_TAG_ERROR:
860
+ normalized_argument.v_pointer = *((GError **)(argument->v_pointer));
861
+ break;
862
+ case GI_TYPE_TAG_UNICHAR:
863
+ normalized_argument.v_uint32 = *((guint32 *)(argument->v_pointer));
864
+ break;
865
+ default:
866
+ g_assert_not_reached();
867
+ break;
868
+ }
869
+
870
+ return rb_gi_argument_to_ruby(&normalized_argument,
871
+ duplicate,
872
+ metadata->type.info,
873
+ args->in_args,
874
+ args->out_args,
875
+ args->metadata);
876
+ }
877
+
878
+ VALUE
879
+ rb_gi_arguments_out_to_ruby(RBGIArguments *args)
880
+ {
881
+ gint i, n_args;
882
+ VALUE rb_out_args;
883
+
884
+ rb_out_args = rb_ary_new();
885
+ n_args = g_callable_info_get_n_args(args->info);
886
+ for (i = 0; i < n_args; i++) {
887
+ RBGIArgMetadata *metadata;
888
+ GIArgument *argument = NULL;
889
+ VALUE rb_argument;
890
+
891
+ metadata = g_ptr_array_index(args->metadata, i);
892
+ if (metadata->array_length_p) {
893
+ continue;
894
+ }
895
+
896
+ switch (metadata->direction) {
897
+ case GI_DIRECTION_IN:
898
+ break;
899
+ case GI_DIRECTION_OUT:
900
+ argument = &g_array_index(args->out_args,
901
+ GIArgument,
902
+ metadata->out_arg_index);
903
+ break;
904
+ case GI_DIRECTION_INOUT:
905
+ argument = &g_array_index(args->in_args,
906
+ GIArgument,
907
+ metadata->in_arg_index);
908
+ break;
909
+ default:
910
+ g_assert_not_reached();
911
+ break;
912
+ }
913
+
914
+ if (!argument) {
915
+ continue;
916
+ }
917
+
918
+ rb_argument = rb_gi_arguments_out_to_ruby_arg(args,
919
+ metadata,
920
+ argument);
921
+ rb_ary_push(rb_out_args, rb_argument);
922
+ }
923
+
924
+ if (RARRAY_LEN(rb_out_args) == 0) {
925
+ return Qnil;
926
+ } else {
927
+ return rb_out_args;
928
+ }
929
+ }