gobject-introspection 1.2.1 → 1.2.2

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 (34) hide show
  1. data/ext/gobject-introspection/depend +10 -0
  2. data/ext/gobject-introspection/rb-gi-arg-info.c +1 -1
  3. data/ext/gobject-introspection/rb-gi-argument.c +30 -12
  4. data/ext/gobject-introspection/rb-gi-base-info.c +1 -1
  5. data/ext/gobject-introspection/rb-gi-boxed-info.c +1 -1
  6. data/ext/gobject-introspection/rb-gi-callable-info.c +1 -1
  7. data/ext/gobject-introspection/rb-gi-callback-info.c +1 -1
  8. data/ext/gobject-introspection/rb-gi-constant-info.c +1 -1
  9. data/ext/gobject-introspection/rb-gi-constructor-info.c +1 -1
  10. data/ext/gobject-introspection/rb-gi-enum-info.c +1 -1
  11. data/ext/gobject-introspection/rb-gi-field-info.c +1 -1
  12. data/ext/gobject-introspection/rb-gi-flags-info.c +1 -1
  13. data/ext/gobject-introspection/rb-gi-function-info.c +122 -81
  14. data/ext/gobject-introspection/rb-gi-interface-info.c +1 -1
  15. data/ext/gobject-introspection/rb-gi-loader.c +9 -1
  16. data/ext/gobject-introspection/rb-gi-method-info.c +6 -2
  17. data/ext/gobject-introspection/rb-gi-object-info.c +1 -1
  18. data/ext/gobject-introspection/rb-gi-private.h +110 -0
  19. data/ext/gobject-introspection/rb-gi-property-info.c +1 -1
  20. data/ext/gobject-introspection/rb-gi-registered-type-info.c +1 -1
  21. data/ext/gobject-introspection/rb-gi-repository.c +1 -1
  22. data/ext/gobject-introspection/rb-gi-signal-info.c +1 -1
  23. data/ext/gobject-introspection/rb-gi-struct-info.c +1 -1
  24. data/ext/gobject-introspection/rb-gi-type-info.c +1 -1
  25. data/ext/gobject-introspection/rb-gi-type-tag.c +1 -1
  26. data/ext/gobject-introspection/rb-gi-union-info.c +1 -1
  27. data/ext/gobject-introspection/rb-gi-unresolved-info.c +1 -1
  28. data/ext/gobject-introspection/rb-gi-value-info.c +1 -1
  29. data/ext/gobject-introspection/rb-gi-vfunc-info.c +1 -1
  30. data/ext/gobject-introspection/rb-gobject-introspection.c +1 -1
  31. data/ext/gobject-introspection/rb-gobject-introspection.h +30 -81
  32. data/lib/gobject-introspection/callable-info.rb +38 -2
  33. data/lib/gobject-introspection/loader.rb +81 -15
  34. metadata +92 -108
@@ -0,0 +1,10 @@
1
+ install-so: install-headers
2
+ install-headers:
3
+ $(INSTALL_DATA) $(srcdir)/rb-gobject-introspection.h $(RUBYARCHDIR)
4
+
5
+ install: install-pc
6
+ install-pc:
7
+ if test -n "$(pkgconfigdir)"; then \
8
+ $(MAKEDIRS) $(pkgconfigdir); \
9
+ $(INSTALL_DATA) ruby-gobject-introspection.pc $(pkgconfigdir);\
10
+ fi
@@ -18,7 +18,7 @@
18
18
  * MA 02110-1301 USA
19
19
  */
20
20
 
21
- #include "rb-gobject-introspection.h"
21
+ #include "rb-gi-private.h"
22
22
 
23
23
  #define RG_TARGET_NAMESPACE rb_cGIArgInfo
24
24
  #define SELF(self) (RVAL2GI_ARG_INFO(self))
@@ -18,7 +18,7 @@
18
18
  * MA 02110-1301 USA
19
19
  */
20
20
 
21
- #include "rb-gobject-introspection.h"
21
+ #include "rb-gi-private.h"
22
22
 
23
23
  static VALUE rb_cGLibValue = Qnil;
24
24
 
@@ -121,10 +121,18 @@ interface_to_ruby(GIArgument *argument, GITypeInfo *type_info)
121
121
  "TODO: GIArgument(interface)[boxed] -> Ruby");
122
122
  break;
123
123
  case GI_INFO_TYPE_ENUM:
124
- rb_interface = GENUM2RVAL(argument->v_int32, gtype);
124
+ if (gtype == G_TYPE_NONE) {
125
+ rb_interface = INT2NUM(argument->v_int32);
126
+ } else {
127
+ rb_interface = GENUM2RVAL(argument->v_int32, gtype);
128
+ }
125
129
  break;
126
130
  case GI_INFO_TYPE_FLAGS:
127
- rb_interface = GFLAGS2RVAL(argument->v_int32, gtype);
131
+ if (gtype == G_TYPE_NONE) {
132
+ rb_interface = INT2NUM(argument->v_int32);
133
+ } else {
134
+ rb_interface = GFLAGS2RVAL(argument->v_int32, gtype);
135
+ }
128
136
  break;
129
137
  case GI_INFO_TYPE_OBJECT:
130
138
  rb_interface = GOBJ2RVAL(argument->v_pointer);
@@ -250,7 +258,7 @@ rb_gi_argument_to_ruby(GIArgument *argument, GITypeInfo *type_info)
250
258
  rb_raise(rb_eNotImpError, "TODO: GIArgument(unichar) -> Ruby");
251
259
  break;
252
260
  case GI_TYPE_TAG_ERROR:
253
- RG_RAISE_ERROR(argument->v_pointer);
261
+ rb_argument = GERROR2RVAL(argument->v_pointer);
254
262
  break;
255
263
  case GI_TYPE_TAG_UNICHAR:
256
264
  rb_raise(rb_eNotImpError,
@@ -574,10 +582,18 @@ rb_gi_argument_from_ruby_interface(GIArgument *argument, GITypeInfo *type_info,
574
582
  g_base_info_get_name(interface_info));
575
583
  break;
576
584
  case GI_INFO_TYPE_ENUM:
577
- argument->v_int32 = RVAL2GENUM(rb_argument, gtype);
585
+ if (gtype == G_TYPE_NONE) {
586
+ argument->v_int32 = NUM2INT(rb_argument);
587
+ } else {
588
+ argument->v_int32 = RVAL2GENUM(rb_argument, gtype);
589
+ }
578
590
  break;
579
591
  case GI_INFO_TYPE_FLAGS:
580
- argument->v_int32 = RVAL2GFLAGS(rb_argument, gtype);
592
+ if (gtype == G_TYPE_NONE) {
593
+ argument->v_int32 = NUM2INT(rb_argument);
594
+ } else {
595
+ argument->v_int32 = RVAL2GFLAGS(rb_argument, gtype);
596
+ }
581
597
  break;
582
598
  case GI_INFO_TYPE_OBJECT:
583
599
  case GI_INFO_TYPE_INTERFACE:
@@ -828,17 +844,19 @@ rb_gi_in_argument_free_interface(GIArgument *argument, GITypeInfo *type_info)
828
844
  {
829
845
  GIBaseInfo *interface_info;
830
846
  GIInfoType interface_type;
831
- GType gtype;
832
847
 
833
848
  interface_info = g_type_info_get_interface(type_info);
834
849
  interface_type = g_base_info_get_type(interface_info);
835
850
 
836
- gtype = g_registered_type_info_get_g_type(interface_info);
851
+ if (interface_type == GI_INFO_TYPE_STRUCT) {
852
+ GType gtype;
853
+ gtype = g_registered_type_info_get_g_type(interface_info);
837
854
 
838
- if (interface_type == GI_INFO_TYPE_STRUCT && gtype == G_TYPE_VALUE) {
839
- GValue *gvalue = argument->v_pointer;
840
- g_value_unset(gvalue);
841
- xfree(argument->v_pointer);
855
+ if (gtype == G_TYPE_VALUE) {
856
+ GValue *gvalue = argument->v_pointer;
857
+ g_value_unset(gvalue);
858
+ xfree(argument->v_pointer);
859
+ }
842
860
  }
843
861
 
844
862
  g_base_info_unref(interface_info);
@@ -18,7 +18,7 @@
18
18
  * MA 02110-1301 USA
19
19
  */
20
20
 
21
- #include "rb-gobject-introspection.h"
21
+ #include "rb-gi-private.h"
22
22
 
23
23
  #define RG_TARGET_NAMESPACE rb_cGIBaseInfo
24
24
  #define SELF(self) RVAL2GI_BASE_INFO(self)
@@ -18,7 +18,7 @@
18
18
  * MA 02110-1301 USA
19
19
  */
20
20
 
21
- #include "rb-gobject-introspection.h"
21
+ #include "rb-gi-private.h"
22
22
 
23
23
  #define RG_TARGET_NAMESPACE rb_cGIBoxedInfo
24
24
  #define SELF(self) (RVAL2GI_BOXED_INFO(self))
@@ -18,7 +18,7 @@
18
18
  * MA 02110-1301 USA
19
19
  */
20
20
 
21
- #include "rb-gobject-introspection.h"
21
+ #include "rb-gi-private.h"
22
22
 
23
23
  #define RG_TARGET_NAMESPACE rb_cGICallableInfo
24
24
  #define SELF(self) ((GICallableInfo *)(RVAL2GI_BASE_INFO(self)))
@@ -18,7 +18,7 @@
18
18
  * MA 02110-1301 USA
19
19
  */
20
20
 
21
- #include "rb-gobject-introspection.h"
21
+ #include "rb-gi-private.h"
22
22
 
23
23
  #define RG_TARGET_NAMESPACE rb_cGICallbackInfo
24
24
  #define SELF(self) RVAL2GI_BASE_INFO(self)
@@ -18,7 +18,7 @@
18
18
  * MA 02110-1301 USA
19
19
  */
20
20
 
21
- #include "rb-gobject-introspection.h"
21
+ #include "rb-gi-private.h"
22
22
 
23
23
  #define RG_TARGET_NAMESPACE rb_cGIConstantInfo
24
24
  #define SELF(self) (RVAL2GI_CONSTANT_INFO(self))
@@ -18,7 +18,7 @@
18
18
  * MA 02110-1301 USA
19
19
  */
20
20
 
21
- #include "rb-gobject-introspection.h"
21
+ #include "rb-gi-private.h"
22
22
 
23
23
  #define RG_TARGET_NAMESPACE rb_cGIConstructorInfo
24
24
  #define SELF(self) RVAL2GI_FUNCTION_INFO(self)
@@ -18,7 +18,7 @@
18
18
  * MA 02110-1301 USA
19
19
  */
20
20
 
21
- #include "rb-gobject-introspection.h"
21
+ #include "rb-gi-private.h"
22
22
 
23
23
  #define RG_TARGET_NAMESPACE rb_cGIEnumInfo
24
24
  #define SELF(self) (RVAL2GI_ENUM_INFO(self))
@@ -18,7 +18,7 @@
18
18
  * MA 02110-1301 USA
19
19
  */
20
20
 
21
- #include "rb-gobject-introspection.h"
21
+ #include "rb-gi-private.h"
22
22
 
23
23
  #define RG_TARGET_NAMESPACE rb_cGIFieldInfo
24
24
  #define SELF(self) (RVAL2GI_FIELD_INFO(self))
@@ -18,7 +18,7 @@
18
18
  * MA 02110-1301 USA
19
19
  */
20
20
 
21
- #include "rb-gobject-introspection.h"
21
+ #include "rb-gi-private.h"
22
22
 
23
23
  #define RG_TARGET_NAMESPACE rb_cGIFlagsInfo
24
24
 
@@ -18,13 +18,15 @@
18
18
  * MA 02110-1301 USA
19
19
  */
20
20
 
21
- #include "rb-gobject-introspection.h"
21
+ #include "rb-gi-private.h"
22
22
 
23
23
  #define RG_TARGET_NAMESPACE rb_cGIFunctionInfo
24
24
  #define SELF(self) RVAL2GI_FUNCTION_INFO(self)
25
25
 
26
26
  static VALUE RG_TARGET_NAMESPACE;
27
+ static VALUE rb_cGLibError;
27
28
  static const char *callbacks_key = "gi_callbacks";
29
+ static GPtrArray *callback_finders;
28
30
 
29
31
  GType
30
32
  gi_function_info_get_type(void)
@@ -74,23 +76,6 @@ rg_vfunc(VALUE self)
74
76
  return GI_BASE_INFO2RVAL(g_function_info_get_vfunc(info));
75
77
  }
76
78
 
77
- typedef struct
78
- {
79
- GIArgInfo arg_info;
80
- GIScopeType scope_type;
81
- GIDirection direction;
82
- gboolean callback_p;
83
- gboolean closure_p;
84
- gboolean destroy_p;
85
- gboolean inout_argv_p;
86
- gint in_arg_index;
87
- gint closure_in_arg_index;
88
- gint destroy_in_arg_index;
89
- gint rb_arg_index;
90
- gint out_arg_index;
91
- gint inout_argc_arg_index;
92
- } ArgMetadata;
93
-
94
79
  static void
95
80
  allocate_arguments(GICallableInfo *info,
96
81
  GArray *in_args, GArray *out_args,
@@ -102,13 +87,13 @@ allocate_arguments(GICallableInfo *info,
102
87
  n_args = g_callable_info_get_n_args(info);
103
88
  for (i = 0; i < n_args; i++) {
104
89
  GIArgument argument;
105
- ArgMetadata *metadata;
90
+ RBGIArgMetadata *metadata;
106
91
  GIArgInfo *arg_info;
107
92
  GIDirection direction;
108
93
 
109
94
  memset(&argument, 0, sizeof(GIArgument));
110
95
 
111
- metadata = ALLOC(ArgMetadata);
96
+ metadata = ALLOC(RBGIArgMetadata);
112
97
  arg_info = &(metadata->arg_info);
113
98
  g_callable_info_load_arg(info, i, arg_info);
114
99
  metadata->scope_type = g_arg_info_get_scope(arg_info);
@@ -146,7 +131,7 @@ fill_metadata_inout_argv(GPtrArray *args_metadata)
146
131
  gint inout_argc_arg_index = -1;
147
132
 
148
133
  for (i = 0; i < args_metadata->len; i++) {
149
- ArgMetadata *metadata;
134
+ RBGIArgMetadata *metadata;
150
135
  GIArgInfo *arg_info;
151
136
  const gchar *name;
152
137
 
@@ -171,7 +156,7 @@ fill_metadata_callback(GPtrArray *args_metadata)
171
156
  guint i;
172
157
 
173
158
  for (i = 0; i < args_metadata->len; i++) {
174
- ArgMetadata *metadata;
159
+ RBGIArgMetadata *metadata;
175
160
  GIArgInfo *arg_info;
176
161
  gint closure_index;
177
162
  gint destroy_index;
@@ -184,7 +169,7 @@ fill_metadata_callback(GPtrArray *args_metadata)
184
169
  arg_info = &(metadata->arg_info);
185
170
  closure_index = g_arg_info_get_closure(arg_info);
186
171
  if (closure_index != -1) {
187
- ArgMetadata *closure_metadata;
172
+ RBGIArgMetadata *closure_metadata;
188
173
  closure_metadata = g_ptr_array_index(args_metadata, closure_index);
189
174
  closure_metadata->closure_p = TRUE;
190
175
  metadata->closure_in_arg_index = closure_metadata->in_arg_index;
@@ -193,7 +178,7 @@ fill_metadata_callback(GPtrArray *args_metadata)
193
178
 
194
179
  destroy_index = g_arg_info_get_destroy(arg_info);
195
180
  if (destroy_index != -1) {
196
- ArgMetadata *destroy_metadata;
181
+ RBGIArgMetadata *destroy_metadata;
197
182
  destroy_metadata = g_ptr_array_index(args_metadata, destroy_index);
198
183
  destroy_metadata->destroy_p = TRUE;
199
184
  metadata->destroy_in_arg_index = destroy_metadata->in_arg_index;
@@ -209,8 +194,67 @@ fill_metadata(GPtrArray *args_metadata)
209
194
  fill_metadata_callback(args_metadata);
210
195
  }
211
196
 
197
+ static void
198
+ callback_data_guard_from_gc(RBGICallbackData *callback_data)
199
+ {
200
+ VALUE rb_callbacks;
201
+
202
+ rb_callbacks = rb_iv_get(RG_TARGET_NAMESPACE, callbacks_key);
203
+ callback_data->rb_gc_guard_key = rb_class_new_instance(0, NULL, rb_cObject);
204
+ rb_hash_aset(rb_callbacks,
205
+ callback_data->rb_gc_guard_key,
206
+ callback_data->rb_callback);
207
+ }
208
+
209
+ static void
210
+ callback_data_unguard_from_gc(RBGICallbackData *callback_data)
211
+ {
212
+ VALUE rb_callbacks;
213
+
214
+ rb_callbacks = rb_iv_get(RG_TARGET_NAMESPACE, callbacks_key);
215
+ rb_hash_delete(rb_callbacks, callback_data->rb_gc_guard_key);
216
+ }
217
+
218
+ void
219
+ rb_gi_callback_data_free(RBGICallbackData *callback_data)
220
+ {
221
+ callback_data_unguard_from_gc(callback_data);
222
+ xfree(callback_data->metadata);
223
+ xfree(callback_data);
224
+ }
225
+
226
+ static void
227
+ destroy_notify(gpointer data)
228
+ {
229
+ RBGICallbackData *callback_data = data;
230
+ rb_gi_callback_data_free(callback_data);
231
+ }
232
+
233
+ static gpointer
234
+ find_callback_function(GIArgInfo *info)
235
+ {
236
+ guint i;
237
+ gpointer callback = NULL;
238
+
239
+ for (i = 0; i < callback_finders->len; i++) {
240
+ RBGICallbackFinderFunc finder = g_ptr_array_index(callback_finders, i);
241
+ callback = finder(info);
242
+ if (callback) {
243
+ break;
244
+ }
245
+ }
246
+
247
+ return callback;
248
+ }
249
+
250
+ void
251
+ rb_gi_callback_register_finder(RBGICallbackFinderFunc finder)
252
+ {
253
+ g_ptr_array_add(callback_finders, finder);
254
+ }
255
+
212
256
  static gboolean
213
- source_callback_p(GIArgInfo *info)
257
+ source_func_p(GIArgInfo *info)
214
258
  {
215
259
  GITypeInfo type_info;
216
260
  GIBaseInfo *interface_info;
@@ -253,84 +297,64 @@ source_callback_p(GIArgInfo *info)
253
297
  return TRUE;
254
298
  }
255
299
 
256
- typedef struct {
257
- ArgMetadata *metadata;
258
- VALUE rb_gc_guard_key;
259
- VALUE rb_callback;
260
- } CallbackData;
261
-
262
- static void
263
- callback_data_guard_from_gc(CallbackData *callback_data)
264
- {
265
- VALUE rb_callbacks;
266
-
267
- rb_callbacks = rb_iv_get(RG_TARGET_NAMESPACE, callbacks_key);
268
- callback_data->rb_gc_guard_key = rb_class_new_instance(0, NULL, rb_cObject);
269
- rb_hash_aset(rb_callbacks,
270
- callback_data->rb_gc_guard_key,
271
- callback_data->rb_callback);
272
- }
273
-
274
- static void
275
- callback_data_unguard_from_gc(CallbackData *callback_data)
276
- {
277
- VALUE rb_callbacks;
278
-
279
- rb_callbacks = rb_iv_get(RG_TARGET_NAMESPACE, callbacks_key);
280
- rb_hash_delete(rb_callbacks, callback_data->rb_gc_guard_key);
281
- }
282
-
283
- static void
284
- callback_data_free(CallbackData *callback_data)
285
- {
286
- callback_data_unguard_from_gc(callback_data);
287
- xfree(callback_data->metadata);
288
- xfree(callback_data);
289
- }
290
-
291
300
  static gboolean
292
- source_callback(gpointer user_data)
301
+ source_func_callback(gpointer user_data)
293
302
  {
294
- CallbackData *callback_data = user_data;
303
+ RBGICallbackData *callback_data = user_data;
295
304
  VALUE rb_keep;
296
305
  ID id_call;
297
306
 
298
307
  CONST_ID(id_call, "call");
299
308
  rb_keep = rb_funcall(callback_data->rb_callback, id_call, 0);
300
309
  if (callback_data->metadata->scope_type == GI_SCOPE_TYPE_ASYNC) {
301
- callback_data_free(callback_data);
310
+ rb_gi_callback_data_free(callback_data);
302
311
  }
303
312
  return RVAL2CBOOL(rb_keep);
304
313
  }
305
314
 
306
- static void
307
- destroy_notify(gpointer data)
315
+ static gpointer
316
+ source_func_callback_finder(GIArgInfo *arg_info)
308
317
  {
309
- CallbackData *callback_data = data;
310
- callback_data_free(callback_data);
318
+ if (!source_func_p(arg_info)) {
319
+ return NULL;
320
+ }
321
+ return source_func_callback;
311
322
  }
312
323
 
313
324
  static void
314
- in_callback_argument_from_ruby(ArgMetadata *metadata, VALUE *argv,
325
+ in_callback_argument_from_ruby(RBGIArgMetadata *metadata, VALUE *argv,
315
326
  GArray *in_args)
316
327
  {
328
+ gpointer callback;
329
+ GIArgInfo *arg_info;
317
330
  GIArgument *callback_argument;
318
331
 
319
- if (!source_callback_p(&(metadata->arg_info))) {
332
+ arg_info = &(metadata->arg_info);
333
+ callback = find_callback_function(arg_info);
334
+ if (!callback) {
335
+ GITypeInfo type_info;
336
+ GIBaseInfo *interface_info;
337
+ VALUE rb_type_name;
338
+ g_arg_info_load_type(arg_info, &type_info);
339
+ interface_info = g_type_info_get_interface(&type_info);
340
+ rb_type_name = CSTR2RVAL(g_base_info_get_name(interface_info));
341
+ g_base_info_unref(interface_info);
320
342
  rb_raise(rb_eNotImpError,
321
- "TODO: GSourceFunc callback is only supported.");
343
+ "TODO: <%s>(%s) callback is not supported yet.",
344
+ RVAL2CSTR(rb_type_name),
345
+ g_base_info_get_name(arg_info));
322
346
  }
323
347
 
324
348
  callback_argument = &(g_array_index(in_args,
325
349
  GIArgument,
326
350
  metadata->in_arg_index));
327
- callback_argument->v_pointer = source_callback;
351
+ callback_argument->v_pointer = callback;
328
352
 
329
353
  if (metadata->closure_in_arg_index != -1) {
330
- CallbackData *callback_data;
354
+ RBGICallbackData *callback_data;
331
355
  GIArgument *closure_argument;
332
356
 
333
- callback_data = ALLOC(CallbackData);
357
+ callback_data = ALLOC(RBGICallbackData);
334
358
  callback_data->metadata = metadata;
335
359
  callback_data->rb_callback = rb_block_proc();
336
360
  callback_data_guard_from_gc(callback_data);
@@ -350,7 +374,7 @@ in_callback_argument_from_ruby(ArgMetadata *metadata, VALUE *argv,
350
374
  }
351
375
 
352
376
  static void
353
- in_argument_from_ruby(ArgMetadata *metadata, VALUE *argv, GArray *in_args)
377
+ in_argument_from_ruby(RBGIArgMetadata *metadata, VALUE *argv, GArray *in_args)
354
378
  {
355
379
  if (metadata->rb_arg_index == -1) {
356
380
  return;
@@ -369,7 +393,7 @@ in_argument_from_ruby(ArgMetadata *metadata, VALUE *argv, GArray *in_args)
369
393
  }
370
394
 
371
395
  static void
372
- out_argument_from_ruby(ArgMetadata *metadata, GArray *out_args)
396
+ out_argument_from_ruby(RBGIArgMetadata *metadata, GArray *out_args)
373
397
  {
374
398
  GIArgument *argument;
375
399
 
@@ -380,7 +404,7 @@ out_argument_from_ruby(ArgMetadata *metadata, GArray *out_args)
380
404
  static void
381
405
  arg_metadata_free(gpointer data)
382
406
  {
383
- ArgMetadata *metadata = data;
407
+ RBGIArgMetadata *metadata = data;
384
408
  if (metadata->scope_type == GI_SCOPE_TYPE_ASYNC ||
385
409
  metadata->scope_type == GI_SCOPE_TYPE_NOTIFIED) {
386
410
  return;
@@ -403,7 +427,7 @@ arguments_from_ruby(GICallableInfo *info,
403
427
 
404
428
  n_args = g_callable_info_get_n_args(info);
405
429
  for (i = 0; i < n_args; i++) {
406
- ArgMetadata *metadata;
430
+ RBGIArgMetadata *metadata;
407
431
 
408
432
  metadata = g_ptr_array_index(args_metadata, i);
409
433
  if (metadata->in_arg_index != -1) {
@@ -415,7 +439,7 @@ arguments_from_ruby(GICallableInfo *info,
415
439
  }
416
440
 
417
441
  static VALUE
418
- inout_argv_argument_to_ruby(GArray *in_args, ArgMetadata *metadata)
442
+ inout_argv_argument_to_ruby(GArray *in_args, RBGIArgMetadata *metadata)
419
443
  {
420
444
  GIArgument *inout_argc_argument;
421
445
  GIArgument *inout_argv_argument;
@@ -447,7 +471,7 @@ out_arguments_to_ruby(GICallableInfo *callable_info,
447
471
  rb_out_args = rb_ary_new();
448
472
  n_args = g_callable_info_get_n_args(callable_info);
449
473
  for (i = 0; i < n_args; i++) {
450
- ArgMetadata *metadata;
474
+ RBGIArgMetadata *metadata;
451
475
  GIArgument *argument = NULL;
452
476
  VALUE rb_argument;
453
477
 
@@ -501,7 +525,7 @@ arguments_free(GArray *in_args, GArray *out_args, GPtrArray *args_metadata)
501
525
  guint i;
502
526
 
503
527
  for (i = 0; i < args_metadata->len; i++) {
504
- ArgMetadata *metadata;
528
+ RBGIArgMetadata *metadata;
505
529
  gint in_arg_index;
506
530
 
507
531
  metadata = g_ptr_array_index(args_metadata, i);
@@ -563,6 +587,14 @@ rb_gi_function_info_invoke_raw(GIFunctionInfo *info, GIArgument *receiver,
563
587
  RG_RAISE_ERROR(error);
564
588
  }
565
589
 
590
+ if (!NIL_P(rb_out_args) && RARRAY_LEN(rb_out_args) == 1) {
591
+ VALUE rb_out_arg;
592
+ rb_out_arg = RARRAY_PTR(rb_out_args)[0];
593
+ if (rb_obj_is_kind_of(rb_out_arg, rb_cGLibError)) {
594
+ rb_exc_raise(rb_out_arg);
595
+ }
596
+ }
597
+
566
598
  return rb_out_args;
567
599
  }
568
600
 
@@ -591,19 +623,28 @@ rg_invoke(int argc, VALUE *argv, VALUE self)
591
623
  if (g_type_info_get_tag(&return_value_info) != GI_TYPE_TAG_VOID) {
592
624
  rb_ary_unshift(rb_out_args, rb_return_value);
593
625
  }
594
- return rb_out_args;
626
+ if (RARRAY_LEN(rb_out_args) == 1) {
627
+ return RARRAY_PTR(rb_out_args)[0];
628
+ } else {
629
+ return rb_out_args;
630
+ }
595
631
  }
596
632
  }
597
633
 
598
634
  void
599
635
  rb_gi_function_info_init(VALUE rb_mGI, VALUE rb_cGICallableInfo)
600
636
  {
637
+ rb_cGLibError = rb_const_get(mGLib, rb_intern("Error"));
638
+
601
639
  RG_TARGET_NAMESPACE =
602
640
  G_DEF_CLASS_WITH_PARENT(GI_TYPE_FUNCTION_INFO, "FunctionInfo", rb_mGI,
603
641
  rb_cGICallableInfo);
604
642
 
605
643
  rb_iv_set(RG_TARGET_NAMESPACE, callbacks_key, rb_hash_new());
606
644
 
645
+ callback_finders = g_ptr_array_new();
646
+ rb_gi_callback_register_finder(source_func_callback_finder);
647
+
607
648
  RG_DEF_METHOD(symbol, 0);
608
649
  RG_DEF_METHOD(flags, 0);
609
650
  RG_DEF_METHOD(property, 0);