gobject-introspection 2.2.5-x64-mingw32 → 3.0.0-x64-mingw32

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 (108) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +3 -3
  3. data/ext/gobject-introspection/extconf.rb +1 -1
  4. data/ext/gobject-introspection/rb-gi-argument.c +2275 -708
  5. data/ext/gobject-introspection/rb-gi-constant-info.c +1 -1
  6. data/ext/gobject-introspection/rb-gi-constructor-info.c +2 -2
  7. data/ext/gobject-introspection/rb-gi-conversions.h +40 -36
  8. data/ext/gobject-introspection/rb-gi-field-info.c +32 -6
  9. data/ext/gobject-introspection/rb-gi-function-info.c +98 -63
  10. data/ext/gobject-introspection/rb-gi-loader.c +33 -1
  11. data/ext/gobject-introspection/rb-gi-method-info.c +3 -6
  12. data/ext/gobject-introspection/rb-gi-private.h +2 -1
  13. data/ext/gobject-introspection/rb-gi-repository.c +29 -29
  14. data/lib/2.0/gobject_introspection.so +0 -0
  15. data/lib/2.1/gobject_introspection.so +0 -0
  16. data/lib/2.2/gobject_introspection.so +0 -0
  17. data/lib/gobject-introspection.rb +1 -0
  18. data/lib/gobject-introspection/arg-info.rb +27 -0
  19. data/lib/gobject-introspection/callable-info.rb +3 -1
  20. data/lib/gobject-introspection/loader.rb +160 -31
  21. data/vendor/local/bin/g-ir-compiler.exe +0 -0
  22. data/vendor/local/bin/g-ir-generate.exe +0 -0
  23. data/vendor/local/bin/libgirepository-1.0-1.dll +0 -0
  24. data/vendor/local/include/gobject-introspection-1.0/girepository.h +4 -0
  25. data/vendor/local/include/gobject-introspection-1.0/giversionmacros.h +15 -1
  26. data/vendor/local/lib/girepository-1.0/GIRepository-2.0.typelib +0 -0
  27. data/vendor/local/lib/girepository-1.0/GLib-2.0.typelib +0 -0
  28. data/vendor/local/lib/girepository-1.0/GObject-2.0.typelib +0 -0
  29. data/vendor/local/lib/girepository-1.0/Gio-2.0.typelib +0 -0
  30. data/vendor/local/lib/gobject-introspection/giscanner/__init__.pyc +0 -0
  31. data/vendor/local/lib/gobject-introspection/giscanner/__init__.pyo +0 -0
  32. data/vendor/local/lib/gobject-introspection/giscanner/annotationmain.pyc +0 -0
  33. data/vendor/local/lib/gobject-introspection/giscanner/annotationmain.pyo +0 -0
  34. data/vendor/local/lib/gobject-introspection/giscanner/annotationparser.py +6 -1
  35. data/vendor/local/lib/gobject-introspection/giscanner/annotationparser.pyc +0 -0
  36. data/vendor/local/lib/gobject-introspection/giscanner/annotationparser.pyo +0 -0
  37. data/vendor/local/lib/gobject-introspection/giscanner/ast.py +3 -0
  38. data/vendor/local/lib/gobject-introspection/giscanner/ast.pyc +0 -0
  39. data/vendor/local/lib/gobject-introspection/giscanner/ast.pyo +0 -0
  40. data/vendor/local/lib/gobject-introspection/giscanner/cachestore.pyc +0 -0
  41. data/vendor/local/lib/gobject-introspection/giscanner/cachestore.pyo +0 -0
  42. data/vendor/local/lib/gobject-introspection/giscanner/ccompiler.pyc +0 -0
  43. data/vendor/local/lib/gobject-introspection/giscanner/ccompiler.pyo +0 -0
  44. data/vendor/local/lib/gobject-introspection/giscanner/codegen.pyc +0 -0
  45. data/vendor/local/lib/gobject-introspection/giscanner/codegen.pyo +0 -0
  46. data/vendor/local/lib/gobject-introspection/giscanner/collections/__init__.pyc +0 -0
  47. data/vendor/local/lib/gobject-introspection/giscanner/collections/__init__.pyo +0 -0
  48. data/vendor/local/lib/gobject-introspection/giscanner/collections/counter.pyc +0 -0
  49. data/vendor/local/lib/gobject-introspection/giscanner/collections/counter.pyo +0 -0
  50. data/vendor/local/lib/gobject-introspection/giscanner/collections/ordereddict.pyc +0 -0
  51. data/vendor/local/lib/gobject-introspection/giscanner/collections/ordereddict.pyo +0 -0
  52. data/vendor/local/lib/gobject-introspection/giscanner/docmain.pyc +0 -0
  53. data/vendor/local/lib/gobject-introspection/giscanner/docmain.pyo +0 -0
  54. data/vendor/local/lib/gobject-introspection/giscanner/docwriter.pyc +0 -0
  55. data/vendor/local/lib/gobject-introspection/giscanner/docwriter.pyo +0 -0
  56. data/vendor/local/lib/gobject-introspection/giscanner/dumper.pyc +0 -0
  57. data/vendor/local/lib/gobject-introspection/giscanner/dumper.pyo +0 -0
  58. data/vendor/local/lib/gobject-introspection/giscanner/gdumpparser.pyc +0 -0
  59. data/vendor/local/lib/gobject-introspection/giscanner/gdumpparser.pyo +0 -0
  60. data/vendor/local/lib/gobject-introspection/giscanner/girparser.py +19 -1
  61. data/vendor/local/lib/gobject-introspection/giscanner/girparser.pyc +0 -0
  62. data/vendor/local/lib/gobject-introspection/giscanner/girparser.pyo +0 -0
  63. data/vendor/local/lib/gobject-introspection/giscanner/girwriter.pyc +0 -0
  64. data/vendor/local/lib/gobject-introspection/giscanner/girwriter.pyo +0 -0
  65. data/vendor/local/lib/gobject-introspection/giscanner/introspectablepass.pyc +0 -0
  66. data/vendor/local/lib/gobject-introspection/giscanner/introspectablepass.pyo +0 -0
  67. data/vendor/local/lib/gobject-introspection/giscanner/libtoolimporter.pyc +0 -0
  68. data/vendor/local/lib/gobject-introspection/giscanner/libtoolimporter.pyo +0 -0
  69. data/vendor/local/lib/gobject-introspection/giscanner/maintransformer.py +7 -3
  70. data/vendor/local/lib/gobject-introspection/giscanner/maintransformer.pyc +0 -0
  71. data/vendor/local/lib/gobject-introspection/giscanner/maintransformer.pyo +0 -0
  72. data/vendor/local/lib/gobject-introspection/giscanner/message.pyc +0 -0
  73. data/vendor/local/lib/gobject-introspection/giscanner/message.pyo +0 -0
  74. data/vendor/local/lib/gobject-introspection/giscanner/scannermain.py +1 -1
  75. data/vendor/local/lib/gobject-introspection/giscanner/scannermain.pyc +0 -0
  76. data/vendor/local/lib/gobject-introspection/giscanner/scannermain.pyo +0 -0
  77. data/vendor/local/lib/gobject-introspection/giscanner/sectionparser.pyc +0 -0
  78. data/vendor/local/lib/gobject-introspection/giscanner/sectionparser.pyo +0 -0
  79. data/vendor/local/lib/gobject-introspection/giscanner/shlibs.pyc +0 -0
  80. data/vendor/local/lib/gobject-introspection/giscanner/shlibs.pyo +0 -0
  81. data/vendor/local/lib/gobject-introspection/giscanner/sourcescanner.py +8 -0
  82. data/vendor/local/lib/gobject-introspection/giscanner/sourcescanner.pyc +0 -0
  83. data/vendor/local/lib/gobject-introspection/giscanner/sourcescanner.pyo +0 -0
  84. data/vendor/local/lib/gobject-introspection/giscanner/testcodegen.pyc +0 -0
  85. data/vendor/local/lib/gobject-introspection/giscanner/testcodegen.pyo +0 -0
  86. data/vendor/local/lib/gobject-introspection/giscanner/transformer.pyc +0 -0
  87. data/vendor/local/lib/gobject-introspection/giscanner/transformer.pyo +0 -0
  88. data/vendor/local/lib/gobject-introspection/giscanner/utils.pyc +0 -0
  89. data/vendor/local/lib/gobject-introspection/giscanner/utils.pyo +0 -0
  90. data/vendor/local/lib/gobject-introspection/giscanner/xmlwriter.pyc +0 -0
  91. data/vendor/local/lib/gobject-introspection/giscanner/xmlwriter.pyo +0 -0
  92. data/vendor/local/lib/libgirepository-1.0.a +0 -0
  93. data/vendor/local/lib/libgirepository-1.0.dll.a +0 -0
  94. data/vendor/local/lib/libgirepository-1.0.la +3 -3
  95. data/vendor/local/lib/pkgconfig/gobject-introspection-1.0.pc +1 -1
  96. data/vendor/local/lib/pkgconfig/gobject-introspection-no-export-1.0.pc +1 -1
  97. data/vendor/local/share/gir-1.0/GIRepository-2.0.gir +44 -7
  98. data/vendor/local/share/gir-1.0/GLib-2.0.gir +518 -131
  99. data/vendor/local/share/gir-1.0/GObject-2.0.gir +1248 -475
  100. data/vendor/local/share/gir-1.0/Gio-2.0.gir +1849 -80
  101. data/vendor/local/share/gobject-introspection-1.0/tests/annotation.c +1 -1
  102. data/vendor/local/share/gobject-introspection-1.0/tests/gimarshallingtests.c +19 -16
  103. data/vendor/local/share/gobject-introspection-1.0/tests/gimarshallingtests.h +1 -1
  104. data/vendor/local/share/gobject-introspection-1.0/tests/regress.c +3 -0
  105. data/vendor/local/share/gobject-introspection-1.0/tests/regress.h +2 -2
  106. data/vendor/local/share/man/man1/g-ir-compiler.1 +1 -2
  107. data/vendor/local/share/man/man1/g-ir-generate.1 +2 -3
  108. metadata +5 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4d5b3d8c7d201a417808e74c8c9a4bcc6936e815
4
- data.tar.gz: cac1ac73f722ab3076b7a027a5af7f8f010aed61
3
+ metadata.gz: 0cba7460ffc26b7eeaa117b5e99fdc84504d6031
4
+ data.tar.gz: 8b6c2f25c364169488d3c6d8f67c8cdea6bb4252
5
5
  SHA512:
6
- metadata.gz: 6be50898f96c1999e0cfb2a440a161ceff0a9139f65c057d8d2e5f3e24142a686ca78cafd8b682ecf2d165d3c7859796a879fc53eff7b6de19a22a0f9d3e8426
7
- data.tar.gz: c6b206f11d7668906c1e9d1d1a65dd9666184fe3571abe12325d75e0e9798cb4156d91855a3e3ede5f158852b1e3e0e5854c53f0bb8197d0d7732cf4c8217032
6
+ metadata.gz: a31ae76d5f7040d4621eef1cca3f9db39823995b9c0c44b278eecfeb452355ea048ebf76c28a8ca94f550803c3b19fbc3562907a192de178b7d886b0e679f977
7
+ data.tar.gz: 27746526a10798bdbb5265a64ec661a148f21b1913b1532f8dd8ac84b957ad533e67a57bcb09447fe2a2ff0a3042ebfa4c483c39b13cb81d36964e94dbbea43b
data/Rakefile CHANGED
@@ -1,6 +1,6 @@
1
1
  # -*- ruby -*-
2
2
  #
3
- # Copyright (C) 2012-2014 Ruby-GNOME2 Project Team
3
+ # Copyright (C) 2012-2015 Ruby-GNOME2 Project Team
4
4
  #
5
5
  # This library is free software; you can redistribute it and/or
6
6
  # modify it under the terms of the GNU Lesser General Public
@@ -32,7 +32,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
32
32
  :name => "glib",
33
33
  :download_site => :gnome,
34
34
  :label => "GLib",
35
- :version => "2.42.1",
35
+ :version => "2.44.1",
36
36
  :compression_method => "xz",
37
37
  :windows => {
38
38
  :build => false,
@@ -47,7 +47,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
47
47
  :name => "gobject-introspection",
48
48
  :download_site => :gnome,
49
49
  :label => "gobject-introspection",
50
- :version => "1.42.0",
50
+ :version => "1.44.0",
51
51
  :compression_method => "xz",
52
52
  :windows => {
53
53
  :configure_args => [
@@ -58,7 +58,7 @@ setup_windows(module_name, base_dir)
58
58
 
59
59
  unless required_pkg_config_package(package_id,
60
60
  :debian => "libgirepository1.0-dev",
61
- :fedora => "gobject-introspection-devel",
61
+ :redhat => "gobject-introspection-devel",
62
62
  :homebrew => "gobject-introspection",
63
63
  :macports => "gobject-introspection")
64
64
  exit(false)
@@ -1,6 +1,6 @@
1
1
  /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright (C) 2012-2014 Ruby-GNOME2 Project Team
3
+ * Copyright (C) 2012-2015 Ruby-GNOME2 Project Team
4
4
  *
5
5
  * This library is free software; you can redistribute it and/or
6
6
  * modify it under the terms of the GNU Lesser General Public
@@ -22,12 +22,235 @@
22
22
 
23
23
  static VALUE rb_cGLibValue = Qnil;
24
24
 
25
+ static VALUE
26
+ interface_struct_to_ruby(gpointer object,
27
+ gboolean duplicate,
28
+ G_GNUC_UNUSED GITypeInfo *type_info,
29
+ GIBaseInfo *interface_info)
30
+ {
31
+ const char *namespace;
32
+ const char *name;
33
+ VALUE rb_module;
34
+ VALUE rb_class;
35
+ gpointer target_object = object;
36
+ RUBY_DATA_FUNC free_func = NULL;
37
+
38
+ namespace = g_base_info_get_namespace(interface_info);
39
+ name = g_base_info_get_name(interface_info);
40
+ rb_module = rb_const_get(rb_cObject, rb_intern(namespace));
41
+ rb_class = rb_const_get(rb_module, rb_intern(name));
42
+ if (duplicate) {
43
+ size_t object_size;
44
+ object_size = g_struct_info_get_size(interface_info);
45
+ target_object = xmalloc(object_size);
46
+ memcpy(target_object, object, object_size);
47
+ free_func = xfree;
48
+ }
49
+ return Data_Wrap_Struct(rb_class, NULL, free_func, target_object);
50
+ }
51
+
52
+ static gpointer
53
+ interface_struct_from_ruby(VALUE rb_object)
54
+ {
55
+ return DATA_PTR(rb_object);
56
+ }
57
+
58
+ static void
59
+ array_c_to_ruby_sized_interface(gconstpointer *elements,
60
+ gint64 n_elements,
61
+ GITypeInfo *element_type_info,
62
+ VALUE rb_array)
63
+ {
64
+ gint64 i;
65
+ GIBaseInfo *interface_info;
66
+ GIInfoType interface_type;
67
+ GType gtype;
68
+ const char *interface_name;
69
+
70
+ interface_info = g_type_info_get_interface(element_type_info);
71
+ interface_type = g_base_info_get_type(interface_info);
72
+ gtype = g_registered_type_info_get_g_type(interface_info);
73
+
74
+ switch (interface_type) {
75
+ case GI_INFO_TYPE_INVALID:
76
+ case GI_INFO_TYPE_FUNCTION:
77
+ case GI_INFO_TYPE_CALLBACK:
78
+ interface_name = g_info_type_to_string(interface_type);
79
+ g_base_info_unref(interface_info);
80
+ g_base_info_unref(element_type_info);
81
+ rb_raise(rb_eNotImpError,
82
+ "TODO: GIArgument(array)[c][interface(%s)](%s) -> Ruby",
83
+ interface_name,
84
+ g_type_name(gtype));
85
+ break;
86
+ case GI_INFO_TYPE_STRUCT:
87
+ if (gtype == G_TYPE_NONE) {
88
+ for (i = 0; i < n_elements; i++) {
89
+ rb_ary_push(rb_array,
90
+ interface_struct_to_ruby((gpointer)elements[i],
91
+ FALSE,
92
+ element_type_info,
93
+ interface_info));
94
+ }
95
+ g_base_info_unref(interface_info);
96
+ g_base_info_unref(element_type_info);
97
+ } else {
98
+ interface_name = g_info_type_to_string(interface_type);
99
+ g_base_info_unref(interface_info);
100
+ g_base_info_unref(element_type_info);
101
+ rb_raise(rb_eNotImpError,
102
+ "TODO: GIArgument(array)[c][interface(%s)](%s) -> Ruby",
103
+ interface_name,
104
+ g_type_name(gtype));
105
+ }
106
+ break;
107
+ case GI_INFO_TYPE_BOXED:
108
+ case GI_INFO_TYPE_ENUM:
109
+ case GI_INFO_TYPE_FLAGS:
110
+ interface_name = g_info_type_to_string(interface_type);
111
+ g_base_info_unref(interface_info);
112
+ g_base_info_unref(element_type_info);
113
+ rb_raise(rb_eNotImpError,
114
+ "TODO: GIArgument(array)[c][interface(%s)](%s) -> Ruby",
115
+ interface_name,
116
+ g_type_name(gtype));
117
+ break;
118
+ case GI_INFO_TYPE_OBJECT:
119
+ for (i = 0; i < n_elements; i++) {
120
+ rb_ary_push(rb_array, GOBJ2RVAL((GObject *)(elements[i])));
121
+ }
122
+ g_base_info_unref(interface_info);
123
+ g_base_info_unref(element_type_info);
124
+ break;
125
+ case GI_INFO_TYPE_INTERFACE:
126
+ case GI_INFO_TYPE_CONSTANT:
127
+ case GI_INFO_TYPE_INVALID_0:
128
+ case GI_INFO_TYPE_UNION:
129
+ case GI_INFO_TYPE_VALUE:
130
+ case GI_INFO_TYPE_SIGNAL:
131
+ case GI_INFO_TYPE_VFUNC:
132
+ case GI_INFO_TYPE_PROPERTY:
133
+ case GI_INFO_TYPE_FIELD:
134
+ case GI_INFO_TYPE_ARG:
135
+ case GI_INFO_TYPE_TYPE:
136
+ case GI_INFO_TYPE_UNRESOLVED:
137
+ interface_name = g_info_type_to_string(interface_type);
138
+ g_base_info_unref(interface_info);
139
+ g_base_info_unref(element_type_info);
140
+ rb_raise(rb_eNotImpError,
141
+ "TODO: GIArgument(array)[c][interface(%s)](%s) -> Ruby",
142
+ interface_name,
143
+ g_type_name(gtype));
144
+ break;
145
+ default:
146
+ g_base_info_unref(interface_info);
147
+ g_base_info_unref(element_type_info);
148
+ g_assert_not_reached();
149
+ break;
150
+ }
151
+ }
152
+
153
+ static void
154
+ array_c_to_ruby_sized(gconstpointer *elements,
155
+ gint64 n_elements,
156
+ GITypeInfo *type_info,
157
+ VALUE rb_array)
158
+ {
159
+ gint64 i;
160
+ GITypeInfo *element_type_info;
161
+ GITypeTag element_type_tag;
162
+
163
+ element_type_info = g_type_info_get_param_type(type_info, 0);
164
+ element_type_tag = g_type_info_get_tag(element_type_info);
165
+
166
+ switch (element_type_tag) {
167
+ case GI_TYPE_TAG_VOID:
168
+ case GI_TYPE_TAG_BOOLEAN:
169
+ case GI_TYPE_TAG_INT8:
170
+ g_base_info_unref(element_type_info);
171
+ rb_raise(rb_eNotImpError,
172
+ "TODO: GIArgument(array)[c][%s] -> Ruby",
173
+ g_type_tag_to_string(element_type_tag));
174
+ break;
175
+ case GI_TYPE_TAG_UINT8:
176
+ g_base_info_unref(element_type_info);
177
+ {
178
+ const guint8 *numbers = (const guint8 *)elements;
179
+ for (i = 0; i < n_elements; i++) {
180
+ rb_ary_push(rb_array, UINT2NUM(numbers[i]));
181
+ }
182
+ }
183
+ break;
184
+ case GI_TYPE_TAG_INT16:
185
+ case GI_TYPE_TAG_UINT16:
186
+ g_base_info_unref(element_type_info);
187
+ rb_raise(rb_eNotImpError,
188
+ "TODO: GIArgument(array)[c][%s] -> Ruby",
189
+ g_type_tag_to_string(element_type_tag));
190
+ break;
191
+ case GI_TYPE_TAG_INT32:
192
+ g_base_info_unref(element_type_info);
193
+ {
194
+ const gint8 *numbers = (const gint8 *)elements;
195
+ for (i = 0; i < n_elements; i++) {
196
+ rb_ary_push(rb_array, INT2NUM(numbers[i]));
197
+ }
198
+ }
199
+ break;
200
+ case GI_TYPE_TAG_UINT32:
201
+ case GI_TYPE_TAG_INT64:
202
+ case GI_TYPE_TAG_UINT64:
203
+ case GI_TYPE_TAG_FLOAT:
204
+ case GI_TYPE_TAG_DOUBLE:
205
+ case GI_TYPE_TAG_GTYPE:
206
+ g_base_info_unref(element_type_info);
207
+ rb_raise(rb_eNotImpError,
208
+ "TODO: GIArgument(array)[c][%s] -> Ruby",
209
+ g_type_tag_to_string(element_type_tag));
210
+ break;
211
+ case GI_TYPE_TAG_UTF8:
212
+ g_base_info_unref(element_type_info);
213
+ {
214
+ const gchar **strings = (const gchar **)elements;
215
+ for (i = 0; i < n_elements; i++) {
216
+ rb_ary_push(rb_array, CSTR2RVAL(strings[i]));
217
+ }
218
+ }
219
+ break;
220
+ case GI_TYPE_TAG_FILENAME:
221
+ case GI_TYPE_TAG_ARRAY:
222
+ g_base_info_unref(element_type_info);
223
+ rb_raise(rb_eNotImpError,
224
+ "TODO: GIArgument(array)[c][%s] -> Ruby",
225
+ g_type_tag_to_string(element_type_tag));
226
+ break;
227
+ case GI_TYPE_TAG_INTERFACE:
228
+ array_c_to_ruby_sized_interface(elements, n_elements, element_type_info,
229
+ rb_array);
230
+ break;
231
+ case GI_TYPE_TAG_GLIST:
232
+ case GI_TYPE_TAG_GSLIST:
233
+ case GI_TYPE_TAG_GHASH:
234
+ case GI_TYPE_TAG_ERROR:
235
+ case GI_TYPE_TAG_UNICHAR:
236
+ g_base_info_unref(element_type_info);
237
+ rb_raise(rb_eNotImpError,
238
+ "TODO: GIArgument(array)[c][%s] -> Ruby",
239
+ g_type_tag_to_string(element_type_tag));
240
+ break;
241
+ default:
242
+ g_base_info_unref(element_type_info);
243
+ g_assert_not_reached();
244
+ break;
245
+ }
246
+ }
247
+
25
248
  static void
26
249
  array_c_to_ruby(GIArgument *array, GITypeInfo *type_info, gint64 n_elements,
27
250
  VALUE rb_array)
28
251
  {
29
- const gchar **elements;
30
- gboolean fixed_size_p;
252
+ gconstpointer *elements;
253
+ gint fixed_size;
31
254
  gboolean zero_terminated_p;
32
255
 
33
256
  elements = array->v_pointer;
@@ -35,29 +258,181 @@ array_c_to_ruby(GIArgument *array, GITypeInfo *type_info, gint64 n_elements,
35
258
  return;
36
259
  }
37
260
 
38
- fixed_size_p = g_type_info_get_array_fixed_size(type_info);
261
+ fixed_size = g_type_info_get_array_fixed_size(type_info);
39
262
  zero_terminated_p = g_type_info_is_zero_terminated(type_info);
263
+
40
264
  if (n_elements != -1) {
41
- gint64 i;
42
- for (i = 0; i < n_elements; i++) {
43
- rb_ary_push(rb_array, CSTR2RVAL(elements[i]));
44
- }
265
+ array_c_to_ruby_sized(elements, n_elements, type_info, rb_array);
45
266
  } else if (zero_terminated_p) {
46
- for (; *elements; elements++) {
47
- rb_ary_push(rb_array, CSTR2RVAL(*elements));
267
+ const gchar **strings = (const gchar **)elements;
268
+ for (; *strings; strings++) {
269
+ rb_ary_push(rb_array, CSTR2RVAL(*strings));
48
270
  }
49
271
  } else {
50
272
  rb_raise(rb_eNotImpError,
51
273
  "TODO: GIArgument(array)[c] -> Ruby: "
52
274
  "zero-terminated: %s "
53
- "fixed-size: %s "
275
+ "fixed-size: %d "
54
276
  "length: %" G_GINT64_FORMAT,
55
277
  zero_terminated_p ? "true" : "false",
56
- fixed_size_p ? "true" : "false",
278
+ fixed_size,
57
279
  n_elements);
58
280
  }
59
281
  }
60
282
 
283
+ static void
284
+ array_array_interface_to_ruby(GIArgument *array,
285
+ G_GNUC_UNUSED GITypeInfo *array_type_info,
286
+ GITypeInfo *element_type_info,
287
+ VALUE rb_array)
288
+ {
289
+ GArray *elements;
290
+ GIBaseInfo *interface_info;
291
+ GIInfoType interface_type;
292
+ GType gtype;
293
+ const char *interface_name;
294
+
295
+ elements = array->v_pointer;
296
+
297
+ interface_info = g_type_info_get_interface(element_type_info);
298
+ interface_type = g_base_info_get_type(interface_info);
299
+ gtype = g_registered_type_info_get_g_type(interface_info);
300
+
301
+ switch (interface_type) {
302
+ case GI_INFO_TYPE_INVALID:
303
+ case GI_INFO_TYPE_FUNCTION:
304
+ case GI_INFO_TYPE_CALLBACK:
305
+ interface_name = g_info_type_to_string(interface_type);
306
+ g_base_info_unref(interface_info);
307
+ g_base_info_unref(element_type_info);
308
+ rb_raise(rb_eNotImpError,
309
+ "TODO: GIArgument(array)[array][interface(%s)](%s) -> Ruby",
310
+ interface_name,
311
+ g_type_name(gtype));
312
+ break;
313
+ case GI_INFO_TYPE_STRUCT:
314
+ if (gtype == G_TYPE_NONE) {
315
+ guint i;
316
+ guint element_size;
317
+
318
+ element_size = g_array_get_element_size(elements);
319
+ for (i = 0; i < elements->len; i++) {
320
+ gpointer element;
321
+ element = elements->data + (element_size * i);
322
+ rb_ary_push(rb_array,
323
+ interface_struct_to_ruby(element,
324
+ TRUE,
325
+ element_type_info,
326
+ interface_info));
327
+ }
328
+ } else {
329
+ interface_name = g_info_type_to_string(interface_type);
330
+ g_base_info_unref(interface_info);
331
+ g_base_info_unref(element_type_info);
332
+ rb_raise(rb_eNotImpError,
333
+ "TODO: GIArgument(array)[array][interface(%s)](%s) -> Ruby",
334
+ interface_name,
335
+ g_type_name(gtype));
336
+ }
337
+ break;
338
+ case GI_INFO_TYPE_BOXED:
339
+ case GI_INFO_TYPE_ENUM:
340
+ case GI_INFO_TYPE_FLAGS:
341
+ case GI_INFO_TYPE_OBJECT:
342
+ case GI_INFO_TYPE_INTERFACE:
343
+ case GI_INFO_TYPE_CONSTANT:
344
+ case GI_INFO_TYPE_INVALID_0:
345
+ case GI_INFO_TYPE_UNION:
346
+ case GI_INFO_TYPE_VALUE:
347
+ case GI_INFO_TYPE_SIGNAL:
348
+ case GI_INFO_TYPE_VFUNC:
349
+ case GI_INFO_TYPE_PROPERTY:
350
+ case GI_INFO_TYPE_FIELD:
351
+ case GI_INFO_TYPE_ARG:
352
+ case GI_INFO_TYPE_TYPE:
353
+ case GI_INFO_TYPE_UNRESOLVED:
354
+ interface_name = g_info_type_to_string(interface_type);
355
+ g_base_info_unref(interface_info);
356
+ g_base_info_unref(element_type_info);
357
+ rb_raise(rb_eNotImpError,
358
+ "TODO: GIArgument(array)[array][interface(%s)](%s) -> Ruby",
359
+ interface_name,
360
+ g_type_name(gtype));
361
+ break;
362
+ default:
363
+ g_base_info_unref(interface_info);
364
+ g_base_info_unref(element_type_info);
365
+ g_assert_not_reached();
366
+ break;
367
+ }
368
+
369
+ g_base_info_unref(interface_info);
370
+ }
371
+
372
+ static void
373
+ array_array_to_ruby(GIArgument *array,
374
+ GITypeInfo *array_type_info,
375
+ VALUE rb_array)
376
+ {
377
+ GITypeInfo *element_type_info;
378
+ GITypeTag element_type_tag;
379
+ GArray *elements;
380
+
381
+ elements = array->v_pointer;
382
+ if (!elements) {
383
+ return;
384
+ }
385
+
386
+ element_type_info = g_type_info_get_param_type(array_type_info, 0);
387
+ element_type_tag = g_type_info_get_tag(element_type_info);
388
+
389
+ switch (element_type_tag) {
390
+ case GI_TYPE_TAG_VOID:
391
+ case GI_TYPE_TAG_BOOLEAN:
392
+ case GI_TYPE_TAG_INT8:
393
+ case GI_TYPE_TAG_UINT8:
394
+ case GI_TYPE_TAG_INT16:
395
+ case GI_TYPE_TAG_UINT16:
396
+ case GI_TYPE_TAG_INT32:
397
+ case GI_TYPE_TAG_UINT32:
398
+ case GI_TYPE_TAG_INT64:
399
+ case GI_TYPE_TAG_UINT64:
400
+ case GI_TYPE_TAG_FLOAT:
401
+ case GI_TYPE_TAG_DOUBLE:
402
+ case GI_TYPE_TAG_GTYPE:
403
+ case GI_TYPE_TAG_UTF8:
404
+ case GI_TYPE_TAG_FILENAME:
405
+ case GI_TYPE_TAG_ARRAY:
406
+ g_base_info_unref(element_type_info);
407
+ rb_raise(rb_eNotImpError,
408
+ "TODO: GIArgument(array)[array][%s] -> Ruby",
409
+ g_type_tag_to_string(element_type_tag));
410
+ break;
411
+ case GI_TYPE_TAG_INTERFACE:
412
+ array_array_interface_to_ruby(array,
413
+ array_type_info,
414
+ element_type_info,
415
+ rb_array);
416
+ break;
417
+ case GI_TYPE_TAG_GLIST:
418
+ case GI_TYPE_TAG_GSLIST:
419
+ case GI_TYPE_TAG_GHASH:
420
+ case GI_TYPE_TAG_ERROR:
421
+ case GI_TYPE_TAG_UNICHAR:
422
+ g_base_info_unref(element_type_info);
423
+ rb_raise(rb_eNotImpError,
424
+ "TODO: GIArgument(array)[array][%s] -> Ruby",
425
+ g_type_tag_to_string(element_type_tag));
426
+ break;
427
+ default:
428
+ g_base_info_unref(element_type_info);
429
+ g_assert_not_reached();
430
+ break;
431
+ }
432
+
433
+ g_base_info_unref(element_type_info);
434
+ }
435
+
61
436
  static gint64
62
437
  get_array_length(GIArgument *argument, GITypeInfo *type_info)
63
438
  {
@@ -70,53 +445,53 @@ get_array_length(GIArgument *argument, GITypeInfo *type_info)
70
445
 
71
446
  type_tag = g_type_info_get_tag(type_info);
72
447
  switch (type_tag) {
73
- case GI_TYPE_TAG_VOID:
74
- case GI_TYPE_TAG_BOOLEAN:
448
+ case GI_TYPE_TAG_VOID:
449
+ case GI_TYPE_TAG_BOOLEAN:
75
450
  rb_raise(rb_eNotImpError,
76
451
  "TODO: invalid array length argument?: <%s>",
77
452
  g_type_tag_to_string(type_tag));
78
453
  break;
79
- case GI_TYPE_TAG_INT8:
454
+ case GI_TYPE_TAG_INT8:
80
455
  length = argument->v_int8;
81
456
  break;
82
- case GI_TYPE_TAG_UINT8:
457
+ case GI_TYPE_TAG_UINT8:
83
458
  length = argument->v_uint8;
84
459
  break;
85
- case GI_TYPE_TAG_INT16:
460
+ case GI_TYPE_TAG_INT16:
86
461
  length = argument->v_int16;
87
462
  break;
88
- case GI_TYPE_TAG_UINT16:
463
+ case GI_TYPE_TAG_UINT16:
89
464
  length = argument->v_uint16;
90
465
  break;
91
- case GI_TYPE_TAG_INT32:
466
+ case GI_TYPE_TAG_INT32:
92
467
  length = argument->v_int32;
93
468
  break;
94
- case GI_TYPE_TAG_UINT32:
469
+ case GI_TYPE_TAG_UINT32:
95
470
  length = argument->v_uint32;
96
471
  break;
97
- case GI_TYPE_TAG_INT64:
472
+ case GI_TYPE_TAG_INT64:
98
473
  length = argument->v_int64;
99
474
  break;
100
- case GI_TYPE_TAG_UINT64:
475
+ case GI_TYPE_TAG_UINT64:
101
476
  length = argument->v_uint64;
102
477
  break;
103
- case GI_TYPE_TAG_FLOAT:
104
- case GI_TYPE_TAG_DOUBLE:
105
- case GI_TYPE_TAG_GTYPE:
106
- case GI_TYPE_TAG_UTF8:
107
- case GI_TYPE_TAG_FILENAME:
108
- case GI_TYPE_TAG_ARRAY:
109
- case GI_TYPE_TAG_INTERFACE:
110
- case GI_TYPE_TAG_GLIST:
111
- case GI_TYPE_TAG_GSLIST:
112
- case GI_TYPE_TAG_GHASH:
113
- case GI_TYPE_TAG_ERROR:
114
- case GI_TYPE_TAG_UNICHAR:
478
+ case GI_TYPE_TAG_FLOAT:
479
+ case GI_TYPE_TAG_DOUBLE:
480
+ case GI_TYPE_TAG_GTYPE:
481
+ case GI_TYPE_TAG_UTF8:
482
+ case GI_TYPE_TAG_FILENAME:
483
+ case GI_TYPE_TAG_ARRAY:
484
+ case GI_TYPE_TAG_INTERFACE:
485
+ case GI_TYPE_TAG_GLIST:
486
+ case GI_TYPE_TAG_GSLIST:
487
+ case GI_TYPE_TAG_GHASH:
488
+ case GI_TYPE_TAG_ERROR:
489
+ case GI_TYPE_TAG_UNICHAR:
115
490
  rb_raise(rb_eNotImpError,
116
491
  "TODO: invalid array length argument?: <%s>",
117
492
  g_type_tag_to_string(type_tag));
118
493
  break;
119
- default:
494
+ default:
120
495
  g_assert_not_reached();
121
496
  break;
122
497
  }
@@ -124,7 +499,7 @@ get_array_length(GIArgument *argument, GITypeInfo *type_info)
124
499
  return length;
125
500
  }
126
501
 
127
- VALUE
502
+ static VALUE
128
503
  rb_gi_array_argument_to_ruby(GIArgument *array_argument,
129
504
  GIArgument *length_argument,
130
505
  GITypeInfo *array_type_info,
@@ -142,19 +517,19 @@ rb_gi_array_argument_to_ruby(GIArgument *array_argument,
142
517
  rb_array = rb_ary_new2(n_elements);
143
518
  }
144
519
  switch (array_type) {
145
- case GI_ARRAY_TYPE_C:
520
+ case GI_ARRAY_TYPE_C:
146
521
  array_c_to_ruby(array_argument, array_type_info, n_elements, rb_array);
147
522
  break;
148
- case GI_ARRAY_TYPE_ARRAY:
149
- rb_raise(rb_eNotImpError, "TODO: GIArgument(array)[array] -> Ruby");
523
+ case GI_ARRAY_TYPE_ARRAY:
524
+ array_array_to_ruby(array_argument, array_type_info, rb_array);
150
525
  break;
151
- case GI_ARRAY_TYPE_PTR_ARRAY:
526
+ case GI_ARRAY_TYPE_PTR_ARRAY:
152
527
  rb_raise(rb_eNotImpError, "TODO: GIArgument(array)[ptr-array] -> Ruby");
153
528
  break;
154
- case GI_ARRAY_TYPE_BYTE_ARRAY:
529
+ case GI_ARRAY_TYPE_BYTE_ARRAY:
155
530
  rb_raise(rb_eNotImpError, "TODO: GIArgument(array)[byte-array] -> Ruby");
156
531
  break;
157
- default:
532
+ default:
158
533
  g_assert_not_reached();
159
534
  break;
160
535
  }
@@ -163,7 +538,30 @@ rb_gi_array_argument_to_ruby(GIArgument *array_argument,
163
538
  }
164
539
 
165
540
  static VALUE
166
- interface_to_ruby(GIArgument *argument, GITypeInfo *type_info)
541
+ interface_variant_to_ruby(GVariant *variant)
542
+ {
543
+ VALUE rb_value = Qnil;
544
+ const GVariantType *type;
545
+
546
+ type = g_variant_get_type(variant);
547
+ if (g_variant_type_equal(type, G_VARIANT_TYPE_STRING)) {
548
+ const char *value;
549
+ g_variant_get(variant, "s", &value);
550
+ rb_value = CSTR2RVAL(value);
551
+ } else {
552
+ rb_raise(rb_eNotImpError,
553
+ "TODO: GIArgument(interface)[GVariant][%.*s] -> Ruby",
554
+ (int)g_variant_type_get_string_length(type),
555
+ g_variant_type_peek_string(type));
556
+ }
557
+
558
+ return rb_value;
559
+ }
560
+
561
+ static VALUE
562
+ interface_to_ruby(GIArgument *argument,
563
+ gboolean duplicate,
564
+ GITypeInfo *type_info)
167
565
  {
168
566
  VALUE rb_interface;
169
567
  GIBaseInfo *interface_info;
@@ -175,96 +573,104 @@ interface_to_ruby(GIArgument *argument, GITypeInfo *type_info)
175
573
 
176
574
  gtype = g_registered_type_info_get_g_type(interface_info);
177
575
  switch (interface_type) {
178
- case GI_INFO_TYPE_INVALID:
576
+ case GI_INFO_TYPE_INVALID:
179
577
  rb_raise(rb_eNotImpError,
180
578
  "TODO: GIArgument(interface)[invalid] -> Ruby");
181
579
  break;
182
- case GI_INFO_TYPE_FUNCTION:
580
+ case GI_INFO_TYPE_FUNCTION:
183
581
  rb_raise(rb_eNotImpError,
184
582
  "TODO: GIArgument(interface)[function] -> Ruby");
185
583
  break;
186
- case GI_INFO_TYPE_CALLBACK:
584
+ case GI_INFO_TYPE_CALLBACK:
187
585
  rb_raise(rb_eNotImpError,
188
586
  "TODO: GIArgument(interface)[callback] -> Ruby");
189
587
  break;
190
- case GI_INFO_TYPE_STRUCT:
191
- if (gtype == G_TYPE_BYTES) {
588
+ case GI_INFO_TYPE_STRUCT:
589
+ if (gtype == G_TYPE_NONE) {
590
+ rb_interface = interface_struct_to_ruby(argument->v_pointer,
591
+ duplicate,
592
+ type_info,
593
+ interface_info);
594
+ } else if (gtype == G_TYPE_BYTES) {
192
595
  GBytes *bytes = argument->v_pointer;
193
596
  gconstpointer data;
194
597
  gsize size;
195
598
  data = g_bytes_get_data(bytes, &size);
196
599
  rb_interface = rb_enc_str_new(data, size, rb_ascii8bit_encoding());
600
+ } else if (gtype == G_TYPE_VARIANT) {
601
+ GVariant *variant = argument->v_pointer;
602
+ rb_interface = interface_variant_to_ruby(variant);
197
603
  } else {
198
604
  rb_interface = BOXED2RVAL(argument->v_pointer, gtype);
199
605
  }
200
606
  break;
201
- case GI_INFO_TYPE_BOXED:
607
+ case GI_INFO_TYPE_BOXED:
202
608
  rb_raise(rb_eNotImpError,
203
609
  "TODO: GIArgument(interface)[boxed] -> Ruby");
204
610
  break;
205
- case GI_INFO_TYPE_ENUM:
611
+ case GI_INFO_TYPE_ENUM:
206
612
  if (gtype == G_TYPE_NONE) {
207
613
  rb_interface = INT2NUM(argument->v_int32);
208
614
  } else {
209
615
  rb_interface = GENUM2RVAL(argument->v_int32, gtype);
210
616
  }
211
617
  break;
212
- case GI_INFO_TYPE_FLAGS:
618
+ case GI_INFO_TYPE_FLAGS:
213
619
  if (gtype == G_TYPE_NONE) {
214
620
  rb_interface = INT2NUM(argument->v_int32);
215
621
  } else {
216
622
  rb_interface = GFLAGS2RVAL(argument->v_int32, gtype);
217
623
  }
218
624
  break;
219
- case GI_INFO_TYPE_OBJECT:
625
+ case GI_INFO_TYPE_OBJECT:
220
626
  rb_interface = GOBJ2RVAL(argument->v_pointer);
221
627
  break;
222
- case GI_INFO_TYPE_INTERFACE:
628
+ case GI_INFO_TYPE_INTERFACE:
223
629
  rb_interface = GOBJ2RVAL(argument->v_pointer);
224
630
  break;
225
- case GI_INFO_TYPE_CONSTANT:
631
+ case GI_INFO_TYPE_CONSTANT:
226
632
  rb_raise(rb_eNotImpError,
227
633
  "TODO: GIArgument(interface)[constant] -> Ruby");
228
634
  break;
229
- case GI_INFO_TYPE_INVALID_0:
635
+ case GI_INFO_TYPE_INVALID_0:
230
636
  g_assert_not_reached();
231
637
  break;
232
- case GI_INFO_TYPE_UNION:
638
+ case GI_INFO_TYPE_UNION:
233
639
  rb_interface = BOXED2RVAL(argument->v_pointer, gtype);
234
640
  break;
235
- case GI_INFO_TYPE_VALUE:
641
+ case GI_INFO_TYPE_VALUE:
236
642
  rb_raise(rb_eNotImpError,
237
643
  "TODO: GIArgument(interface)[value] -> Ruby");
238
644
  break;
239
- case GI_INFO_TYPE_SIGNAL:
645
+ case GI_INFO_TYPE_SIGNAL:
240
646
  rb_raise(rb_eNotImpError,
241
647
  "TODO: GIArgument(interface)[signal] -> Ruby");
242
648
  break;
243
- case GI_INFO_TYPE_VFUNC:
649
+ case GI_INFO_TYPE_VFUNC:
244
650
  rb_raise(rb_eNotImpError,
245
651
  "TODO: GIArgument(interface)[vfunc] -> Ruby");
246
652
  break;
247
- case GI_INFO_TYPE_PROPERTY:
653
+ case GI_INFO_TYPE_PROPERTY:
248
654
  rb_raise(rb_eNotImpError,
249
655
  "TODO: GIArgument(interface)[property] -> Ruby");
250
656
  break;
251
- case GI_INFO_TYPE_FIELD:
657
+ case GI_INFO_TYPE_FIELD:
252
658
  rb_raise(rb_eNotImpError,
253
659
  "TODO: GIArgument(interface)[field] -> Ruby");
254
660
  break;
255
- case GI_INFO_TYPE_ARG:
661
+ case GI_INFO_TYPE_ARG:
256
662
  rb_raise(rb_eNotImpError,
257
663
  "TODO: GIArgument(interface)[arg] -> Ruby");
258
664
  break;
259
- case GI_INFO_TYPE_TYPE:
665
+ case GI_INFO_TYPE_TYPE:
260
666
  rb_raise(rb_eNotImpError,
261
667
  "TODO: GIArgument(interface)[type] -> Ruby");
262
668
  break;
263
- case GI_INFO_TYPE_UNRESOLVED:
669
+ case GI_INFO_TYPE_UNRESOLVED:
264
670
  rb_raise(rb_eNotImpError,
265
671
  "TODO: GIArgument(interface)[unresolved] -> Ruby");
266
672
  break;
267
- default:
673
+ default:
268
674
  g_assert_not_reached();
269
675
  break;
270
676
  }
@@ -274,57 +680,264 @@ interface_to_ruby(GIArgument *argument, GITypeInfo *type_info)
274
680
  return rb_interface;
275
681
  }
276
682
 
277
- static VALUE
278
- rb_gi_argument_to_ruby_glist(GIArgument *argument, GITypeInfo *type_info)
683
+ static void
684
+ normalize_out_array_length(GIArgument *normalized_argument,
685
+ GIArgument *argument,
686
+ GITypeInfo *type_info)
279
687
  {
280
- VALUE rb_argument;
281
- GITypeInfo *element_type_info;
282
- GITypeTag element_type_tag;
283
-
284
- element_type_info = g_type_info_get_param_type(type_info, 0);
285
- element_type_tag = g_type_info_get_tag(element_type_info);
286
- g_base_info_unref(element_type_info);
688
+ GITypeTag type_tag;
287
689
 
288
- switch (element_type_tag) {
690
+ type_tag = g_type_info_get_tag(type_info);
691
+ switch (type_tag) {
289
692
  case GI_TYPE_TAG_VOID:
290
693
  case GI_TYPE_TAG_BOOLEAN:
694
+ rb_raise(rb_eNotImpError,
695
+ "TODO: invalid out array length argument?: <%s>",
696
+ g_type_tag_to_string(type_tag));
697
+ break;
291
698
  case GI_TYPE_TAG_INT8:
699
+ normalized_argument->v_int8 = *((gint8 *)argument->v_pointer);
700
+ break;
292
701
  case GI_TYPE_TAG_UINT8:
702
+ normalized_argument->v_uint8 = *((guint8 *)argument->v_pointer);
703
+ break;
293
704
  case GI_TYPE_TAG_INT16:
705
+ normalized_argument->v_int16 = *((gint16 *)argument->v_pointer);
706
+ break;
294
707
  case GI_TYPE_TAG_UINT16:
708
+ normalized_argument->v_uint16 = *((guint16 *)argument->v_pointer);
709
+ break;
295
710
  case GI_TYPE_TAG_INT32:
711
+ normalized_argument->v_int32 = *((gint32 *)argument->v_pointer);
712
+ break;
296
713
  case GI_TYPE_TAG_UINT32:
714
+ normalized_argument->v_uint32 = *((guint32 *)argument->v_pointer);
715
+ break;
297
716
  case GI_TYPE_TAG_INT64:
717
+ normalized_argument->v_int64 = *((gint64 *)argument->v_pointer);
718
+ break;
298
719
  case GI_TYPE_TAG_UINT64:
720
+ normalized_argument->v_uint64 = *((guint64 *)argument->v_pointer);
721
+ break;
299
722
  case GI_TYPE_TAG_FLOAT:
300
723
  case GI_TYPE_TAG_DOUBLE:
301
724
  case GI_TYPE_TAG_GTYPE:
725
+ case GI_TYPE_TAG_UTF8:
726
+ case GI_TYPE_TAG_FILENAME:
727
+ case GI_TYPE_TAG_ARRAY:
728
+ case GI_TYPE_TAG_INTERFACE:
729
+ case GI_TYPE_TAG_GLIST:
730
+ case GI_TYPE_TAG_GSLIST:
731
+ case GI_TYPE_TAG_GHASH:
732
+ case GI_TYPE_TAG_ERROR:
733
+ case GI_TYPE_TAG_UNICHAR:
734
+ rb_raise(rb_eNotImpError,
735
+ "TODO: invalid out array length argument?: <%s>",
736
+ g_type_tag_to_string(type_tag));
737
+ break;
738
+ default:
739
+ g_assert_not_reached();
740
+ break;
741
+ }
742
+ }
743
+
744
+ static VALUE
745
+ rb_gi_argument_to_ruby_array(GIArgument *array_argument,
746
+ GITypeInfo *array_type_info,
747
+ GArray *in_args,
748
+ GArray *out_args,
749
+ GPtrArray *args_metadata)
750
+ {
751
+ VALUE rb_array;
752
+ gint length_index;
753
+ GIArgument *length_argument = NULL;
754
+ GIArgument normalized_length_argument;
755
+ GITypeInfo raw_length_type_info;
756
+ GITypeInfo *length_type_info = NULL;
757
+
758
+ length_index = g_type_info_get_array_length(array_type_info);
759
+ if (length_index != -1) {
760
+ RBGIArgMetadata *length_metadata;
761
+ GIArgInfo *length_arg_info = NULL;
762
+ GIArgument *raw_length_argument = NULL;
763
+
764
+ length_metadata = g_ptr_array_index(args_metadata, length_index);
765
+ length_arg_info = &(length_metadata->arg_info);
766
+
767
+ g_arg_info_load_type(length_arg_info, &raw_length_type_info);
768
+ length_type_info = &raw_length_type_info;
769
+
770
+ if (length_metadata->direction == GI_DIRECTION_OUT) {
771
+ raw_length_argument = &g_array_index(out_args, GIArgument,
772
+ length_metadata->out_arg_index);
773
+ } else if (length_metadata->direction == GI_DIRECTION_INOUT) {
774
+ raw_length_argument = &g_array_index(in_args, GIArgument,
775
+ length_metadata->in_arg_index);
776
+ }
777
+
778
+ if (raw_length_argument) {
779
+ normalize_out_array_length(&normalized_length_argument,
780
+ raw_length_argument,
781
+ length_type_info);
782
+ length_argument = &normalized_length_argument;
783
+ } else {
784
+ length_argument = &g_array_index(in_args, GIArgument,
785
+ length_metadata->in_arg_index);
786
+ }
787
+ }
788
+
789
+ rb_array = rb_gi_array_argument_to_ruby(array_argument,
790
+ length_argument,
791
+ array_type_info,
792
+ length_type_info);
793
+
794
+ return rb_array;
795
+ }
796
+
797
+ static VALUE
798
+ rb_gi_argument_to_ruby_glist_interface(GIArgument *argument,
799
+ G_GNUC_UNUSED GITypeInfo *type_info,
800
+ GITypeInfo *element_type_info)
801
+ {
802
+ VALUE rb_argument = Qnil;
803
+ GIBaseInfo *interface_info;
804
+ GIInfoType interface_type;
805
+ const gchar *interface_name;
806
+ GType gtype;
807
+
808
+ interface_info = g_type_info_get_interface(element_type_info);
809
+ interface_type = g_base_info_get_type(interface_info);
810
+ interface_name = g_info_type_to_string(interface_type);
811
+ gtype = g_registered_type_info_get_g_type(interface_info);
812
+
813
+ switch (interface_type) {
814
+ case GI_INFO_TYPE_INVALID:
815
+ case GI_INFO_TYPE_FUNCTION:
816
+ case GI_INFO_TYPE_CALLBACK:
817
+ g_base_info_unref(interface_info);
818
+ g_base_info_unref(element_type_info);
819
+ rb_raise(rb_eNotImpError,
820
+ "TODO: GIArgument(GList)[interface(%s)](%s) -> Ruby",
821
+ interface_name,
822
+ g_type_name(gtype));
823
+ break;
824
+ case GI_INFO_TYPE_STRUCT:
825
+ if (gtype == G_TYPE_NONE) {
826
+ GList *node;
827
+ rb_argument = rb_ary_new();
828
+ for (node = argument->v_pointer; node; node = g_list_next(node)) {
829
+ rb_ary_push(rb_argument,
830
+ interface_struct_to_ruby(node->data,
831
+ FALSE,
832
+ element_type_info,
833
+ interface_info));
834
+ }
835
+ } else {
836
+ rb_argument = BOXEDGLIST2RVAL(argument->v_pointer, gtype);
837
+ }
838
+ break;
839
+ case GI_INFO_TYPE_BOXED:
840
+ rb_argument = BOXEDGLIST2RVAL(argument->v_pointer, gtype);
841
+ break;
842
+ case GI_INFO_TYPE_ENUM:
843
+ case GI_INFO_TYPE_FLAGS:
844
+ g_base_info_unref(interface_info);
845
+ g_base_info_unref(element_type_info);
846
+ rb_raise(rb_eNotImpError,
847
+ "TODO: GIArgument(GList)[interface(%s)](%s) -> Ruby",
848
+ interface_name,
849
+ g_type_name(gtype));
850
+ break;
851
+ case GI_INFO_TYPE_OBJECT:
852
+ case GI_INFO_TYPE_INTERFACE:
853
+ rb_argument = GOBJGLIST2RVAL(argument->v_pointer);
854
+ break;
855
+ case GI_INFO_TYPE_CONSTANT:
856
+ case GI_INFO_TYPE_INVALID_0:
857
+ case GI_INFO_TYPE_UNION:
858
+ case GI_INFO_TYPE_VALUE:
859
+ case GI_INFO_TYPE_SIGNAL:
860
+ case GI_INFO_TYPE_VFUNC:
861
+ case GI_INFO_TYPE_PROPERTY:
862
+ case GI_INFO_TYPE_FIELD:
863
+ case GI_INFO_TYPE_ARG:
864
+ case GI_INFO_TYPE_TYPE:
865
+ case GI_INFO_TYPE_UNRESOLVED:
866
+ g_base_info_unref(interface_info);
867
+ g_base_info_unref(element_type_info);
868
+ rb_raise(rb_eNotImpError,
869
+ "TODO: GIArgument(GList)[interface(%s)](%s) -> Ruby",
870
+ interface_name,
871
+ g_type_name(gtype));
872
+ break;
873
+ default:
874
+ g_assert_not_reached();
875
+ break;
876
+ }
877
+
878
+ g_base_info_unref(interface_info);
879
+ g_base_info_unref(element_type_info);
880
+
881
+ return rb_argument;
882
+ }
883
+
884
+ static VALUE
885
+ rb_gi_argument_to_ruby_glist(GIArgument *argument, GITypeInfo *type_info)
886
+ {
887
+ VALUE rb_argument;
888
+ GITypeInfo *element_type_info;
889
+ GITypeTag element_type_tag;
890
+
891
+ element_type_info = g_type_info_get_param_type(type_info, 0);
892
+ element_type_tag = g_type_info_get_tag(element_type_info);
893
+
894
+ switch (element_type_tag) {
895
+ case GI_TYPE_TAG_VOID:
896
+ case GI_TYPE_TAG_BOOLEAN:
897
+ case GI_TYPE_TAG_INT8:
898
+ case GI_TYPE_TAG_UINT8:
899
+ case GI_TYPE_TAG_INT16:
900
+ case GI_TYPE_TAG_UINT16:
901
+ case GI_TYPE_TAG_INT32:
902
+ case GI_TYPE_TAG_UINT32:
903
+ case GI_TYPE_TAG_INT64:
904
+ case GI_TYPE_TAG_UINT64:
905
+ case GI_TYPE_TAG_FLOAT:
906
+ case GI_TYPE_TAG_DOUBLE:
907
+ case GI_TYPE_TAG_GTYPE:
908
+ g_base_info_unref(element_type_info);
302
909
  rb_raise(rb_eNotImpError,
303
910
  "TODO: GIArgument(GList)[%s] -> Ruby",
304
911
  g_type_tag_to_string(element_type_tag));
305
912
  break;
306
913
  case GI_TYPE_TAG_UTF8:
914
+ g_base_info_unref(element_type_info);
307
915
  rb_argument = CSTRGLIST2RVAL(argument->v_pointer);
308
916
  break;
309
917
  case GI_TYPE_TAG_FILENAME:
310
918
  case GI_TYPE_TAG_ARRAY:
919
+ g_base_info_unref(element_type_info);
311
920
  rb_raise(rb_eNotImpError,
312
921
  "TODO: GIArgument(GList)[%s] -> Ruby",
313
922
  g_type_tag_to_string(element_type_tag));
314
923
  break;
315
924
  case GI_TYPE_TAG_INTERFACE:
316
- GOBJGLIST2RVAL(argument->v_pointer);
925
+ rb_argument = rb_gi_argument_to_ruby_glist_interface(argument,
926
+ type_info,
927
+ element_type_info);
317
928
  break;
318
929
  case GI_TYPE_TAG_GLIST:
319
930
  case GI_TYPE_TAG_GSLIST:
320
931
  case GI_TYPE_TAG_GHASH:
321
932
  case GI_TYPE_TAG_ERROR:
322
933
  case GI_TYPE_TAG_UNICHAR:
934
+ g_base_info_unref(element_type_info);
323
935
  rb_raise(rb_eNotImpError,
324
936
  "TODO: GIArgument(GList)[%s] -> Ruby",
325
937
  g_type_tag_to_string(element_type_tag));
326
938
  break;
327
939
  default:
940
+ g_base_info_unref(element_type_info);
328
941
  g_assert_not_reached();
329
942
  break;
330
943
  }
@@ -332,90 +945,177 @@ rb_gi_argument_to_ruby_glist(GIArgument *argument, GITypeInfo *type_info)
332
945
  return rb_argument;
333
946
  }
334
947
 
948
+ static VALUE
949
+ rb_gi_argument_to_ruby_gslist(GIArgument *argument, GITypeInfo *type_info)
950
+ {
951
+ VALUE rb_argument;
952
+ GITypeInfo *element_type_info;
953
+ GITypeTag element_type_tag;
954
+
955
+ element_type_info = g_type_info_get_param_type(type_info, 0);
956
+ element_type_tag = g_type_info_get_tag(element_type_info);
957
+ g_base_info_unref(element_type_info);
958
+
959
+ switch (element_type_tag) {
960
+ case GI_TYPE_TAG_VOID:
961
+ case GI_TYPE_TAG_BOOLEAN:
962
+ case GI_TYPE_TAG_INT8:
963
+ case GI_TYPE_TAG_UINT8:
964
+ case GI_TYPE_TAG_INT16:
965
+ case GI_TYPE_TAG_UINT16:
966
+ case GI_TYPE_TAG_INT32:
967
+ case GI_TYPE_TAG_UINT32:
968
+ case GI_TYPE_TAG_INT64:
969
+ case GI_TYPE_TAG_UINT64:
970
+ case GI_TYPE_TAG_FLOAT:
971
+ case GI_TYPE_TAG_DOUBLE:
972
+ case GI_TYPE_TAG_GTYPE:
973
+ rb_raise(rb_eNotImpError,
974
+ "TODO: GIArgument(GSList)[%s] -> Ruby",
975
+ g_type_tag_to_string(element_type_tag));
976
+ break;
977
+ case GI_TYPE_TAG_UTF8:
978
+ rb_argument = CSTRGSLIST2RVAL(argument->v_pointer);
979
+ break;
980
+ case GI_TYPE_TAG_FILENAME:
981
+ case GI_TYPE_TAG_ARRAY:
982
+ rb_raise(rb_eNotImpError,
983
+ "TODO: GIArgument(GSList)[%s] -> Ruby",
984
+ g_type_tag_to_string(element_type_tag));
985
+ break;
986
+ case GI_TYPE_TAG_INTERFACE:
987
+ rb_argument = GOBJGSLIST2RVAL(argument->v_pointer);
988
+ break;
989
+ case GI_TYPE_TAG_GLIST:
990
+ case GI_TYPE_TAG_GSLIST:
991
+ case GI_TYPE_TAG_GHASH:
992
+ case GI_TYPE_TAG_ERROR:
993
+ case GI_TYPE_TAG_UNICHAR:
994
+ rb_raise(rb_eNotImpError,
995
+ "TODO: GIArgument(GSList)[%s] -> Ruby",
996
+ g_type_tag_to_string(element_type_tag));
997
+ break;
998
+ default:
999
+ g_assert_not_reached();
1000
+ break;
1001
+ }
1002
+
1003
+ return rb_argument;
1004
+ }
1005
+
1006
+ static VALUE
1007
+ rb_gi_argument_to_ruby_unichar(GIArgument *argument)
1008
+ {
1009
+ VALUE rb_argument;
1010
+ gunichar ucs4_character;
1011
+ gchar *utf8_string;
1012
+ GError *error = NULL;
1013
+
1014
+ ucs4_character = argument->v_uint32;
1015
+ utf8_string = g_ucs4_to_utf8(&ucs4_character, 1, NULL, NULL, &error);
1016
+ if (error) {
1017
+ RG_RAISE_ERROR(error);
1018
+ }
1019
+ rb_argument = CSTR2RVAL_FREE(utf8_string);
1020
+
1021
+ return rb_argument;
1022
+ }
335
1023
 
336
1024
  VALUE
337
- rb_gi_argument_to_ruby(GIArgument *argument, GITypeInfo *type_info)
1025
+ rb_gi_argument_to_ruby(GIArgument *argument,
1026
+ gboolean duplicate,
1027
+ GITypeInfo *type_info,
1028
+ GArray *in_args,
1029
+ GArray *out_args,
1030
+ GPtrArray *args_metadata)
338
1031
  {
339
1032
  VALUE rb_argument = Qnil;
340
1033
  GITypeTag type_tag;
341
1034
 
342
1035
  type_tag = g_type_info_get_tag(type_info);
343
1036
  switch (type_tag) {
344
- case GI_TYPE_TAG_VOID:
1037
+ case GI_TYPE_TAG_VOID:
345
1038
  if (g_type_info_is_pointer(type_info)) {
346
1039
  rb_argument = ULONG2NUM(GPOINTER_TO_UINT(argument->v_pointer));
347
1040
  } else {
348
1041
  rb_argument = Qnil;
349
1042
  }
350
1043
  break;
351
- case GI_TYPE_TAG_BOOLEAN:
1044
+ case GI_TYPE_TAG_BOOLEAN:
352
1045
  rb_argument = CBOOL2RVAL(argument->v_boolean);
353
1046
  break;
354
- case GI_TYPE_TAG_INT8:
1047
+ case GI_TYPE_TAG_INT8:
355
1048
  rb_argument = INT2NUM(argument->v_int8);
356
1049
  break;
357
- case GI_TYPE_TAG_UINT8:
1050
+ case GI_TYPE_TAG_UINT8:
358
1051
  rb_argument = UINT2NUM(argument->v_uint8);
359
1052
  break;
360
- case GI_TYPE_TAG_INT16:
1053
+ case GI_TYPE_TAG_INT16:
361
1054
  rb_argument = INT2NUM(argument->v_int16);
362
1055
  break;
363
- case GI_TYPE_TAG_UINT16:
1056
+ case GI_TYPE_TAG_UINT16:
364
1057
  rb_argument = UINT2NUM(argument->v_uint16);
365
1058
  break;
366
- case GI_TYPE_TAG_INT32:
1059
+ case GI_TYPE_TAG_INT32:
367
1060
  rb_argument = INT2NUM(argument->v_int32);
368
1061
  break;
369
- case GI_TYPE_TAG_UINT32:
1062
+ case GI_TYPE_TAG_UINT32:
370
1063
  rb_argument = UINT2NUM(argument->v_uint32);
371
1064
  break;
372
- case GI_TYPE_TAG_INT64:
1065
+ case GI_TYPE_TAG_INT64:
373
1066
  rb_argument = LONG2NUM(argument->v_int64);
374
1067
  break;
375
- case GI_TYPE_TAG_UINT64:
1068
+ case GI_TYPE_TAG_UINT64:
376
1069
  rb_argument = ULONG2NUM(argument->v_uint64);
377
1070
  break;
378
- case GI_TYPE_TAG_FLOAT:
1071
+ case GI_TYPE_TAG_FLOAT:
379
1072
  rb_argument = DBL2NUM(argument->v_float);
380
1073
  break;
381
- case GI_TYPE_TAG_DOUBLE:
1074
+ case GI_TYPE_TAG_DOUBLE:
382
1075
  rb_argument = DBL2NUM(argument->v_double);
383
1076
  break;
384
- case GI_TYPE_TAG_GTYPE:
385
- rb_argument = rbgobj_gtype_new(argument->v_size);
1077
+ case GI_TYPE_TAG_GTYPE:
1078
+ if (argument->v_size == G_TYPE_INVALID) {
1079
+ rb_argument = Qnil;
1080
+ } else {
1081
+ rb_argument = rbgobj_gtype_new(argument->v_size);
1082
+ }
386
1083
  break;
387
- case GI_TYPE_TAG_UTF8:
1084
+ case GI_TYPE_TAG_UTF8:
388
1085
  rb_argument = CSTR2RVAL(argument->v_string);
389
1086
  break;
390
- case GI_TYPE_TAG_FILENAME:
1087
+ case GI_TYPE_TAG_FILENAME:
391
1088
  /* TODO: set encoding */
392
1089
  rb_argument = CSTR2RVAL(argument->v_string);
393
1090
  break;
394
- case GI_TYPE_TAG_ARRAY:
395
- rb_argument = rb_gi_array_argument_to_ruby(argument, NULL,
396
- type_info, NULL);
1091
+ case GI_TYPE_TAG_ARRAY:
1092
+ rb_argument = rb_gi_argument_to_ruby_array(argument,
1093
+ type_info,
1094
+ in_args,
1095
+ out_args,
1096
+ args_metadata);
397
1097
  break;
398
- case GI_TYPE_TAG_INTERFACE:
399
- rb_argument = interface_to_ruby(argument, type_info);
1098
+ case GI_TYPE_TAG_INTERFACE:
1099
+ rb_argument = interface_to_ruby(argument, duplicate, type_info);
400
1100
  break;
401
- case GI_TYPE_TAG_GLIST:
1101
+ case GI_TYPE_TAG_GLIST:
402
1102
  rb_argument = rb_gi_argument_to_ruby_glist(argument, type_info);
403
1103
  break;
404
- case GI_TYPE_TAG_GSLIST:
405
- case GI_TYPE_TAG_GHASH:
1104
+ case GI_TYPE_TAG_GSLIST:
1105
+ rb_argument = rb_gi_argument_to_ruby_gslist(argument, type_info);
1106
+ break;
1107
+ case GI_TYPE_TAG_GHASH:
406
1108
  rb_raise(rb_eNotImpError,
407
1109
  "TODO: GIArgument(%s) -> Ruby",
408
1110
  g_type_tag_to_string(type_tag));
409
1111
  break;
410
- case GI_TYPE_TAG_ERROR:
1112
+ case GI_TYPE_TAG_ERROR:
411
1113
  rb_argument = GERROR2RVAL(argument->v_pointer);
412
1114
  break;
413
- case GI_TYPE_TAG_UNICHAR:
414
- rb_raise(rb_eNotImpError,
415
- "TODO: GIArgument(%s) -> Ruby",
416
- g_type_tag_to_string(type_tag));
1115
+ case GI_TYPE_TAG_UNICHAR:
1116
+ rb_argument = rb_gi_argument_to_ruby_unichar(argument);
417
1117
  break;
418
- default:
1118
+ default:
419
1119
  g_assert_not_reached();
420
1120
  break;
421
1121
  }
@@ -423,6 +1123,178 @@ rb_gi_argument_to_ruby(GIArgument *argument, GITypeInfo *type_info)
423
1123
  return rb_argument;
424
1124
  }
425
1125
 
1126
+ static void
1127
+ rb_gi_out_argument_init_array_array_interface(GIArgument *argument,
1128
+ G_GNUC_UNUSED GIArgInfo *arg_info,
1129
+ GITypeInfo *array_type_info,
1130
+ GITypeInfo *element_type_info)
1131
+ {
1132
+ gboolean zero_terminated_p;
1133
+ GIBaseInfo *interface_info;
1134
+ GIInfoType interface_type;
1135
+ GType gtype;
1136
+ const char *interface_name;
1137
+
1138
+ zero_terminated_p = g_type_info_is_zero_terminated(array_type_info);
1139
+ interface_info = g_type_info_get_interface(element_type_info);
1140
+ interface_type = g_base_info_get_type(interface_info);
1141
+ gtype = g_registered_type_info_get_g_type(interface_info);
1142
+
1143
+ switch (interface_type) {
1144
+ case GI_INFO_TYPE_INVALID:
1145
+ case GI_INFO_TYPE_FUNCTION:
1146
+ case GI_INFO_TYPE_CALLBACK:
1147
+ interface_name = g_info_type_to_string(interface_type);
1148
+ g_base_info_unref(interface_info);
1149
+ g_base_info_unref(element_type_info);
1150
+ rb_raise(rb_eNotImpError,
1151
+ "TODO: GIArgument(array)[array][interface(%s)](%s) -> Ruby",
1152
+ interface_name,
1153
+ g_type_name(gtype));
1154
+ break;
1155
+ case GI_INFO_TYPE_STRUCT:
1156
+ {
1157
+ gsize struct_size;
1158
+
1159
+ struct_size = g_struct_info_get_size(interface_info);
1160
+ argument->v_pointer = g_array_new(zero_terminated_p,
1161
+ TRUE,
1162
+ struct_size);
1163
+ break;
1164
+ }
1165
+ case GI_INFO_TYPE_BOXED:
1166
+ case GI_INFO_TYPE_ENUM:
1167
+ case GI_INFO_TYPE_FLAGS:
1168
+ case GI_INFO_TYPE_OBJECT:
1169
+ case GI_INFO_TYPE_INTERFACE:
1170
+ case GI_INFO_TYPE_CONSTANT:
1171
+ case GI_INFO_TYPE_INVALID_0:
1172
+ case GI_INFO_TYPE_UNION:
1173
+ case GI_INFO_TYPE_VALUE:
1174
+ case GI_INFO_TYPE_SIGNAL:
1175
+ case GI_INFO_TYPE_VFUNC:
1176
+ case GI_INFO_TYPE_PROPERTY:
1177
+ case GI_INFO_TYPE_FIELD:
1178
+ case GI_INFO_TYPE_ARG:
1179
+ case GI_INFO_TYPE_TYPE:
1180
+ case GI_INFO_TYPE_UNRESOLVED:
1181
+ interface_name = g_info_type_to_string(interface_type);
1182
+ g_base_info_unref(interface_info);
1183
+ g_base_info_unref(element_type_info);
1184
+ rb_raise(rb_eNotImpError,
1185
+ "TODO: GIArgument(array)[array][interface(%s)](%s) -> Ruby",
1186
+ interface_name,
1187
+ g_type_name(gtype));
1188
+ break;
1189
+ default:
1190
+ g_base_info_unref(interface_info);
1191
+ g_base_info_unref(element_type_info);
1192
+ g_assert_not_reached();
1193
+ break;
1194
+ }
1195
+
1196
+ g_base_info_unref(interface_info);
1197
+ }
1198
+
1199
+ static void
1200
+ rb_gi_out_argument_init_array_array(GIArgument *argument,
1201
+ GIArgInfo *arg_info,
1202
+ GITypeInfo *array_type_info,
1203
+ GITypeInfo *element_type_info)
1204
+ {
1205
+ GITypeTag element_type_tag;
1206
+
1207
+ element_type_tag = g_type_info_get_tag(element_type_info);
1208
+
1209
+ switch (element_type_tag) {
1210
+ case GI_TYPE_TAG_VOID:
1211
+ case GI_TYPE_TAG_BOOLEAN:
1212
+ case GI_TYPE_TAG_INT8:
1213
+ case GI_TYPE_TAG_UINT8:
1214
+ case GI_TYPE_TAG_INT16:
1215
+ case GI_TYPE_TAG_UINT16:
1216
+ case GI_TYPE_TAG_INT32:
1217
+ case GI_TYPE_TAG_UINT32:
1218
+ case GI_TYPE_TAG_INT64:
1219
+ case GI_TYPE_TAG_UINT64:
1220
+ case GI_TYPE_TAG_FLOAT:
1221
+ case GI_TYPE_TAG_DOUBLE:
1222
+ case GI_TYPE_TAG_GTYPE:
1223
+ case GI_TYPE_TAG_UTF8:
1224
+ case GI_TYPE_TAG_FILENAME:
1225
+ case GI_TYPE_TAG_ARRAY:
1226
+ g_base_info_unref(element_type_info);
1227
+ rb_raise(rb_eNotImpError,
1228
+ "TODO: allocates GIArgument(array)[array][%s] for output",
1229
+ g_type_tag_to_string(element_type_tag));
1230
+ break;
1231
+ case GI_TYPE_TAG_INTERFACE:
1232
+ rb_gi_out_argument_init_array_array_interface(argument,
1233
+ arg_info,
1234
+ array_type_info,
1235
+ element_type_info);
1236
+ break;
1237
+ case GI_TYPE_TAG_GLIST:
1238
+ case GI_TYPE_TAG_GSLIST:
1239
+ case GI_TYPE_TAG_GHASH:
1240
+ case GI_TYPE_TAG_ERROR:
1241
+ case GI_TYPE_TAG_UNICHAR:
1242
+ g_base_info_unref(element_type_info);
1243
+ rb_raise(rb_eNotImpError,
1244
+ "TODO: allocates GIArgument(array)[array][%s] for output",
1245
+ g_type_tag_to_string(element_type_tag));
1246
+ break;
1247
+ default:
1248
+ g_base_info_unref(element_type_info);
1249
+ g_assert_not_reached();
1250
+ break;
1251
+ }
1252
+ }
1253
+
1254
+ static void
1255
+ rb_gi_out_argument_init_array(GIArgument *argument, GIArgInfo *arg_info,
1256
+ GITypeInfo *array_type_info)
1257
+ {
1258
+ GIArrayType array_type;
1259
+ GITypeInfo *element_type_info;
1260
+
1261
+ array_type = g_type_info_get_array_type(array_type_info);
1262
+ element_type_info = g_type_info_get_param_type(array_type_info, 0);
1263
+
1264
+ switch (array_type) {
1265
+ case GI_ARRAY_TYPE_C:
1266
+ g_base_info_unref(element_type_info);
1267
+ rb_raise(rb_eNotImpError,
1268
+ "TODO: allocates GIArgument(array)[c][%s] for output",
1269
+ g_type_tag_to_string(g_type_info_get_tag(element_type_info)));
1270
+ break;
1271
+ case GI_ARRAY_TYPE_ARRAY:
1272
+ rb_gi_out_argument_init_array_array(argument,
1273
+ arg_info,
1274
+ array_type_info,
1275
+ element_type_info);
1276
+ break;
1277
+ case GI_ARRAY_TYPE_PTR_ARRAY:
1278
+ g_base_info_unref(element_type_info);
1279
+ rb_raise(rb_eNotImpError,
1280
+ "TODO: allocates GIArgument(array)[ptr-array][%s] for output",
1281
+ g_type_tag_to_string(g_type_info_get_tag(element_type_info)));
1282
+ break;
1283
+ case GI_ARRAY_TYPE_BYTE_ARRAY:
1284
+ g_base_info_unref(element_type_info);
1285
+ rb_raise(rb_eNotImpError,
1286
+ "TODO: allocates GIArgument(array)[byte-array][%s] for output",
1287
+ g_type_tag_to_string(g_type_info_get_tag(element_type_info)));
1288
+ break;
1289
+ default:
1290
+ g_base_info_unref(element_type_info);
1291
+ g_assert_not_reached();
1292
+ break;
1293
+ }
1294
+
1295
+ g_base_info_unref(element_type_info);
1296
+ }
1297
+
426
1298
  static void
427
1299
  rb_gi_out_argument_init_interface(GIArgument *argument, GIArgInfo *arg_info,
428
1300
  GITypeInfo *type_info)
@@ -439,43 +1311,43 @@ rb_gi_out_argument_init_interface(GIArgument *argument, GIArgInfo *arg_info,
439
1311
  interface_type = g_base_info_get_type(interface_info);
440
1312
 
441
1313
  switch (interface_type) {
442
- case GI_INFO_TYPE_INVALID:
443
- case GI_INFO_TYPE_FUNCTION:
444
- case GI_INFO_TYPE_CALLBACK:
1314
+ case GI_INFO_TYPE_INVALID:
1315
+ case GI_INFO_TYPE_FUNCTION:
1316
+ case GI_INFO_TYPE_CALLBACK:
445
1317
  rb_raise(rb_eNotImpError,
446
1318
  "TODO: allocates GIArgument(interface)[%s] for output",
447
1319
  g_info_type_to_string(interface_type));
448
1320
  break;
449
- case GI_INFO_TYPE_STRUCT:
450
- {
451
- gsize struct_size;
1321
+ case GI_INFO_TYPE_STRUCT:
1322
+ {
1323
+ gsize struct_size;
452
1324
 
453
- struct_size = g_struct_info_get_size(interface_info);
454
- argument->v_pointer = xmalloc(struct_size);
455
- memset(argument->v_pointer, 0, struct_size);
456
- }
457
- break;
458
- case GI_INFO_TYPE_BOXED:
459
- case GI_INFO_TYPE_ENUM:
460
- case GI_INFO_TYPE_FLAGS:
461
- case GI_INFO_TYPE_OBJECT:
462
- case GI_INFO_TYPE_INTERFACE:
463
- case GI_INFO_TYPE_CONSTANT:
464
- case GI_INFO_TYPE_INVALID_0:
465
- case GI_INFO_TYPE_UNION:
466
- case GI_INFO_TYPE_VALUE:
467
- case GI_INFO_TYPE_SIGNAL:
468
- case GI_INFO_TYPE_VFUNC:
469
- case GI_INFO_TYPE_PROPERTY:
470
- case GI_INFO_TYPE_FIELD:
471
- case GI_INFO_TYPE_ARG:
472
- case GI_INFO_TYPE_TYPE:
473
- case GI_INFO_TYPE_UNRESOLVED:
1325
+ struct_size = g_struct_info_get_size(interface_info);
1326
+ argument->v_pointer = xmalloc(struct_size);
1327
+ memset(argument->v_pointer, 0, struct_size);
1328
+ }
1329
+ break;
1330
+ case GI_INFO_TYPE_BOXED:
1331
+ case GI_INFO_TYPE_ENUM:
1332
+ case GI_INFO_TYPE_FLAGS:
1333
+ case GI_INFO_TYPE_OBJECT:
1334
+ case GI_INFO_TYPE_INTERFACE:
1335
+ case GI_INFO_TYPE_CONSTANT:
1336
+ case GI_INFO_TYPE_INVALID_0:
1337
+ case GI_INFO_TYPE_UNION:
1338
+ case GI_INFO_TYPE_VALUE:
1339
+ case GI_INFO_TYPE_SIGNAL:
1340
+ case GI_INFO_TYPE_VFUNC:
1341
+ case GI_INFO_TYPE_PROPERTY:
1342
+ case GI_INFO_TYPE_FIELD:
1343
+ case GI_INFO_TYPE_ARG:
1344
+ case GI_INFO_TYPE_TYPE:
1345
+ case GI_INFO_TYPE_UNRESOLVED:
474
1346
  rb_raise(rb_eNotImpError,
475
1347
  "TODO: allocates GIArgument(interface)[%s] for output",
476
1348
  g_info_type_to_string(interface_type));
477
1349
  break;
478
- default:
1350
+ default:
479
1351
  g_assert_not_reached();
480
1352
  break;
481
1353
  }
@@ -494,270 +1366,353 @@ rb_gi_out_argument_init(GIArgument *argument, GIArgInfo *arg_info)
494
1366
  g_arg_info_load_type(arg_info, &type_info);
495
1367
  type_tag = g_type_info_get_tag(&type_info);
496
1368
  switch (type_tag) {
497
- case GI_TYPE_TAG_VOID:
1369
+ case GI_TYPE_TAG_VOID:
498
1370
  break;
499
- case GI_TYPE_TAG_BOOLEAN:
1371
+ case GI_TYPE_TAG_BOOLEAN:
500
1372
  argument->v_pointer = ALLOC(gboolean);
501
1373
  break;
502
- case GI_TYPE_TAG_INT8:
1374
+ case GI_TYPE_TAG_INT8:
503
1375
  argument->v_pointer = ALLOC(gint8);
504
1376
  break;
505
- case GI_TYPE_TAG_UINT8:
1377
+ case GI_TYPE_TAG_UINT8:
506
1378
  argument->v_pointer = ALLOC(guint8);
507
1379
  break;
508
- case GI_TYPE_TAG_INT16:
1380
+ case GI_TYPE_TAG_INT16:
509
1381
  argument->v_pointer = ALLOC(gint16);
510
1382
  break;
511
- case GI_TYPE_TAG_UINT16:
1383
+ case GI_TYPE_TAG_UINT16:
512
1384
  argument->v_pointer = ALLOC(guint16);
513
1385
  break;
514
- case GI_TYPE_TAG_INT32:
1386
+ case GI_TYPE_TAG_INT32:
515
1387
  argument->v_pointer = ALLOC(gint32);
516
1388
  break;
517
- case GI_TYPE_TAG_UINT32:
1389
+ case GI_TYPE_TAG_UINT32:
518
1390
  argument->v_pointer = ALLOC(guint32);
519
1391
  break;
520
- case GI_TYPE_TAG_INT64:
1392
+ case GI_TYPE_TAG_INT64:
521
1393
  argument->v_pointer = ALLOC(gint64);
522
1394
  break;
523
- case GI_TYPE_TAG_UINT64:
1395
+ case GI_TYPE_TAG_UINT64:
524
1396
  argument->v_pointer = ALLOC(guint64);
525
1397
  break;
526
- case GI_TYPE_TAG_FLOAT:
1398
+ case GI_TYPE_TAG_FLOAT:
527
1399
  argument->v_pointer = ALLOC(gfloat);
528
1400
  break;
529
- case GI_TYPE_TAG_DOUBLE:
1401
+ case GI_TYPE_TAG_DOUBLE:
530
1402
  argument->v_pointer = ALLOC(gdouble);
531
1403
  break;
532
- case GI_TYPE_TAG_GTYPE:
1404
+ case GI_TYPE_TAG_GTYPE:
533
1405
  argument->v_pointer = ALLOC(GType);
534
1406
  break;
535
- case GI_TYPE_TAG_UTF8:
536
- case GI_TYPE_TAG_FILENAME:
1407
+ case GI_TYPE_TAG_UTF8:
1408
+ case GI_TYPE_TAG_FILENAME:
537
1409
  argument->v_pointer = ALLOC(gchar *);
538
1410
  break;
539
- case GI_TYPE_TAG_ARRAY:
540
- argument->v_pointer = ALLOC(gpointer);
1411
+ case GI_TYPE_TAG_ARRAY:
1412
+ rb_gi_out_argument_init_array(argument, arg_info, &type_info);
541
1413
  break;
542
- case GI_TYPE_TAG_INTERFACE:
1414
+ case GI_TYPE_TAG_INTERFACE:
543
1415
  rb_gi_out_argument_init_interface(argument, arg_info, &type_info);
544
1416
  break;
545
- case GI_TYPE_TAG_GLIST:
546
- case GI_TYPE_TAG_GSLIST:
547
- case GI_TYPE_TAG_GHASH:
1417
+ case GI_TYPE_TAG_GLIST:
1418
+ case GI_TYPE_TAG_GSLIST:
1419
+ case GI_TYPE_TAG_GHASH:
548
1420
  argument->v_pointer = ALLOC(gpointer);
549
1421
  break;
550
- case GI_TYPE_TAG_ERROR:
1422
+ case GI_TYPE_TAG_ERROR:
551
1423
  argument->v_pointer = ALLOC(GError *);
552
1424
  memset(argument->v_pointer, 0, sizeof(GError *));
553
1425
  break;
554
- case GI_TYPE_TAG_UNICHAR:
1426
+ case GI_TYPE_TAG_UNICHAR:
555
1427
  argument->v_pointer = ALLOC(gunichar);
556
1428
  break;
557
- default:
1429
+ default:
558
1430
  g_assert_not_reached();
559
1431
  break;
560
1432
  }
561
1433
  }
562
1434
 
563
1435
  VALUE
564
- rb_gi_out_argument_to_ruby(GIArgument *argument, GIArgInfo *arg_info)
1436
+ rb_gi_out_argument_to_ruby(GIArgument *argument,
1437
+ GIArgInfo *arg_info,
1438
+ GArray *in_args,
1439
+ GArray *out_args,
1440
+ GPtrArray *args_metadata)
565
1441
  {
566
1442
  GIArgument normalized_argument;
567
1443
  GITypeInfo type_info;
568
1444
  GITypeTag type_tag;
1445
+ gboolean duplicate = FALSE;
569
1446
 
570
1447
  memset(&normalized_argument, 0, sizeof(GIArgument));
571
1448
  g_arg_info_load_type(arg_info, &type_info);
572
1449
  type_tag = g_type_info_get_tag(&type_info);
573
1450
  switch (type_tag) {
574
- case GI_TYPE_TAG_VOID:
1451
+ case GI_TYPE_TAG_VOID:
575
1452
  break;
576
- case GI_TYPE_TAG_BOOLEAN:
1453
+ case GI_TYPE_TAG_BOOLEAN:
577
1454
  normalized_argument.v_boolean = *((gboolean *)(argument->v_pointer));
578
1455
  break;
579
- case GI_TYPE_TAG_INT8:
1456
+ case GI_TYPE_TAG_INT8:
580
1457
  normalized_argument.v_int8 = *((gint8 *)(argument->v_pointer));
581
1458
  break;
582
- case GI_TYPE_TAG_UINT8:
1459
+ case GI_TYPE_TAG_UINT8:
583
1460
  normalized_argument.v_uint8 = *((guint8 *)(argument->v_pointer));
584
1461
  break;
585
- case GI_TYPE_TAG_INT16:
1462
+ case GI_TYPE_TAG_INT16:
586
1463
  normalized_argument.v_int16 = *((gint16 *)(argument->v_pointer));
587
1464
  break;
588
- case GI_TYPE_TAG_UINT16:
1465
+ case GI_TYPE_TAG_UINT16:
589
1466
  normalized_argument.v_uint16 = *((guint16 *)(argument->v_pointer));
590
1467
  break;
591
- case GI_TYPE_TAG_INT32:
1468
+ case GI_TYPE_TAG_INT32:
592
1469
  normalized_argument.v_int32 = *((gint32 *)(argument->v_pointer));
593
1470
  break;
594
- case GI_TYPE_TAG_UINT32:
1471
+ case GI_TYPE_TAG_UINT32:
595
1472
  normalized_argument.v_uint32 = *((guint32 *)(argument->v_pointer));
596
1473
  break;
597
- case GI_TYPE_TAG_INT64:
1474
+ case GI_TYPE_TAG_INT64:
598
1475
  normalized_argument.v_int64 = *((gint64 *)(argument->v_pointer));
599
1476
  break;
600
- case GI_TYPE_TAG_UINT64:
1477
+ case GI_TYPE_TAG_UINT64:
601
1478
  normalized_argument.v_uint64 = *((guint64 *)(argument->v_pointer));
602
1479
  break;
603
- case GI_TYPE_TAG_FLOAT:
1480
+ case GI_TYPE_TAG_FLOAT:
604
1481
  normalized_argument.v_float = *((gfloat *)(argument->v_pointer));
605
1482
  break;
606
- case GI_TYPE_TAG_DOUBLE:
1483
+ case GI_TYPE_TAG_DOUBLE:
607
1484
  normalized_argument.v_double = *((gdouble *)(argument->v_pointer));
608
1485
  break;
609
- case GI_TYPE_TAG_GTYPE:
1486
+ case GI_TYPE_TAG_GTYPE:
610
1487
  normalized_argument.v_size = *((GType *)(argument->v_pointer));
611
1488
  break;
612
- case GI_TYPE_TAG_UTF8:
613
- case GI_TYPE_TAG_FILENAME:
1489
+ case GI_TYPE_TAG_UTF8:
1490
+ case GI_TYPE_TAG_FILENAME:
614
1491
  normalized_argument.v_string = *((gchar **)(argument->v_pointer));
615
1492
  break;
616
- case GI_TYPE_TAG_ARRAY:
617
- case GI_TYPE_TAG_INTERFACE:
618
- case GI_TYPE_TAG_GLIST:
619
- case GI_TYPE_TAG_GSLIST:
620
- case GI_TYPE_TAG_GHASH:
1493
+ case GI_TYPE_TAG_ARRAY:
1494
+ case GI_TYPE_TAG_INTERFACE:
1495
+ case GI_TYPE_TAG_GLIST:
1496
+ case GI_TYPE_TAG_GSLIST:
1497
+ case GI_TYPE_TAG_GHASH:
621
1498
  if (g_arg_info_is_caller_allocates(arg_info)) {
1499
+ duplicate = TRUE;
622
1500
  normalized_argument.v_pointer = argument->v_pointer;
623
1501
  } else {
624
1502
  normalized_argument.v_pointer = *((gpointer *)(argument->v_pointer));
625
1503
  }
626
1504
  break;
627
- case GI_TYPE_TAG_ERROR:
1505
+ case GI_TYPE_TAG_ERROR:
628
1506
  normalized_argument.v_pointer = *((GError **)(argument->v_pointer));
629
1507
  break;
630
- case GI_TYPE_TAG_UNICHAR:
1508
+ case GI_TYPE_TAG_UNICHAR:
631
1509
  normalized_argument.v_uint32 = *((guint32 *)(argument->v_pointer));
632
1510
  break;
633
- default:
1511
+ default:
634
1512
  g_assert_not_reached();
635
1513
  break;
636
1514
  }
637
1515
 
638
- return rb_gi_argument_to_ruby(&normalized_argument, &type_info);
1516
+ return rb_gi_argument_to_ruby(&normalized_argument,
1517
+ duplicate,
1518
+ &type_info,
1519
+ in_args,
1520
+ out_args,
1521
+ args_metadata);
639
1522
  }
640
1523
 
641
1524
  static void
642
- normalize_out_array_length(GIArgument *normalized_argument,
643
- GIArgument *argument,
644
- GITypeInfo *type_info)
1525
+ rb_gi_out_argument_fin_array(GIArgument *argument,
1526
+ G_GNUC_UNUSED GIArgInfo *arg_info,
1527
+ GITypeInfo *array_type_info)
645
1528
  {
1529
+ GIArrayType array_type;
1530
+
1531
+ array_type = g_type_info_get_array_type(array_type_info);
1532
+
1533
+ switch (array_type) {
1534
+ case GI_ARRAY_TYPE_C:
1535
+ rb_raise(rb_eNotImpError,
1536
+ "TODO: free out GIArgument(array)[c]");
1537
+ break;
1538
+ case GI_ARRAY_TYPE_ARRAY:
1539
+ g_array_free(argument->v_pointer, TRUE);
1540
+ break;
1541
+ case GI_ARRAY_TYPE_PTR_ARRAY:
1542
+ rb_raise(rb_eNotImpError,
1543
+ "TODO: free out GIArgument(array)[ptr-array]");
1544
+ break;
1545
+ case GI_ARRAY_TYPE_BYTE_ARRAY:
1546
+ rb_raise(rb_eNotImpError,
1547
+ "TODO: free out GIArgument(array)[byte-array]");
1548
+ break;
1549
+ default:
1550
+ g_assert_not_reached();
1551
+ break;
1552
+ }
1553
+ }
1554
+
1555
+ void
1556
+ rb_gi_out_argument_fin(GIArgument *argument, GIArgInfo *arg_info)
1557
+ {
1558
+ GITypeInfo type_info;
646
1559
  GITypeTag type_tag;
647
1560
 
648
- type_tag = g_type_info_get_tag(type_info);
1561
+ if (g_arg_info_get_direction(arg_info) != GI_DIRECTION_OUT) {
1562
+ return;
1563
+ }
1564
+
1565
+ g_arg_info_load_type(arg_info, &type_info);
1566
+ type_tag = g_type_info_get_tag(&type_info);
1567
+
649
1568
  switch (type_tag) {
650
- case GI_TYPE_TAG_VOID:
651
- case GI_TYPE_TAG_BOOLEAN:
1569
+ case GI_TYPE_TAG_VOID:
1570
+ case GI_TYPE_TAG_BOOLEAN:
1571
+ case GI_TYPE_TAG_INT8:
1572
+ case GI_TYPE_TAG_UINT8:
1573
+ case GI_TYPE_TAG_INT16:
1574
+ case GI_TYPE_TAG_UINT16:
1575
+ case GI_TYPE_TAG_INT32:
1576
+ case GI_TYPE_TAG_UINT32:
1577
+ case GI_TYPE_TAG_INT64:
1578
+ case GI_TYPE_TAG_UINT64:
1579
+ case GI_TYPE_TAG_FLOAT:
1580
+ case GI_TYPE_TAG_DOUBLE:
1581
+ case GI_TYPE_TAG_GTYPE:
1582
+ case GI_TYPE_TAG_UTF8:
1583
+ xfree(argument->v_pointer);
1584
+ break;
1585
+ case GI_TYPE_TAG_FILENAME:
652
1586
  rb_raise(rb_eNotImpError,
653
- "TODO: invalid out array length argument?: <%s>",
1587
+ "TODO: free out GIArgument(%s)",
654
1588
  g_type_tag_to_string(type_tag));
655
1589
  break;
656
- case GI_TYPE_TAG_INT8:
657
- normalized_argument->v_int8 = *((gint8 *)argument->v_pointer);
1590
+ case GI_TYPE_TAG_ARRAY:
1591
+ rb_gi_out_argument_fin_array(argument, arg_info, &type_info);
658
1592
  break;
659
- case GI_TYPE_TAG_UINT8:
660
- normalized_argument->v_uint8 = *((guint8 *)argument->v_pointer);
1593
+ case GI_TYPE_TAG_INTERFACE:
1594
+ case GI_TYPE_TAG_GLIST:
1595
+ case GI_TYPE_TAG_GSLIST:
1596
+ case GI_TYPE_TAG_GHASH:
1597
+ case GI_TYPE_TAG_ERROR:
1598
+ case GI_TYPE_TAG_UNICHAR:
1599
+ xfree(argument->v_pointer);
661
1600
  break;
662
- case GI_TYPE_TAG_INT16:
663
- normalized_argument->v_int16 = *((gint16 *)argument->v_pointer);
1601
+ default:
1602
+ g_assert_not_reached();
664
1603
  break;
665
- case GI_TYPE_TAG_UINT16:
666
- normalized_argument->v_uint16 = *((guint16 *)argument->v_pointer);
1604
+ }
1605
+ }
1606
+
1607
+ static void
1608
+ rb_gi_return_argument_free_container(GIArgument *argument,
1609
+ GITypeInfo *type_info)
1610
+ {
1611
+ GITypeTag type_tag;
1612
+
1613
+ type_tag = g_type_info_get_tag(type_info);
1614
+
1615
+ switch (type_tag) {
1616
+ case GI_TYPE_TAG_VOID:
1617
+ case GI_TYPE_TAG_BOOLEAN:
1618
+ case GI_TYPE_TAG_INT8:
1619
+ case GI_TYPE_TAG_UINT8:
1620
+ case GI_TYPE_TAG_INT16:
1621
+ case GI_TYPE_TAG_UINT16:
1622
+ case GI_TYPE_TAG_INT32:
1623
+ case GI_TYPE_TAG_UINT32:
1624
+ case GI_TYPE_TAG_INT64:
1625
+ case GI_TYPE_TAG_UINT64:
1626
+ case GI_TYPE_TAG_FLOAT:
1627
+ case GI_TYPE_TAG_DOUBLE:
1628
+ case GI_TYPE_TAG_GTYPE:
1629
+ case GI_TYPE_TAG_UTF8:
1630
+ case GI_TYPE_TAG_FILENAME:
1631
+ rb_raise(rb_eNotImpError,
1632
+ "TODO: free GIArgument(%s) as container",
1633
+ g_type_tag_to_string(type_tag));
667
1634
  break;
668
- case GI_TYPE_TAG_INT32:
669
- normalized_argument->v_int32 = *((gint32 *)argument->v_pointer);
1635
+ case GI_TYPE_TAG_ARRAY:
1636
+ g_free(argument->v_pointer);
670
1637
  break;
671
- case GI_TYPE_TAG_UINT32:
672
- normalized_argument->v_uint32 = *((guint32 *)argument->v_pointer);
1638
+ case GI_TYPE_TAG_INTERFACE:
1639
+ rb_raise(rb_eNotImpError,
1640
+ "TODO: free GIArgument(%s) as container",
1641
+ g_type_tag_to_string(type_tag));
673
1642
  break;
674
- case GI_TYPE_TAG_INT64:
675
- normalized_argument->v_int64 = *((gint64 *)argument->v_pointer);
1643
+ case GI_TYPE_TAG_GLIST:
1644
+ g_list_free(argument->v_pointer);
676
1645
  break;
677
- case GI_TYPE_TAG_UINT64:
678
- normalized_argument->v_uint64 = *((guint64 *)argument->v_pointer);
1646
+ case GI_TYPE_TAG_GSLIST:
1647
+ g_slist_free(argument->v_pointer);
679
1648
  break;
680
- case GI_TYPE_TAG_FLOAT:
681
- case GI_TYPE_TAG_DOUBLE:
682
- case GI_TYPE_TAG_GTYPE:
683
- case GI_TYPE_TAG_UTF8:
684
- case GI_TYPE_TAG_FILENAME:
685
- case GI_TYPE_TAG_ARRAY:
686
- case GI_TYPE_TAG_INTERFACE:
687
- case GI_TYPE_TAG_GLIST:
688
- case GI_TYPE_TAG_GSLIST:
689
- case GI_TYPE_TAG_GHASH:
690
- case GI_TYPE_TAG_ERROR:
691
- case GI_TYPE_TAG_UNICHAR:
1649
+ case GI_TYPE_TAG_GHASH:
1650
+ case GI_TYPE_TAG_ERROR:
1651
+ case GI_TYPE_TAG_UNICHAR:
692
1652
  rb_raise(rb_eNotImpError,
693
- "TODO: invalid out array length argument?: <%s>",
1653
+ "TODO: free GIArgument(%s) as container",
694
1654
  g_type_tag_to_string(type_tag));
695
1655
  break;
696
- default:
1656
+ default:
697
1657
  g_assert_not_reached();
698
1658
  break;
699
1659
  }
700
1660
  }
701
1661
 
702
- VALUE
703
- rb_gi_out_array_argument_to_ruby(GIArgument *array_argument,
704
- GIArgument *length_argument,
705
- GIArgInfo *array_arg_info,
706
- GIArgInfo *length_arg_info)
1662
+ static void
1663
+ rb_gi_return_argument_free_everything_array_c(GIArgument *argument,
1664
+ GITypeInfo *type_info)
707
1665
  {
708
- VALUE rb_array;
709
- GIArgument normalized_array_argument;
710
- GITypeInfo array_type_info;
711
-
712
- normalized_array_argument.v_pointer =
713
- *((gpointer *)(array_argument->v_pointer));
714
- g_arg_info_load_type(array_arg_info, &array_type_info);
715
- if (length_argument) {
716
- GITypeInfo length_type_info;
717
- GIArgument normalized_length_argument;
718
-
719
- g_arg_info_load_type(length_arg_info, &length_type_info);
720
- normalize_out_array_length(&normalized_length_argument,
721
- length_argument,
722
- &length_type_info);
723
- rb_array = rb_gi_array_argument_to_ruby(&normalized_array_argument,
724
- &normalized_length_argument,
725
- &array_type_info,
726
- &length_type_info);
727
- } else {
728
- rb_array = rb_gi_array_argument_to_ruby(&normalized_array_argument,
729
- NULL,
730
- &array_type_info,
731
- NULL);
732
- }
733
-
734
- return rb_array;
735
- }
1666
+ GITypeInfo *element_type_info;
1667
+ GITypeTag element_type_tag;
736
1668
 
737
- void
738
- rb_gi_out_argument_fin(GIArgument *argument, GIArgInfo *arg_info)
739
- {
740
- GITypeInfo type_info;
1669
+ element_type_info = g_type_info_get_param_type(type_info, 0);
1670
+ element_type_tag = g_type_info_get_tag(element_type_info);
1671
+ g_base_info_unref(element_type_info);
741
1672
 
742
- if (g_arg_info_get_direction(arg_info) != GI_DIRECTION_OUT) {
743
- return;
1673
+ switch (element_type_tag) {
1674
+ case GI_TYPE_TAG_VOID:
1675
+ case GI_TYPE_TAG_BOOLEAN:
1676
+ case GI_TYPE_TAG_INT8:
1677
+ rb_raise(rb_eNotImpError,
1678
+ "TODO: free GIArgument(array)[c][%s] everything",
1679
+ g_type_tag_to_string(element_type_tag));
1680
+ break;
1681
+ case GI_TYPE_TAG_UINT8:
1682
+ g_free(argument->v_pointer);
1683
+ break;
1684
+ case GI_TYPE_TAG_INT16:
1685
+ case GI_TYPE_TAG_UINT16:
1686
+ case GI_TYPE_TAG_INT32:
1687
+ case GI_TYPE_TAG_UINT32:
1688
+ case GI_TYPE_TAG_INT64:
1689
+ case GI_TYPE_TAG_UINT64:
1690
+ case GI_TYPE_TAG_FLOAT:
1691
+ case GI_TYPE_TAG_DOUBLE:
1692
+ case GI_TYPE_TAG_GTYPE:
1693
+ rb_raise(rb_eNotImpError,
1694
+ "TODO: free GIArgument(array)[c][%s] everything",
1695
+ g_type_tag_to_string(element_type_tag));
1696
+ break;
1697
+ case GI_TYPE_TAG_UTF8:
1698
+ g_strfreev(argument->v_pointer);
1699
+ break;
1700
+ case GI_TYPE_TAG_FILENAME:
1701
+ case GI_TYPE_TAG_ARRAY:
1702
+ case GI_TYPE_TAG_INTERFACE:
1703
+ case GI_TYPE_TAG_GLIST:
1704
+ case GI_TYPE_TAG_GSLIST:
1705
+ case GI_TYPE_TAG_GHASH:
1706
+ case GI_TYPE_TAG_ERROR:
1707
+ case GI_TYPE_TAG_UNICHAR:
1708
+ rb_raise(rb_eNotImpError,
1709
+ "TODO: free GIArgument(array)[c][%s] everything",
1710
+ g_type_tag_to_string(element_type_tag));
1711
+ break;
1712
+ default:
1713
+ g_assert_not_reached();
1714
+ break;
744
1715
  }
745
-
746
- g_arg_info_load_type(arg_info, &type_info);
747
- xfree(argument->v_pointer);
748
- }
749
-
750
- static void
751
- rb_gi_return_argument_free_container(G_GNUC_UNUSED GIArgument *argument,
752
- GITypeInfo *type_info)
753
- {
754
- GITypeTag type_tag;
755
-
756
- type_tag = g_type_info_get_tag(type_info);
757
-
758
- rb_raise(rb_eNotImpError,
759
- "TODO: free GIArgument(%s) as container",
760
- g_type_tag_to_string(type_tag));
761
1716
  }
762
1717
 
763
1718
  static void
@@ -765,19 +1720,19 @@ rb_gi_return_argument_free_everything_array(GIArgument *argument,
765
1720
  GITypeInfo *type_info)
766
1721
  {
767
1722
  switch (g_type_info_get_array_type(type_info)) {
768
- case GI_ARRAY_TYPE_C:
769
- g_strfreev(argument->v_pointer);
1723
+ case GI_ARRAY_TYPE_C:
1724
+ rb_gi_return_argument_free_everything_array_c(argument, type_info);
770
1725
  break;
771
- case GI_ARRAY_TYPE_ARRAY:
1726
+ case GI_ARRAY_TYPE_ARRAY:
772
1727
  g_array_free(argument->v_pointer, TRUE);
773
1728
  break;
774
- case GI_ARRAY_TYPE_PTR_ARRAY:
1729
+ case GI_ARRAY_TYPE_PTR_ARRAY:
775
1730
  g_ptr_array_free(argument->v_pointer, TRUE);
776
1731
  break;
777
- case GI_ARRAY_TYPE_BYTE_ARRAY:
1732
+ case GI_ARRAY_TYPE_BYTE_ARRAY:
778
1733
  g_ptr_array_free(argument->v_pointer, TRUE);
779
1734
  break;
780
- default:
1735
+ default:
781
1736
  g_assert_not_reached();
782
1737
  break;
783
1738
  }
@@ -816,87 +1771,173 @@ rb_gi_return_argument_free_everything_interface(GIArgument *argument,
816
1771
  g_base_info_unref(interface_info);
817
1772
 
818
1773
  switch (interface_type) {
819
- case GI_INFO_TYPE_INVALID:
1774
+ case GI_INFO_TYPE_INVALID:
820
1775
  rb_raise(rb_eNotImpError,
821
1776
  "TODO: free GIArgument(interface)[invalid] everything");
822
1777
  break;
823
- case GI_INFO_TYPE_FUNCTION:
1778
+ case GI_INFO_TYPE_FUNCTION:
824
1779
  rb_raise(rb_eNotImpError,
825
1780
  "TODO: free GIArgument(interface)[function] everything");
826
1781
  break;
827
- case GI_INFO_TYPE_CALLBACK:
1782
+ case GI_INFO_TYPE_CALLBACK:
828
1783
  rb_raise(rb_eNotImpError,
829
1784
  "TODO: free GIArgument(interface)[callback] everything");
830
1785
  break;
831
- case GI_INFO_TYPE_STRUCT:
1786
+ case GI_INFO_TYPE_STRUCT:
832
1787
  rb_gi_return_argument_free_everything_interface_struct(argument, gtype);
833
1788
  break;
834
- case GI_INFO_TYPE_BOXED:
1789
+ case GI_INFO_TYPE_BOXED:
835
1790
  rb_raise(rb_eNotImpError,
836
1791
  "TODO: free GIArgument(interface)[boxed] everything");
837
1792
  break;
838
- case GI_INFO_TYPE_ENUM:
1793
+ case GI_INFO_TYPE_ENUM:
839
1794
  rb_raise(rb_eNotImpError,
840
1795
  "TODO: free GIArgument(interface)[enum] everything");
841
1796
  break;
842
- case GI_INFO_TYPE_FLAGS:
1797
+ case GI_INFO_TYPE_FLAGS:
843
1798
  rb_raise(rb_eNotImpError,
844
1799
  "TODO: free GIArgument(interface)[flags] everything");
845
1800
  break;
846
- case GI_INFO_TYPE_OBJECT:
1801
+ case GI_INFO_TYPE_OBJECT:
847
1802
  if (argument->v_pointer) {
848
1803
  g_object_unref(argument->v_pointer);
849
1804
  }
850
1805
  break;
851
- case GI_INFO_TYPE_INTERFACE:
1806
+ case GI_INFO_TYPE_INTERFACE:
852
1807
  if (argument->v_pointer) {
853
1808
  g_object_unref(argument->v_pointer);
854
1809
  }
855
1810
  break;
856
- case GI_INFO_TYPE_CONSTANT:
1811
+ case GI_INFO_TYPE_CONSTANT:
857
1812
  rb_raise(rb_eNotImpError,
858
1813
  "TODO: free GIArgument(interface)[constant] everything");
859
1814
  break;
860
- case GI_INFO_TYPE_INVALID_0:
1815
+ case GI_INFO_TYPE_INVALID_0:
861
1816
  g_assert_not_reached();
862
1817
  break;
863
- case GI_INFO_TYPE_UNION:
1818
+ case GI_INFO_TYPE_UNION:
864
1819
  rb_raise(rb_eNotImpError,
865
1820
  "TODO: free GIArgument(interface)[union] everything");
866
1821
  break;
867
- case GI_INFO_TYPE_VALUE:
1822
+ case GI_INFO_TYPE_VALUE:
868
1823
  rb_raise(rb_eNotImpError,
869
1824
  "TODO: free GIArgument(interface)[value] everything");
870
1825
  break;
871
- case GI_INFO_TYPE_SIGNAL:
1826
+ case GI_INFO_TYPE_SIGNAL:
872
1827
  rb_raise(rb_eNotImpError,
873
1828
  "TODO: free GIArgument(interface)[signal] everything");
874
1829
  break;
875
- case GI_INFO_TYPE_VFUNC:
1830
+ case GI_INFO_TYPE_VFUNC:
876
1831
  rb_raise(rb_eNotImpError,
877
1832
  "TODO: free GIArgument(interface)[vfunc] everything");
878
1833
  break;
879
- case GI_INFO_TYPE_PROPERTY:
1834
+ case GI_INFO_TYPE_PROPERTY:
880
1835
  rb_raise(rb_eNotImpError,
881
1836
  "TODO: free GIArgument(interface)[property] everything");
882
1837
  break;
883
- case GI_INFO_TYPE_FIELD:
1838
+ case GI_INFO_TYPE_FIELD:
884
1839
  rb_raise(rb_eNotImpError,
885
1840
  "TODO: free GIArgument(interface)[field] everything");
886
1841
  break;
887
- case GI_INFO_TYPE_ARG:
1842
+ case GI_INFO_TYPE_ARG:
888
1843
  rb_raise(rb_eNotImpError,
889
1844
  "TODO: free GIArgument(interface)[arg] everything");
890
1845
  break;
891
- case GI_INFO_TYPE_TYPE:
1846
+ case GI_INFO_TYPE_TYPE:
892
1847
  rb_raise(rb_eNotImpError,
893
1848
  "TODO: free GIArgument(interface)[type] everything");
894
1849
  break;
895
- case GI_INFO_TYPE_UNRESOLVED:
1850
+ case GI_INFO_TYPE_UNRESOLVED:
896
1851
  rb_raise(rb_eNotImpError,
897
1852
  "TODO: free GIArgument(interface)[unresolved] everything");
898
1853
  break;
899
- default:
1854
+ default:
1855
+ g_assert_not_reached();
1856
+ break;
1857
+ }
1858
+ }
1859
+
1860
+ static void
1861
+ rb_gi_boxed_free_callback(gpointer boxed, gpointer user_data)
1862
+ {
1863
+ GType *gtype = user_data;
1864
+
1865
+ g_boxed_free(*gtype, boxed);
1866
+ }
1867
+
1868
+
1869
+ static void
1870
+ rb_gi_return_argument_free_everything_glist_interface(GIArgument *argument,
1871
+ G_GNUC_UNUSED GITypeInfo *type_info,
1872
+ GITypeInfo *element_type_info)
1873
+ {
1874
+ GIBaseInfo *interface_info;
1875
+ GIInfoType interface_type;
1876
+ const gchar *interface_name;
1877
+ GType gtype;
1878
+
1879
+ interface_info = g_type_info_get_interface(element_type_info);
1880
+ interface_type = g_base_info_get_type(interface_info);
1881
+ interface_name = g_info_type_to_string(interface_type);
1882
+ gtype = g_registered_type_info_get_g_type(interface_info);
1883
+ g_base_info_unref(interface_info);
1884
+ g_base_info_unref(element_type_info);
1885
+
1886
+ switch (interface_type) {
1887
+ case GI_INFO_TYPE_INVALID:
1888
+ case GI_INFO_TYPE_FUNCTION:
1889
+ case GI_INFO_TYPE_CALLBACK:
1890
+ rb_raise(rb_eNotImpError,
1891
+ "TODO: free GIArgument(GList)[interface(%s)](%s) everything",
1892
+ interface_name,
1893
+ g_type_name(gtype));
1894
+ break;
1895
+ case GI_INFO_TYPE_STRUCT:
1896
+ if (gtype == G_TYPE_NONE) {
1897
+ rb_raise(rb_eNotImpError,
1898
+ "TODO: free GIArgument(GList)[interface(%s)](%s) everything",
1899
+ interface_name,
1900
+ g_type_name(gtype));
1901
+ } else {
1902
+ g_list_foreach(argument->v_pointer,
1903
+ rb_gi_boxed_free_callback,
1904
+ &gtype);
1905
+ g_list_free(argument->v_pointer);
1906
+ }
1907
+ break;
1908
+ case GI_INFO_TYPE_BOXED:
1909
+ g_list_foreach(argument->v_pointer, rb_gi_boxed_free_callback, &gtype);
1910
+ g_list_free(argument->v_pointer);
1911
+ break;
1912
+ case GI_INFO_TYPE_ENUM:
1913
+ case GI_INFO_TYPE_FLAGS:
1914
+ rb_raise(rb_eNotImpError,
1915
+ "TODO: free GIArgument(GList)[interface(%s)](%s) everything",
1916
+ interface_name,
1917
+ g_type_name(gtype));
1918
+ break;
1919
+ case GI_INFO_TYPE_OBJECT:
1920
+ case GI_INFO_TYPE_INTERFACE:
1921
+ g_list_foreach(argument->v_pointer, (GFunc)g_object_unref, NULL);
1922
+ g_list_free(argument->v_pointer);
1923
+ break;
1924
+ case GI_INFO_TYPE_CONSTANT:
1925
+ case GI_INFO_TYPE_INVALID_0:
1926
+ case GI_INFO_TYPE_UNION:
1927
+ case GI_INFO_TYPE_VALUE:
1928
+ case GI_INFO_TYPE_SIGNAL:
1929
+ case GI_INFO_TYPE_VFUNC:
1930
+ case GI_INFO_TYPE_PROPERTY:
1931
+ case GI_INFO_TYPE_FIELD:
1932
+ case GI_INFO_TYPE_ARG:
1933
+ case GI_INFO_TYPE_TYPE:
1934
+ case GI_INFO_TYPE_UNRESOLVED:
1935
+ rb_raise(rb_eNotImpError,
1936
+ "TODO: free GIArgument(GList)[interface(%s)](%s) everything",
1937
+ interface_name,
1938
+ g_type_name(gtype));
1939
+ break;
1940
+ default:
900
1941
  g_assert_not_reached();
901
1942
  break;
902
1943
  }
@@ -911,7 +1952,6 @@ rb_gi_return_argument_free_everything_glist(GIArgument *argument,
911
1952
 
912
1953
  element_type_info = g_type_info_get_param_type(type_info, 0);
913
1954
  element_type_tag = g_type_info_get_tag(element_type_info);
914
- g_base_info_unref(element_type_info);
915
1955
 
916
1956
  switch (element_type_tag) {
917
1957
  case GI_TYPE_TAG_VOID:
@@ -927,33 +1967,97 @@ rb_gi_return_argument_free_everything_glist(GIArgument *argument,
927
1967
  case GI_TYPE_TAG_FLOAT:
928
1968
  case GI_TYPE_TAG_DOUBLE:
929
1969
  case GI_TYPE_TAG_GTYPE:
1970
+ g_base_info_unref(element_type_info);
930
1971
  rb_raise(rb_eNotImpError,
931
1972
  "TODO: free GIArgument(GList)[%s] everything",
932
1973
  g_type_tag_to_string(element_type_tag));
933
1974
  break;
934
1975
  case GI_TYPE_TAG_UTF8:
1976
+ g_base_info_unref(element_type_info);
935
1977
  g_list_foreach(argument->v_pointer, (GFunc)g_free, NULL);
936
1978
  g_list_free(argument->v_pointer);
937
1979
  break;
938
1980
  case GI_TYPE_TAG_FILENAME:
939
1981
  case GI_TYPE_TAG_ARRAY:
1982
+ g_base_info_unref(element_type_info);
940
1983
  rb_raise(rb_eNotImpError,
941
1984
  "TODO: free GIArgument(GList)[%s] everything",
942
1985
  g_type_tag_to_string(element_type_tag));
943
1986
  break;
944
1987
  case GI_TYPE_TAG_INTERFACE:
945
- g_list_foreach(argument->v_pointer, (GFunc)g_object_unref, NULL);
946
- g_list_free(argument->v_pointer);
1988
+ rb_gi_return_argument_free_everything_glist_interface(argument,
1989
+ type_info,
1990
+ element_type_info);
947
1991
  break;
948
1992
  case GI_TYPE_TAG_GLIST:
949
1993
  case GI_TYPE_TAG_GSLIST:
950
1994
  case GI_TYPE_TAG_GHASH:
951
1995
  case GI_TYPE_TAG_ERROR:
952
1996
  case GI_TYPE_TAG_UNICHAR:
1997
+ g_base_info_unref(element_type_info);
953
1998
  rb_raise(rb_eNotImpError,
954
1999
  "TODO: free GIArgument(GList)[%s] everything",
955
2000
  g_type_tag_to_string(element_type_tag));
956
2001
  break;
2002
+ default:
2003
+ g_base_info_unref(element_type_info);
2004
+ g_assert_not_reached();
2005
+ break;
2006
+ }
2007
+ }
2008
+
2009
+ static void
2010
+ rb_gi_return_argument_free_everything_gslist(GIArgument *argument,
2011
+ GITypeInfo *type_info)
2012
+ {
2013
+ GITypeInfo *element_type_info;
2014
+ GITypeTag element_type_tag;
2015
+
2016
+ element_type_info = g_type_info_get_param_type(type_info, 0);
2017
+ element_type_tag = g_type_info_get_tag(element_type_info);
2018
+ g_base_info_unref(element_type_info);
2019
+
2020
+ switch (element_type_tag) {
2021
+ case GI_TYPE_TAG_VOID:
2022
+ case GI_TYPE_TAG_BOOLEAN:
2023
+ case GI_TYPE_TAG_INT8:
2024
+ case GI_TYPE_TAG_UINT8:
2025
+ case GI_TYPE_TAG_INT16:
2026
+ case GI_TYPE_TAG_UINT16:
2027
+ case GI_TYPE_TAG_INT32:
2028
+ case GI_TYPE_TAG_UINT32:
2029
+ case GI_TYPE_TAG_INT64:
2030
+ case GI_TYPE_TAG_UINT64:
2031
+ case GI_TYPE_TAG_FLOAT:
2032
+ case GI_TYPE_TAG_DOUBLE:
2033
+ case GI_TYPE_TAG_GTYPE:
2034
+ rb_raise(rb_eNotImpError,
2035
+ "TODO: free GIArgument(GSList)[%s] everything",
2036
+ g_type_tag_to_string(element_type_tag));
2037
+ break;
2038
+ case GI_TYPE_TAG_UTF8:
2039
+ g_slist_foreach(argument->v_pointer, (GFunc)g_free, NULL);
2040
+ g_slist_free(argument->v_pointer);
2041
+ break;
2042
+ case GI_TYPE_TAG_FILENAME:
2043
+ case GI_TYPE_TAG_ARRAY:
2044
+ rb_raise(rb_eNotImpError,
2045
+ "TODO: free GIArgument(GSList)[%s] everything",
2046
+ g_type_tag_to_string(element_type_tag));
2047
+ break;
2048
+ case GI_TYPE_TAG_INTERFACE:
2049
+ g_slist_foreach(argument->v_pointer, (GFunc)g_object_unref, NULL);
2050
+ g_slist_free(argument->v_pointer);
2051
+ break;
2052
+ case GI_TYPE_TAG_GLIST:
2053
+ case GI_TYPE_TAG_GSLIST:
2054
+ case GI_TYPE_TAG_GHASH:
2055
+ case GI_TYPE_TAG_ERROR:
2056
+ case GI_TYPE_TAG_UNICHAR:
2057
+ rb_raise(rb_eNotImpError,
2058
+ "TODO: free GIArgument(GSList)[%s] everything",
2059
+ g_type_tag_to_string(element_type_tag));
2060
+ break;
957
2061
  default:
958
2062
  g_assert_not_reached();
959
2063
  break;
@@ -968,57 +2072,60 @@ rb_gi_return_argument_free_everything(GIArgument *argument,
968
2072
 
969
2073
  type_tag = g_type_info_get_tag(type_info);
970
2074
  switch (type_tag) {
971
- case GI_TYPE_TAG_VOID:
972
- case GI_TYPE_TAG_BOOLEAN:
973
- case GI_TYPE_TAG_INT8:
974
- case GI_TYPE_TAG_UINT8:
975
- case GI_TYPE_TAG_INT16:
976
- case GI_TYPE_TAG_UINT16:
977
- case GI_TYPE_TAG_INT32:
978
- case GI_TYPE_TAG_UINT32:
979
- case GI_TYPE_TAG_INT64:
980
- case GI_TYPE_TAG_UINT64:
981
- case GI_TYPE_TAG_FLOAT:
982
- case GI_TYPE_TAG_DOUBLE:
983
- case GI_TYPE_TAG_GTYPE:
2075
+ case GI_TYPE_TAG_VOID:
2076
+ case GI_TYPE_TAG_BOOLEAN:
2077
+ case GI_TYPE_TAG_INT8:
2078
+ case GI_TYPE_TAG_UINT8:
2079
+ case GI_TYPE_TAG_INT16:
2080
+ case GI_TYPE_TAG_UINT16:
2081
+ case GI_TYPE_TAG_INT32:
2082
+ case GI_TYPE_TAG_UINT32:
2083
+ case GI_TYPE_TAG_INT64:
2084
+ case GI_TYPE_TAG_UINT64:
2085
+ case GI_TYPE_TAG_FLOAT:
2086
+ case GI_TYPE_TAG_DOUBLE:
2087
+ case GI_TYPE_TAG_GTYPE:
984
2088
  rb_raise(rb_eNotImpError,
985
2089
  "TODO: free GIArgument(%s) everything",
986
2090
  g_type_tag_to_string(type_tag));
987
2091
  break;
988
- case GI_TYPE_TAG_UTF8:
2092
+ case GI_TYPE_TAG_UTF8:
989
2093
  g_free(argument->v_string);
990
2094
  break;
991
- case GI_TYPE_TAG_FILENAME:
992
- rb_raise(rb_eNotImpError,
993
- "TODO: free GIArgument(%s) everything",
994
- g_type_tag_to_string(type_tag));
2095
+ case GI_TYPE_TAG_FILENAME:
2096
+ g_free(argument->v_string);
995
2097
  break;
996
- case GI_TYPE_TAG_ARRAY:
2098
+ case GI_TYPE_TAG_ARRAY:
997
2099
  rb_gi_return_argument_free_everything_array(argument, type_info);
998
2100
  break;
999
- case GI_TYPE_TAG_INTERFACE:
2101
+ case GI_TYPE_TAG_INTERFACE:
1000
2102
  rb_gi_return_argument_free_everything_interface(argument, type_info);
1001
2103
  break;
1002
- case GI_TYPE_TAG_GLIST:
2104
+ case GI_TYPE_TAG_GLIST:
1003
2105
  rb_gi_return_argument_free_everything_glist(argument, type_info);
1004
2106
  break;
1005
- case GI_TYPE_TAG_GSLIST:
1006
- case GI_TYPE_TAG_GHASH:
1007
- case GI_TYPE_TAG_ERROR:
1008
- case GI_TYPE_TAG_UNICHAR:
2107
+ case GI_TYPE_TAG_GSLIST:
2108
+ rb_gi_return_argument_free_everything_gslist(argument, type_info);
2109
+ break;
2110
+ case GI_TYPE_TAG_GHASH:
2111
+ case GI_TYPE_TAG_ERROR:
2112
+ case GI_TYPE_TAG_UNICHAR:
1009
2113
  rb_raise(rb_eNotImpError,
1010
2114
  "TODO: free GIArgument(%s) everything",
1011
2115
  g_type_tag_to_string(type_tag));
1012
2116
  break;
1013
- default:
2117
+ default:
1014
2118
  g_assert_not_reached();
1015
2119
  break;
1016
2120
  }
1017
2121
  }
1018
2122
 
1019
2123
  VALUE
1020
- rb_gi_return_argument_to_ruby(GIArgument *argument,
1021
- GICallableInfo *callable_info)
2124
+ rb_gi_return_argument_to_ruby(GICallableInfo *callable_info,
2125
+ GIArgument *argument,
2126
+ GArray *in_args,
2127
+ GArray *out_args,
2128
+ GPtrArray *args_metadata)
1022
2129
  {
1023
2130
  VALUE rb_argument;
1024
2131
  gboolean may_return_null;
@@ -1030,17 +2137,18 @@ rb_gi_return_argument_to_ruby(GIArgument *argument,
1030
2137
  }
1031
2138
 
1032
2139
  g_callable_info_load_return_type(callable_info, &return_value_info);
1033
- rb_argument = rb_gi_argument_to_ruby(argument, &return_value_info);
2140
+ rb_argument = rb_gi_argument_to_ruby(argument, FALSE, &return_value_info,
2141
+ in_args, out_args, args_metadata);
1034
2142
  switch (g_callable_info_get_caller_owns(callable_info)) {
1035
- case GI_TRANSFER_NOTHING:
2143
+ case GI_TRANSFER_NOTHING:
1036
2144
  break;
1037
- case GI_TRANSFER_CONTAINER:
2145
+ case GI_TRANSFER_CONTAINER:
1038
2146
  rb_gi_return_argument_free_container(argument, &return_value_info);
1039
2147
  break;
1040
- case GI_TRANSFER_EVERYTHING:
2148
+ case GI_TRANSFER_EVERYTHING:
1041
2149
  rb_gi_return_argument_free_everything(argument, &return_value_info);
1042
2150
  break;
1043
- default:
2151
+ default:
1044
2152
  g_assert_not_reached();
1045
2153
  break;
1046
2154
  }
@@ -1048,8 +2156,10 @@ rb_gi_return_argument_to_ruby(GIArgument *argument,
1048
2156
  }
1049
2157
 
1050
2158
  static void
1051
- rb_gi_argument_from_ruby_interface(GIArgument *argument, GITypeInfo *type_info,
1052
- VALUE rb_argument)
2159
+ rb_gi_value_argument_from_ruby_interface(GIArgument *argument,
2160
+ GITypeInfo *type_info,
2161
+ VALUE rb_argument,
2162
+ VALUE self)
1053
2163
  {
1054
2164
  GIBaseInfo *interface_info;
1055
2165
  GIInfoType interface_type;
@@ -1058,87 +2168,217 @@ rb_gi_argument_from_ruby_interface(GIArgument *argument, GITypeInfo *type_info,
1058
2168
  interface_info = g_type_info_get_interface(type_info);
1059
2169
  interface_type = g_base_info_get_type(interface_info);
1060
2170
 
1061
- gtype = g_registered_type_info_get_g_type(interface_info);
1062
2171
  switch (interface_type) {
1063
- case GI_INFO_TYPE_INVALID:
1064
- case GI_INFO_TYPE_FUNCTION:
1065
- case GI_INFO_TYPE_CALLBACK:
2172
+ case GI_INFO_TYPE_INVALID:
2173
+ case GI_INFO_TYPE_FUNCTION:
2174
+ case GI_INFO_TYPE_CALLBACK:
1066
2175
  rb_raise(rb_eNotImpError,
1067
2176
  "TODO: Ruby -> GIArgument(interface)[%s]: <%s>",
1068
2177
  g_info_type_to_string(interface_type),
1069
2178
  g_base_info_get_name(interface_info));
1070
2179
  break;
1071
- case GI_INFO_TYPE_STRUCT:
2180
+ case GI_INFO_TYPE_STRUCT:
2181
+ gtype = g_registered_type_info_get_g_type(interface_info);
1072
2182
  if (gtype == G_TYPE_NONE) {
1073
2183
  argument->v_pointer = DATA_PTR(rb_argument);
1074
2184
  } else if (gtype == G_TYPE_VALUE) {
1075
2185
  GValue *gvalue;
1076
- gvalue = ALLOC(GValue);
1077
- memset(gvalue, 0, sizeof(GValue));
1078
- if (rb_obj_is_kind_of(rb_argument, rb_cGLibValue)) {
1079
- GValue *source_gvalue;
1080
- source_gvalue = RVAL2BOXED(rb_argument, G_TYPE_VALUE);
1081
- g_value_init(gvalue, source_gvalue->g_type);
1082
- g_value_copy(source_gvalue, gvalue);
2186
+ if (RVAL2CBOOL(rb_obj_is_kind_of(rb_argument, rb_cGLibValue))) {
2187
+ gvalue = RVAL2BOXED(rb_argument, G_TYPE_VALUE);
1083
2188
  } else {
2189
+ gvalue = ALLOC(GValue);
2190
+ memset(gvalue, 0, sizeof(GValue));
1084
2191
  rbgobj_initialize_gvalue(gvalue, rb_argument);
1085
2192
  }
1086
2193
  argument->v_pointer = gvalue;
2194
+ } else if (gtype == G_TYPE_BYTES) {
2195
+ VALUE rb_string;
2196
+ GBytes *gbytes;
2197
+
2198
+ rb_string = StringValue(rb_argument);
2199
+ gbytes = g_bytes_new(RSTRING_PTR(rb_string),
2200
+ RSTRING_LEN(rb_string));
2201
+ argument->v_pointer = gbytes;
2202
+ } else if (gtype == G_TYPE_CLOSURE) {
2203
+ GClosure *rclosure = NULL;
2204
+
2205
+ rclosure = g_rclosure_new(rb_argument, Qnil, NULL);
2206
+ g_rclosure_attach(rclosure, self);
2207
+ argument->v_pointer = rclosure;
2208
+ } else if (gtype == G_TYPE_VARIANT) {
2209
+ argument->v_pointer = rbg_variant_from_ruby(rb_argument);
2210
+ } else {
2211
+ argument->v_pointer = RVAL2BOXED(rb_argument, gtype);
2212
+ }
2213
+ break;
2214
+ case GI_INFO_TYPE_BOXED:
2215
+ rb_raise(rb_eNotImpError,
2216
+ "TODO: Ruby -> GIArgument(interface)[%s]: <%s>",
2217
+ g_info_type_to_string(interface_type),
2218
+ g_base_info_get_name(interface_info));
2219
+ break;
2220
+ case GI_INFO_TYPE_ENUM:
2221
+ gtype = g_registered_type_info_get_g_type(interface_info);
2222
+ if (gtype == G_TYPE_NONE) {
2223
+ argument->v_int32 = NUM2INT(rb_argument);
2224
+ } else {
2225
+ argument->v_int32 = RVAL2GENUM(rb_argument, gtype);
2226
+ }
2227
+ break;
2228
+ case GI_INFO_TYPE_FLAGS:
2229
+ gtype = g_registered_type_info_get_g_type(interface_info);
2230
+ if (gtype == G_TYPE_NONE) {
2231
+ argument->v_int32 = NUM2INT(rb_argument);
2232
+ } else {
2233
+ argument->v_int32 = RVAL2GFLAGS(rb_argument, gtype);
2234
+ }
2235
+ break;
2236
+ case GI_INFO_TYPE_OBJECT:
2237
+ case GI_INFO_TYPE_INTERFACE:
2238
+ argument->v_pointer = RVAL2GOBJ(rb_argument);
2239
+ break;
2240
+ case GI_INFO_TYPE_CONSTANT:
2241
+ rb_raise(rb_eNotImpError,
2242
+ "TODO: Ruby -> GIArgument(interface)[%s]: <%s>",
2243
+ g_info_type_to_string(interface_type),
2244
+ g_base_info_get_name(interface_info));
2245
+ break;
2246
+ case GI_INFO_TYPE_INVALID_0:
2247
+ g_assert_not_reached();
2248
+ break;
2249
+ case GI_INFO_TYPE_UNION:
2250
+ gtype = g_registered_type_info_get_g_type(interface_info);
2251
+ if (gtype == G_TYPE_NONE) {
2252
+ rb_raise(rb_eNotImpError,
2253
+ "TODO: Ruby -> GIArgument(interface)[%s]: <%s>"
2254
+ "(G_TYPE_NONE)",
2255
+ g_info_type_to_string(interface_type),
2256
+ g_base_info_get_name(interface_info));
1087
2257
  } else {
1088
2258
  argument->v_pointer = RVAL2BOXED(rb_argument, gtype);
1089
2259
  }
1090
2260
  break;
1091
- case GI_INFO_TYPE_BOXED:
2261
+ case GI_INFO_TYPE_VALUE:
2262
+ case GI_INFO_TYPE_SIGNAL:
2263
+ case GI_INFO_TYPE_VFUNC:
2264
+ case GI_INFO_TYPE_PROPERTY:
2265
+ case GI_INFO_TYPE_FIELD:
2266
+ case GI_INFO_TYPE_ARG:
2267
+ case GI_INFO_TYPE_TYPE:
2268
+ case GI_INFO_TYPE_UNRESOLVED:
2269
+ default:
2270
+ rb_raise(rb_eNotImpError,
2271
+ "TODO: Ruby -> GIArgument(interface)[%s]: <%s>",
2272
+ g_info_type_to_string(interface_type),
2273
+ g_base_info_get_name(interface_info));
2274
+ break;
2275
+ }
2276
+
2277
+ g_base_info_unref(interface_info);
2278
+ }
2279
+
2280
+ static void
2281
+ rb_gi_value_argument_from_ruby_glist(GIArgument *argument,
2282
+ GITypeInfo *type_info,
2283
+ VALUE rb_argument,
2284
+ G_GNUC_UNUSED VALUE self)
2285
+ {
2286
+ GITypeInfo *element_type_info;
2287
+ GITypeTag element_type_tag;
2288
+
2289
+ element_type_info = g_type_info_get_param_type(type_info, 0);
2290
+ element_type_tag = g_type_info_get_tag(element_type_info);
2291
+ g_base_info_unref(element_type_info);
2292
+
2293
+ switch (element_type_tag) {
2294
+ case GI_TYPE_TAG_VOID:
2295
+ case GI_TYPE_TAG_BOOLEAN:
2296
+ case GI_TYPE_TAG_INT8:
2297
+ case GI_TYPE_TAG_UINT8:
2298
+ case GI_TYPE_TAG_INT16:
2299
+ case GI_TYPE_TAG_UINT16:
2300
+ case GI_TYPE_TAG_INT32:
2301
+ case GI_TYPE_TAG_UINT32:
2302
+ case GI_TYPE_TAG_INT64:
2303
+ case GI_TYPE_TAG_UINT64:
2304
+ case GI_TYPE_TAG_FLOAT:
2305
+ case GI_TYPE_TAG_DOUBLE:
2306
+ case GI_TYPE_TAG_GTYPE:
2307
+ case GI_TYPE_TAG_UTF8:
2308
+ case GI_TYPE_TAG_FILENAME:
2309
+ case GI_TYPE_TAG_ARRAY:
2310
+ rb_raise(rb_eNotImpError,
2311
+ "TODO: Ruby -> GIArgument(GList)[%s]",
2312
+ g_type_tag_to_string(element_type_tag));
2313
+ break;
2314
+ case GI_TYPE_TAG_INTERFACE:
2315
+ argument->v_pointer = RVAL2GOBJGLIST(rb_argument);
2316
+ break;
2317
+ case GI_TYPE_TAG_GLIST:
2318
+ case GI_TYPE_TAG_GSLIST:
2319
+ case GI_TYPE_TAG_GHASH:
2320
+ case GI_TYPE_TAG_ERROR:
2321
+ case GI_TYPE_TAG_UNICHAR:
2322
+ rb_raise(rb_eNotImpError,
2323
+ "TODO: Ruby -> GIArgument(GList)[%s]",
2324
+ g_type_tag_to_string(element_type_tag));
2325
+ break;
2326
+ default:
2327
+ g_assert_not_reached();
2328
+ break;
2329
+ }
2330
+ }
2331
+
2332
+ static void
2333
+ rb_gi_value_argument_from_ruby_gslist(GIArgument *argument,
2334
+ GITypeInfo *type_info,
2335
+ VALUE rb_argument,
2336
+ G_GNUC_UNUSED VALUE self)
2337
+ {
2338
+ GITypeInfo *element_type_info;
2339
+ GITypeTag element_type_tag;
2340
+
2341
+ element_type_info = g_type_info_get_param_type(type_info, 0);
2342
+ element_type_tag = g_type_info_get_tag(element_type_info);
2343
+ g_base_info_unref(element_type_info);
2344
+
2345
+ switch (element_type_tag) {
2346
+ case GI_TYPE_TAG_VOID:
2347
+ case GI_TYPE_TAG_BOOLEAN:
2348
+ case GI_TYPE_TAG_INT8:
2349
+ case GI_TYPE_TAG_UINT8:
2350
+ case GI_TYPE_TAG_INT16:
2351
+ case GI_TYPE_TAG_UINT16:
2352
+ case GI_TYPE_TAG_INT32:
2353
+ case GI_TYPE_TAG_UINT32:
2354
+ case GI_TYPE_TAG_INT64:
2355
+ case GI_TYPE_TAG_UINT64:
2356
+ case GI_TYPE_TAG_FLOAT:
2357
+ case GI_TYPE_TAG_DOUBLE:
2358
+ case GI_TYPE_TAG_GTYPE:
2359
+ case GI_TYPE_TAG_UTF8:
2360
+ case GI_TYPE_TAG_FILENAME:
2361
+ case GI_TYPE_TAG_ARRAY:
1092
2362
  rb_raise(rb_eNotImpError,
1093
- "TODO: Ruby -> GIArgument(interface)[%s]: <%s>",
1094
- g_info_type_to_string(interface_type),
1095
- g_base_info_get_name(interface_info));
1096
- break;
1097
- case GI_INFO_TYPE_ENUM:
1098
- if (gtype == G_TYPE_NONE) {
1099
- argument->v_int32 = NUM2INT(rb_argument);
1100
- } else {
1101
- argument->v_int32 = RVAL2GENUM(rb_argument, gtype);
1102
- }
1103
- break;
1104
- case GI_INFO_TYPE_FLAGS:
1105
- if (gtype == G_TYPE_NONE) {
1106
- argument->v_int32 = NUM2INT(rb_argument);
1107
- } else {
1108
- argument->v_int32 = RVAL2GFLAGS(rb_argument, gtype);
1109
- }
2363
+ "TODO: Ruby -> GIArgument(GSList)[%s]",
2364
+ g_type_tag_to_string(element_type_tag));
1110
2365
  break;
1111
- case GI_INFO_TYPE_OBJECT:
1112
- case GI_INFO_TYPE_INTERFACE:
1113
- argument->v_pointer = RVAL2GOBJ(rb_argument);
2366
+ case GI_TYPE_TAG_INTERFACE:
2367
+ argument->v_pointer = RVAL2GOBJGSLIST(rb_argument);
1114
2368
  break;
1115
- case GI_INFO_TYPE_CONSTANT:
2369
+ case GI_TYPE_TAG_GLIST:
2370
+ case GI_TYPE_TAG_GSLIST:
2371
+ case GI_TYPE_TAG_GHASH:
2372
+ case GI_TYPE_TAG_ERROR:
2373
+ case GI_TYPE_TAG_UNICHAR:
1116
2374
  rb_raise(rb_eNotImpError,
1117
- "TODO: Ruby -> GIArgument(interface)[%s]: <%s>",
1118
- g_info_type_to_string(interface_type),
1119
- g_base_info_get_name(interface_info));
2375
+ "TODO: Ruby -> GIArgument(GSList)[%s]",
2376
+ g_type_tag_to_string(element_type_tag));
1120
2377
  break;
1121
- case GI_INFO_TYPE_INVALID_0:
2378
+ default:
1122
2379
  g_assert_not_reached();
1123
2380
  break;
1124
- case GI_INFO_TYPE_UNION:
1125
- case GI_INFO_TYPE_VALUE:
1126
- case GI_INFO_TYPE_SIGNAL:
1127
- case GI_INFO_TYPE_VFUNC:
1128
- case GI_INFO_TYPE_PROPERTY:
1129
- case GI_INFO_TYPE_FIELD:
1130
- case GI_INFO_TYPE_ARG:
1131
- case GI_INFO_TYPE_TYPE:
1132
- case GI_INFO_TYPE_UNRESOLVED:
1133
- default:
1134
- rb_raise(rb_eNotImpError,
1135
- "TODO: Ruby -> GIArgument(interface)[%s]: <%s>",
1136
- g_info_type_to_string(interface_type),
1137
- g_base_info_get_name(interface_info));
1138
- break;
1139
2381
  }
1140
-
1141
- g_base_info_unref(interface_info);
1142
2382
  }
1143
2383
 
1144
2384
  static void
@@ -1158,7 +2398,7 @@ rb_gi_value_argument_from_ruby_void(GIArgument *argument, GITypeInfo *type_info,
1158
2398
 
1159
2399
  GIArgument *
1160
2400
  rb_gi_value_argument_from_ruby(GIArgument *argument, GITypeInfo *type_info,
1161
- VALUE rb_argument)
2401
+ VALUE rb_argument, VALUE self)
1162
2402
  {
1163
2403
  GITypeTag type_tag;
1164
2404
 
@@ -1166,71 +2406,78 @@ rb_gi_value_argument_from_ruby(GIArgument *argument, GITypeInfo *type_info,
1166
2406
 
1167
2407
  type_tag = g_type_info_get_tag(type_info);
1168
2408
  switch (type_tag) {
1169
- case GI_TYPE_TAG_VOID:
2409
+ case GI_TYPE_TAG_VOID:
1170
2410
  rb_gi_value_argument_from_ruby_void(argument, type_info, rb_argument);
1171
2411
  break;
1172
- case GI_TYPE_TAG_BOOLEAN:
2412
+ case GI_TYPE_TAG_BOOLEAN:
1173
2413
  argument->v_boolean = RVAL2CBOOL(rb_argument);
1174
2414
  break;
1175
- case GI_TYPE_TAG_INT8:
2415
+ case GI_TYPE_TAG_INT8:
1176
2416
  argument->v_int8 = NUM2INT(rb_argument);
1177
2417
  break;
1178
- case GI_TYPE_TAG_UINT8:
2418
+ case GI_TYPE_TAG_UINT8:
1179
2419
  argument->v_uint8 = NUM2UINT(rb_argument);
1180
2420
  break;
1181
- case GI_TYPE_TAG_INT16:
2421
+ case GI_TYPE_TAG_INT16:
1182
2422
  argument->v_int16 = NUM2INT(rb_argument);
1183
2423
  break;
1184
- case GI_TYPE_TAG_UINT16:
2424
+ case GI_TYPE_TAG_UINT16:
1185
2425
  argument->v_uint16 = NUM2UINT(rb_argument);
1186
2426
  break;
1187
- case GI_TYPE_TAG_INT32:
2427
+ case GI_TYPE_TAG_INT32:
1188
2428
  argument->v_int32 = NUM2INT(rb_argument);
1189
2429
  break;
1190
- case GI_TYPE_TAG_UINT32:
2430
+ case GI_TYPE_TAG_UINT32:
1191
2431
  argument->v_uint32 = NUM2UINT(rb_argument);
1192
2432
  break;
1193
- case GI_TYPE_TAG_INT64:
2433
+ case GI_TYPE_TAG_INT64:
1194
2434
  argument->v_int64 = NUM2LONG(rb_argument);
1195
2435
  break;
1196
- case GI_TYPE_TAG_UINT64:
2436
+ case GI_TYPE_TAG_UINT64:
1197
2437
  argument->v_uint64 = NUM2ULONG(rb_argument);
1198
2438
  break;
1199
- case GI_TYPE_TAG_FLOAT:
2439
+ case GI_TYPE_TAG_FLOAT:
1200
2440
  argument->v_float = NUM2DBL(rb_argument);
1201
2441
  break;
1202
- case GI_TYPE_TAG_DOUBLE:
2442
+ case GI_TYPE_TAG_DOUBLE:
1203
2443
  argument->v_double = NUM2DBL(rb_argument);
1204
2444
  break;
1205
- case GI_TYPE_TAG_GTYPE:
2445
+ case GI_TYPE_TAG_GTYPE:
1206
2446
  /* TODO: support GLib::Type and String as GType name. */
1207
2447
  argument->v_size = NUM2ULONG(rb_argument);
1208
2448
  break;
1209
- case GI_TYPE_TAG_UTF8:
2449
+ case GI_TYPE_TAG_UTF8:
1210
2450
  /* TODO: support UTF-8 convert like rb_argument.encode("UTF-8"). */
1211
- argument->v_string = (gchar *)RVAL2CSTR(rb_argument);
2451
+ argument->v_string = (gchar *)RVAL2CSTR_ACCEPT_SYMBOL(rb_argument);
1212
2452
  break;
1213
- case GI_TYPE_TAG_FILENAME:
2453
+ case GI_TYPE_TAG_FILENAME:
1214
2454
  argument->v_string = (gchar *)RVAL2CSTR(rb_argument);
1215
2455
  break;
1216
- case GI_TYPE_TAG_ARRAY:
2456
+ case GI_TYPE_TAG_ARRAY:
1217
2457
  rb_raise(rb_eNotImpError,
1218
2458
  "should not be reached: Ruby -> GIArgument(%s)",
1219
2459
  g_type_tag_to_string(type_tag));
1220
2460
  break;
1221
- case GI_TYPE_TAG_INTERFACE:
1222
- rb_gi_argument_from_ruby_interface(argument, type_info, rb_argument);
2461
+ case GI_TYPE_TAG_INTERFACE:
2462
+ rb_gi_value_argument_from_ruby_interface(argument, type_info,
2463
+ rb_argument, self);
2464
+ break;
2465
+ case GI_TYPE_TAG_GLIST:
2466
+ rb_gi_value_argument_from_ruby_glist(argument, type_info,
2467
+ rb_argument, self);
2468
+ break;
2469
+ case GI_TYPE_TAG_GSLIST:
2470
+ rb_gi_value_argument_from_ruby_gslist(argument, type_info,
2471
+ rb_argument, self);
1223
2472
  break;
1224
- case GI_TYPE_TAG_GLIST:
1225
- case GI_TYPE_TAG_GSLIST:
1226
- case GI_TYPE_TAG_GHASH:
1227
- case GI_TYPE_TAG_ERROR:
1228
- case GI_TYPE_TAG_UNICHAR:
2473
+ case GI_TYPE_TAG_GHASH:
2474
+ case GI_TYPE_TAG_ERROR:
2475
+ case GI_TYPE_TAG_UNICHAR:
1229
2476
  rb_raise(rb_eNotImpError,
1230
2477
  "TODO: Ruby -> GIArgument(%s)",
1231
2478
  g_type_tag_to_string(type_tag));
1232
2479
  break;
1233
- default:
2480
+ default:
1234
2481
  g_assert_not_reached();
1235
2482
  break;
1236
2483
  }
@@ -1241,91 +2488,93 @@ rb_gi_value_argument_from_ruby(GIArgument *argument, GITypeInfo *type_info,
1241
2488
  static void
1242
2489
  rb_gi_inout_argument_from_ruby(GIArgument *argument,
1243
2490
  G_GNUC_UNUSED GIArgInfo *arg_info,
1244
- GITypeInfo *type_info, VALUE rb_argument)
2491
+ GITypeInfo *type_info,
2492
+ VALUE rb_argument,
2493
+ VALUE self)
1245
2494
  {
1246
2495
  GIArgument in_argument;
1247
2496
  GITypeTag type_tag;
1248
2497
 
1249
- rb_gi_value_argument_from_ruby(&in_argument, type_info, rb_argument);
2498
+ rb_gi_value_argument_from_ruby(&in_argument, type_info, rb_argument, self);
1250
2499
 
1251
2500
  type_tag = g_type_info_get_tag(type_info);
1252
2501
  switch (type_tag) {
1253
- case GI_TYPE_TAG_VOID:
2502
+ case GI_TYPE_TAG_VOID:
1254
2503
  break;
1255
- case GI_TYPE_TAG_BOOLEAN:
2504
+ case GI_TYPE_TAG_BOOLEAN:
1256
2505
  argument->v_pointer = ALLOC(gboolean);
1257
2506
  *((gboolean *)argument->v_pointer) = in_argument.v_boolean;
1258
2507
  break;
1259
- case GI_TYPE_TAG_INT8:
2508
+ case GI_TYPE_TAG_INT8:
1260
2509
  argument->v_pointer = ALLOC(gint8);
1261
2510
  *((gint8 *)argument->v_pointer) = in_argument.v_int8;
1262
2511
  break;
1263
- case GI_TYPE_TAG_UINT8:
2512
+ case GI_TYPE_TAG_UINT8:
1264
2513
  argument->v_pointer = ALLOC(guint8);
1265
2514
  *((guint8 *)argument->v_pointer) = in_argument.v_uint8;
1266
2515
  break;
1267
- case GI_TYPE_TAG_INT16:
2516
+ case GI_TYPE_TAG_INT16:
1268
2517
  argument->v_pointer = ALLOC(gint16);
1269
2518
  *((gint16 *)argument->v_pointer) = in_argument.v_int16;
1270
2519
  break;
1271
- case GI_TYPE_TAG_UINT16:
2520
+ case GI_TYPE_TAG_UINT16:
1272
2521
  argument->v_pointer = ALLOC(guint16);
1273
2522
  *((guint16 *)argument->v_pointer) = in_argument.v_uint16;
1274
2523
  break;
1275
- case GI_TYPE_TAG_INT32:
2524
+ case GI_TYPE_TAG_INT32:
1276
2525
  argument->v_pointer = ALLOC(gint32);
1277
2526
  *((gint32 *)argument->v_pointer) = in_argument.v_int32;
1278
2527
  break;
1279
- case GI_TYPE_TAG_UINT32:
2528
+ case GI_TYPE_TAG_UINT32:
1280
2529
  argument->v_pointer = ALLOC(guint32);
1281
2530
  *((guint32 *)argument->v_pointer) = in_argument.v_uint32;
1282
2531
  break;
1283
- case GI_TYPE_TAG_INT64:
2532
+ case GI_TYPE_TAG_INT64:
1284
2533
  argument->v_pointer = ALLOC(gint64);
1285
2534
  *((gint64 *)argument->v_pointer) = in_argument.v_int64;
1286
2535
  break;
1287
- case GI_TYPE_TAG_UINT64:
2536
+ case GI_TYPE_TAG_UINT64:
1288
2537
  argument->v_pointer = ALLOC(guint64);
1289
2538
  *((guint64 *)argument->v_pointer) = in_argument.v_uint64;
1290
2539
  break;
1291
- case GI_TYPE_TAG_FLOAT:
2540
+ case GI_TYPE_TAG_FLOAT:
1292
2541
  argument->v_pointer = ALLOC(gfloat);
1293
2542
  *((gfloat *)argument->v_pointer) = in_argument.v_float;
1294
2543
  break;
1295
- case GI_TYPE_TAG_DOUBLE:
2544
+ case GI_TYPE_TAG_DOUBLE:
1296
2545
  argument->v_pointer = ALLOC(gdouble);
1297
2546
  *((gdouble *)argument->v_pointer) = in_argument.v_double;
1298
2547
  break;
1299
- case GI_TYPE_TAG_GTYPE:
2548
+ case GI_TYPE_TAG_GTYPE:
1300
2549
  argument->v_pointer = ALLOC(gsize);
1301
2550
  *((gsize *)argument->v_pointer) = in_argument.v_size;
1302
2551
  break;
1303
- case GI_TYPE_TAG_UTF8:
1304
- case GI_TYPE_TAG_FILENAME:
2552
+ case GI_TYPE_TAG_UTF8:
2553
+ case GI_TYPE_TAG_FILENAME:
1305
2554
  argument->v_pointer = ALLOC(gchar *);
1306
2555
  *((gchar **)argument->v_pointer) = in_argument.v_string;
1307
2556
  break;
1308
- case GI_TYPE_TAG_ARRAY:
2557
+ case GI_TYPE_TAG_ARRAY:
1309
2558
  rb_raise(rb_eNotImpError,
1310
2559
  "should not be reached: Ruby -> GIArgument(%s)",
1311
2560
  g_type_tag_to_string(type_tag));
1312
2561
  break;
1313
- case GI_TYPE_TAG_INTERFACE:
1314
- case GI_TYPE_TAG_GLIST:
1315
- case GI_TYPE_TAG_GSLIST:
1316
- case GI_TYPE_TAG_GHASH:
2562
+ case GI_TYPE_TAG_INTERFACE:
2563
+ case GI_TYPE_TAG_GLIST:
2564
+ case GI_TYPE_TAG_GSLIST:
2565
+ case GI_TYPE_TAG_GHASH:
1317
2566
  argument->v_pointer = ALLOC(gpointer);
1318
2567
  *((gpointer *)argument->v_pointer) = in_argument.v_pointer;
1319
2568
  break;
1320
- case GI_TYPE_TAG_ERROR:
2569
+ case GI_TYPE_TAG_ERROR:
1321
2570
  argument->v_pointer = ALLOC(GError *);
1322
2571
  *((GError **)argument->v_pointer) = in_argument.v_pointer;
1323
2572
  break;
1324
- case GI_TYPE_TAG_UNICHAR:
2573
+ case GI_TYPE_TAG_UNICHAR:
1325
2574
  argument->v_pointer = ALLOC(gunichar);
1326
2575
  *((gunichar *)argument->v_pointer) = in_argument.v_uint32;
1327
2576
  break;
1328
- default:
2577
+ default:
1329
2578
  g_assert_not_reached();
1330
2579
  break;
1331
2580
  }
@@ -1347,49 +2596,49 @@ rb_gi_in_argument_transfer_interface(GIArgument *argument,
1347
2596
  g_base_info_unref(interface_info);
1348
2597
 
1349
2598
  switch (interface_type) {
1350
- case GI_INFO_TYPE_INVALID:
1351
- case GI_INFO_TYPE_FUNCTION:
1352
- case GI_INFO_TYPE_CALLBACK:
2599
+ case GI_INFO_TYPE_INVALID:
2600
+ case GI_INFO_TYPE_FUNCTION:
2601
+ case GI_INFO_TYPE_CALLBACK:
1353
2602
  rb_raise(rb_eNotImpError,
1354
2603
  "TODO: in transfer (interface) [%s]",
1355
2604
  g_info_type_to_string(interface_type));
1356
2605
  break;
1357
- case GI_INFO_TYPE_STRUCT:
2606
+ case GI_INFO_TYPE_STRUCT:
1358
2607
  rbgobj_boxed_unown(rb_argument);
1359
2608
  break;
1360
- case GI_INFO_TYPE_BOXED:
1361
- case GI_INFO_TYPE_ENUM:
1362
- case GI_INFO_TYPE_FLAGS:
2609
+ case GI_INFO_TYPE_BOXED:
2610
+ case GI_INFO_TYPE_ENUM:
2611
+ case GI_INFO_TYPE_FLAGS:
1363
2612
  rb_raise(rb_eNotImpError,
1364
2613
  "TODO: in transfer (interface) [%s]",
1365
2614
  g_info_type_to_string(interface_type));
1366
2615
  break;
1367
- case GI_INFO_TYPE_OBJECT:
2616
+ case GI_INFO_TYPE_OBJECT:
1368
2617
  g_object_ref(argument->v_pointer);
1369
2618
  break;
1370
- case GI_INFO_TYPE_INTERFACE:
1371
- case GI_INFO_TYPE_CONSTANT:
2619
+ case GI_INFO_TYPE_INTERFACE:
2620
+ case GI_INFO_TYPE_CONSTANT:
1372
2621
  rb_raise(rb_eNotImpError,
1373
2622
  "TODO: in transfer (interface) [%s]",
1374
2623
  g_info_type_to_string(interface_type));
1375
2624
  break;
1376
- case GI_INFO_TYPE_INVALID_0:
2625
+ case GI_INFO_TYPE_INVALID_0:
1377
2626
  g_assert_not_reached();
1378
2627
  break;
1379
- case GI_INFO_TYPE_UNION:
1380
- case GI_INFO_TYPE_VALUE:
1381
- case GI_INFO_TYPE_SIGNAL:
1382
- case GI_INFO_TYPE_VFUNC:
1383
- case GI_INFO_TYPE_PROPERTY:
1384
- case GI_INFO_TYPE_FIELD:
1385
- case GI_INFO_TYPE_ARG:
1386
- case GI_INFO_TYPE_TYPE:
1387
- case GI_INFO_TYPE_UNRESOLVED:
2628
+ case GI_INFO_TYPE_UNION:
2629
+ case GI_INFO_TYPE_VALUE:
2630
+ case GI_INFO_TYPE_SIGNAL:
2631
+ case GI_INFO_TYPE_VFUNC:
2632
+ case GI_INFO_TYPE_PROPERTY:
2633
+ case GI_INFO_TYPE_FIELD:
2634
+ case GI_INFO_TYPE_ARG:
2635
+ case GI_INFO_TYPE_TYPE:
2636
+ case GI_INFO_TYPE_UNRESOLVED:
1388
2637
  rb_raise(rb_eNotImpError,
1389
2638
  "TODO: in transfer (interface) [%s]",
1390
2639
  g_info_type_to_string(interface_type));
1391
2640
  break;
1392
- default:
2641
+ default:
1393
2642
  g_assert_not_reached();
1394
2643
  break;
1395
2644
  }
@@ -1407,40 +2656,40 @@ rb_gi_in_argument_transfer(GIArgument *argument, GITransfer transfer,
1407
2656
 
1408
2657
  type_tag = g_type_info_get_tag(type_info);
1409
2658
  switch (type_tag) {
1410
- case GI_TYPE_TAG_VOID:
1411
- case GI_TYPE_TAG_BOOLEAN:
1412
- case GI_TYPE_TAG_INT8:
1413
- case GI_TYPE_TAG_UINT8:
1414
- case GI_TYPE_TAG_INT16:
1415
- case GI_TYPE_TAG_UINT16:
1416
- case GI_TYPE_TAG_INT32:
1417
- case GI_TYPE_TAG_UINT32:
1418
- case GI_TYPE_TAG_INT64:
1419
- case GI_TYPE_TAG_UINT64:
1420
- case GI_TYPE_TAG_FLOAT:
1421
- case GI_TYPE_TAG_DOUBLE:
1422
- case GI_TYPE_TAG_GTYPE:
1423
- break;
1424
- case GI_TYPE_TAG_UTF8:
1425
- case GI_TYPE_TAG_FILENAME:
1426
- case GI_TYPE_TAG_ARRAY:
2659
+ case GI_TYPE_TAG_VOID:
2660
+ case GI_TYPE_TAG_BOOLEAN:
2661
+ case GI_TYPE_TAG_INT8:
2662
+ case GI_TYPE_TAG_UINT8:
2663
+ case GI_TYPE_TAG_INT16:
2664
+ case GI_TYPE_TAG_UINT16:
2665
+ case GI_TYPE_TAG_INT32:
2666
+ case GI_TYPE_TAG_UINT32:
2667
+ case GI_TYPE_TAG_INT64:
2668
+ case GI_TYPE_TAG_UINT64:
2669
+ case GI_TYPE_TAG_FLOAT:
2670
+ case GI_TYPE_TAG_DOUBLE:
2671
+ case GI_TYPE_TAG_GTYPE:
2672
+ break;
2673
+ case GI_TYPE_TAG_UTF8:
2674
+ case GI_TYPE_TAG_FILENAME:
2675
+ case GI_TYPE_TAG_ARRAY:
1427
2676
  rb_raise(rb_eNotImpError,
1428
2677
  "TODO: in transfer (%s)",
1429
2678
  g_type_tag_to_string(type_tag));
1430
2679
  break;
1431
- case GI_TYPE_TAG_INTERFACE:
2680
+ case GI_TYPE_TAG_INTERFACE:
1432
2681
  rb_gi_in_argument_transfer_interface(argument, transfer,
1433
2682
  type_info, rb_argument);
1434
2683
  break;
1435
- case GI_TYPE_TAG_GLIST:
1436
- case GI_TYPE_TAG_GSLIST:
1437
- case GI_TYPE_TAG_GHASH:
1438
- case GI_TYPE_TAG_ERROR:
1439
- case GI_TYPE_TAG_UNICHAR:
2684
+ case GI_TYPE_TAG_GLIST:
2685
+ case GI_TYPE_TAG_GSLIST:
2686
+ case GI_TYPE_TAG_GHASH:
2687
+ case GI_TYPE_TAG_ERROR:
2688
+ case GI_TYPE_TAG_UNICHAR:
1440
2689
  rb_raise(rb_eNotImpError,
1441
2690
  "TODO: in transfer (%s)",
1442
2691
  g_type_tag_to_string(type_tag));
1443
- default:
2692
+ default:
1444
2693
  g_assert_not_reached();
1445
2694
  break;
1446
2695
  }
@@ -1448,93 +2697,221 @@ rb_gi_in_argument_transfer(GIArgument *argument, GITransfer transfer,
1448
2697
 
1449
2698
  GIArgument *
1450
2699
  rb_gi_in_argument_from_ruby(GIArgument *argument, GIArgInfo *arg_info,
1451
- VALUE rb_argument)
2700
+ VALUE rb_argument, VALUE self)
1452
2701
  {
1453
2702
  GITypeInfo type_info;
1454
2703
 
1455
- if (g_arg_info_may_be_null(arg_info) && NIL_P(rb_argument)) {
1456
- memset(argument, 0, sizeof(GIArgument));
1457
- return argument;
2704
+ if (g_arg_info_may_be_null(arg_info) && NIL_P(rb_argument)) {
2705
+ memset(argument, 0, sizeof(GIArgument));
2706
+ return argument;
2707
+ }
2708
+
2709
+ g_arg_info_load_type(arg_info, &type_info);
2710
+ if (g_arg_info_get_direction(arg_info) == GI_DIRECTION_INOUT) {
2711
+ rb_gi_inout_argument_from_ruby(argument, arg_info, &type_info,
2712
+ rb_argument, self);
2713
+ } else {
2714
+ rb_gi_value_argument_from_ruby(argument, &type_info, rb_argument, self);
2715
+ rb_gi_in_argument_transfer(argument,
2716
+ g_arg_info_get_ownership_transfer(arg_info),
2717
+ &type_info,
2718
+ rb_argument);
2719
+ }
2720
+
2721
+ return argument;
2722
+ }
2723
+
2724
+ static void
2725
+ set_in_array_length_argument(GIArgument *argument,
2726
+ GITypeInfo *type_info,
2727
+ gint64 length)
2728
+ {
2729
+ GITypeTag type_tag;
2730
+
2731
+ if (!argument) {
2732
+ return;
2733
+ }
2734
+
2735
+ type_tag = g_type_info_get_tag(type_info);
2736
+ switch (type_tag) {
2737
+ case GI_TYPE_TAG_VOID:
2738
+ case GI_TYPE_TAG_BOOLEAN:
2739
+ rb_raise(rb_eNotImpError,
2740
+ "TODO: invalid argument?: length[%s]",
2741
+ g_type_tag_to_string(type_tag));
2742
+ break;
2743
+ case GI_TYPE_TAG_INT8:
2744
+ argument->v_int8 = length;
2745
+ break;
2746
+ case GI_TYPE_TAG_UINT8:
2747
+ argument->v_uint8 = length;
2748
+ break;
2749
+ case GI_TYPE_TAG_INT16:
2750
+ argument->v_int16 = length;
2751
+ break;
2752
+ case GI_TYPE_TAG_UINT16:
2753
+ argument->v_uint16 = length;
2754
+ break;
2755
+ case GI_TYPE_TAG_INT32:
2756
+ argument->v_int32 = length;
2757
+ break;
2758
+ case GI_TYPE_TAG_UINT32:
2759
+ argument->v_uint32 = length;
2760
+ break;
2761
+ case GI_TYPE_TAG_INT64:
2762
+ argument->v_int64 = length;
2763
+ break;
2764
+ case GI_TYPE_TAG_UINT64:
2765
+ argument->v_uint64 = length;
2766
+ break;
2767
+ case GI_TYPE_TAG_FLOAT:
2768
+ case GI_TYPE_TAG_DOUBLE:
2769
+ case GI_TYPE_TAG_GTYPE:
2770
+ case GI_TYPE_TAG_UTF8:
2771
+ case GI_TYPE_TAG_FILENAME:
2772
+ case GI_TYPE_TAG_ARRAY:
2773
+ case GI_TYPE_TAG_INTERFACE:
2774
+ case GI_TYPE_TAG_GLIST:
2775
+ case GI_TYPE_TAG_GSLIST:
2776
+ case GI_TYPE_TAG_GHASH:
2777
+ case GI_TYPE_TAG_ERROR:
2778
+ case GI_TYPE_TAG_UNICHAR:
2779
+ rb_raise(rb_eNotImpError,
2780
+ "TODO: invalid argument?: length[%s]",
2781
+ g_type_tag_to_string(type_tag));
2782
+ break;
2783
+ default:
2784
+ g_assert_not_reached();
2785
+ break;
2786
+ }
2787
+ }
2788
+
2789
+ static void
2790
+ set_in_array_int16_arguments_from_ruby(GIArgument *array_argument,
2791
+ VALUE rb_number_array)
2792
+ {
2793
+ gint16 *numbers;
2794
+ gint i, n_args;
2795
+
2796
+ n_args = RARRAY_LEN(rb_number_array);
2797
+ numbers = ALLOC_N(gint16, n_args);
2798
+ for (i = 0; i < n_args; i++) {
2799
+ numbers[i] = NUM2INT(RARRAY_PTR(rb_number_array)[i]);
2800
+ }
2801
+
2802
+ array_argument->v_pointer = numbers;
2803
+ }
2804
+
2805
+ static void
2806
+ set_in_array_uint16_arguments_from_ruby(GIArgument *array_argument,
2807
+ VALUE rb_number_array)
2808
+ {
2809
+ guint16 *numbers;
2810
+ gint i, n_args;
2811
+
2812
+ n_args = RARRAY_LEN(rb_number_array);
2813
+ numbers = ALLOC_N(guint16, n_args);
2814
+ for (i = 0; i < n_args; i++) {
2815
+ numbers[i] = NUM2UINT(RARRAY_PTR(rb_number_array)[i]);
2816
+ }
2817
+
2818
+ array_argument->v_pointer = numbers;
2819
+ }
2820
+
2821
+ static void
2822
+ set_in_array_int32_arguments_from_ruby(GIArgument *array_argument,
2823
+ VALUE rb_number_array)
2824
+ {
2825
+ gint32 *numbers;
2826
+ gint i, n_args;
2827
+
2828
+ n_args = RARRAY_LEN(rb_number_array);
2829
+ numbers = ALLOC_N(gint32, n_args);
2830
+ for (i = 0; i < n_args; i++) {
2831
+ numbers[i] = NUM2INT(RARRAY_PTR(rb_number_array)[i]);
2832
+ }
2833
+
2834
+ array_argument->v_pointer = numbers;
2835
+ }
2836
+
2837
+ static void
2838
+ set_in_array_uint32_arguments_from_ruby(GIArgument *array_argument,
2839
+ VALUE rb_number_array)
2840
+ {
2841
+ guint32 *numbers;
2842
+ gint i, n_args;
2843
+
2844
+ n_args = RARRAY_LEN(rb_number_array);
2845
+ numbers = ALLOC_N(guint32, n_args);
2846
+ for (i = 0; i < n_args; i++) {
2847
+ numbers[i] = NUM2UINT(RARRAY_PTR(rb_number_array)[i]);
2848
+ }
2849
+
2850
+ array_argument->v_pointer = numbers;
2851
+ }
2852
+
2853
+ static void
2854
+ set_in_array_int64_arguments_from_ruby(GIArgument *array_argument,
2855
+ VALUE rb_number_array)
2856
+ {
2857
+ gint64 *numbers;
2858
+ gint i, n_args;
2859
+
2860
+ n_args = RARRAY_LEN(rb_number_array);
2861
+ numbers = ALLOC_N(gint64, n_args);
2862
+ for (i = 0; i < n_args; i++) {
2863
+ numbers[i] = NUM2LONG(RARRAY_PTR(rb_number_array)[i]);
2864
+ }
2865
+
2866
+ array_argument->v_pointer = numbers;
2867
+ }
2868
+
2869
+ static void
2870
+ set_in_array_uint64_arguments_from_ruby(GIArgument *array_argument,
2871
+ VALUE rb_number_array)
2872
+ {
2873
+ guint64 *numbers;
2874
+ gint i, n_args;
2875
+
2876
+ n_args = RARRAY_LEN(rb_number_array);
2877
+ numbers = ALLOC_N(guint64, n_args);
2878
+ for (i = 0; i < n_args; i++) {
2879
+ numbers[i] = NUM2ULONG(RARRAY_PTR(rb_number_array)[i]);
1458
2880
  }
1459
2881
 
1460
- g_arg_info_load_type(arg_info, &type_info);
1461
- if (g_arg_info_get_direction(arg_info) == GI_DIRECTION_INOUT) {
1462
- rb_gi_inout_argument_from_ruby(argument, arg_info, &type_info,
1463
- rb_argument);
1464
- } else {
1465
- rb_gi_value_argument_from_ruby(argument, &type_info, rb_argument);
1466
- rb_gi_in_argument_transfer(argument,
1467
- g_arg_info_get_ownership_transfer(arg_info),
1468
- &type_info,
1469
- rb_argument);
2882
+ array_argument->v_pointer = numbers;
2883
+ }
2884
+
2885
+ static void
2886
+ set_in_array_float_arguments_from_ruby(GIArgument *array_argument,
2887
+ VALUE rb_number_array)
2888
+ {
2889
+ gfloat *numbers;
2890
+ gint i, n_args;
2891
+
2892
+ n_args = RARRAY_LEN(rb_number_array);
2893
+ numbers = ALLOC_N(gfloat, n_args);
2894
+ for (i = 0; i < n_args; i++) {
2895
+ numbers[i] = NUM2DBL(RARRAY_PTR(rb_number_array)[i]);
1470
2896
  }
1471
2897
 
1472
- return argument;
2898
+ array_argument->v_pointer = numbers;
1473
2899
  }
1474
2900
 
1475
2901
  static void
1476
- set_in_array_length_argument(GIArgument *argument,
1477
- GITypeInfo *type_info,
1478
- gint64 length)
2902
+ set_in_array_double_arguments_from_ruby(GIArgument *array_argument,
2903
+ VALUE rb_number_array)
1479
2904
  {
1480
- GITypeTag type_tag;
2905
+ gdouble *numbers;
2906
+ gint i, n_args;
1481
2907
 
1482
- if (!argument) {
1483
- return;
2908
+ n_args = RARRAY_LEN(rb_number_array);
2909
+ numbers = ALLOC_N(gdouble, n_args);
2910
+ for (i = 0; i < n_args; i++) {
2911
+ numbers[i] = NUM2DBL(RARRAY_PTR(rb_number_array)[i]);
1484
2912
  }
1485
2913
 
1486
- type_tag = g_type_info_get_tag(type_info);
1487
- switch (type_tag) {
1488
- case GI_TYPE_TAG_VOID:
1489
- case GI_TYPE_TAG_BOOLEAN:
1490
- rb_raise(rb_eNotImpError,
1491
- "TODO: invalid argument?: length[%s]",
1492
- g_type_tag_to_string(type_tag));
1493
- break;
1494
- case GI_TYPE_TAG_INT8:
1495
- argument->v_int8 = length;
1496
- break;
1497
- case GI_TYPE_TAG_UINT8:
1498
- argument->v_uint8 = length;
1499
- break;
1500
- case GI_TYPE_TAG_INT16:
1501
- argument->v_int16 = length;
1502
- break;
1503
- case GI_TYPE_TAG_UINT16:
1504
- argument->v_uint16 = length;
1505
- break;
1506
- case GI_TYPE_TAG_INT32:
1507
- argument->v_int32 = length;
1508
- break;
1509
- case GI_TYPE_TAG_UINT32:
1510
- argument->v_uint32 = length;
1511
- break;
1512
- case GI_TYPE_TAG_INT64:
1513
- argument->v_int64 = length;
1514
- break;
1515
- case GI_TYPE_TAG_UINT64:
1516
- argument->v_uint64 = length;
1517
- break;
1518
- case GI_TYPE_TAG_FLOAT:
1519
- case GI_TYPE_TAG_DOUBLE:
1520
- case GI_TYPE_TAG_GTYPE:
1521
- case GI_TYPE_TAG_UTF8:
1522
- case GI_TYPE_TAG_FILENAME:
1523
- case GI_TYPE_TAG_ARRAY:
1524
- case GI_TYPE_TAG_INTERFACE:
1525
- case GI_TYPE_TAG_GLIST:
1526
- case GI_TYPE_TAG_GSLIST:
1527
- case GI_TYPE_TAG_GHASH:
1528
- case GI_TYPE_TAG_ERROR:
1529
- case GI_TYPE_TAG_UNICHAR:
1530
- rb_raise(rb_eNotImpError,
1531
- "TODO: invalid argument?: length[%s]",
1532
- g_type_tag_to_string(type_tag));
1533
- break;
1534
- default:
1535
- g_assert_not_reached();
1536
- break;
1537
- }
2914
+ array_argument->v_pointer = numbers;
1538
2915
  }
1539
2916
 
1540
2917
  static void
@@ -1553,6 +2930,134 @@ set_in_array_gtype_arguments_from_ruby(GIArgument *array_argument,
1553
2930
  array_argument->v_pointer = types;
1554
2931
  }
1555
2932
 
2933
+ typedef struct {
2934
+ GType element_gtype;
2935
+ gsize element_size;
2936
+ VALUE rb_argument;
2937
+ gint n_args;
2938
+ gchar *values;
2939
+ } ArrayInterfaceStructFromRubyData;
2940
+
2941
+ static VALUE
2942
+ set_in_array_interface_struct_arguments_from_ruby_body(VALUE value)
2943
+ {
2944
+ ArrayInterfaceStructFromRubyData *data;
2945
+ gint i;
2946
+
2947
+ data = (ArrayInterfaceStructFromRubyData *)value;
2948
+
2949
+ for (i = 0; i < data->n_args; i++) {
2950
+ VALUE rb_element;
2951
+ gpointer element;
2952
+
2953
+ rb_element = RARRAY_PTR(data->rb_argument)[i];
2954
+ if (data->element_gtype == G_TYPE_NONE) {
2955
+ element = interface_struct_from_ruby(rb_element);
2956
+ } else {
2957
+ element = RVAL2BOXED(rb_element, data->element_gtype);
2958
+ }
2959
+ memcpy(data->values + (data->element_size * i),
2960
+ element,
2961
+ data->element_size);
2962
+ }
2963
+
2964
+ return Qnil;
2965
+ }
2966
+
2967
+ static G_GNUC_NORETURN VALUE
2968
+ set_in_array_interface_struct_arguments_from_ruby_rescue(VALUE value)
2969
+ {
2970
+ ArrayInterfaceStructFromRubyData *data;
2971
+
2972
+ data = (ArrayInterfaceStructFromRubyData *)value;
2973
+ xfree(data->values);
2974
+
2975
+ rb_exc_raise(rb_errinfo());
2976
+ }
2977
+
2978
+ static void
2979
+ set_in_array_interface_struct_arguments_from_ruby(GIArgument *array_argument,
2980
+ GType element_gtype,
2981
+ gsize element_size,
2982
+ VALUE rb_argument)
2983
+ {
2984
+ ArrayInterfaceStructFromRubyData data;
2985
+
2986
+ data.element_gtype = element_gtype;
2987
+ data.element_size = element_size;
2988
+ data.rb_argument = rb_argument;
2989
+ data.n_args = RARRAY_LEN(rb_argument);
2990
+ data.values = xmalloc(data.element_size * data.n_args);
2991
+ rb_rescue(set_in_array_interface_struct_arguments_from_ruby_body,
2992
+ (VALUE)&data,
2993
+ set_in_array_interface_struct_arguments_from_ruby_rescue,
2994
+ (VALUE)&data);
2995
+ array_argument->v_pointer = data.values;
2996
+ }
2997
+
2998
+ static void
2999
+ set_in_array_interface_arguments_from_ruby(GIArgument *array_argument,
3000
+ GITypeInfo *element_type_info,
3001
+ VALUE rb_argument)
3002
+ {
3003
+ GIBaseInfo *interface_info;
3004
+ GIInfoType interface_type;
3005
+ GType gtype;
3006
+ const char *interface_name;
3007
+ gsize size;
3008
+
3009
+ interface_info = g_type_info_get_interface(element_type_info);
3010
+ interface_type = g_base_info_get_type(interface_info);
3011
+ gtype = g_registered_type_info_get_g_type(interface_info);
3012
+
3013
+ switch (interface_type) {
3014
+ case GI_INFO_TYPE_INVALID:
3015
+ case GI_INFO_TYPE_FUNCTION:
3016
+ case GI_INFO_TYPE_CALLBACK:
3017
+ interface_name = g_info_type_to_string(interface_type);
3018
+ g_base_info_unref(interface_info);
3019
+ rb_raise(rb_eNotImpError,
3020
+ "TODO: Ruby -> GIArgument(array)[interface(%s)](%s)",
3021
+ interface_name,
3022
+ g_type_name(gtype));
3023
+ break;
3024
+ case GI_INFO_TYPE_STRUCT:
3025
+ size = g_struct_info_get_size(interface_info);
3026
+ g_base_info_unref(interface_info);
3027
+ set_in_array_interface_struct_arguments_from_ruby(array_argument,
3028
+ gtype,
3029
+ size,
3030
+ rb_argument);
3031
+ break;
3032
+ case GI_INFO_TYPE_BOXED:
3033
+ case GI_INFO_TYPE_ENUM:
3034
+ case GI_INFO_TYPE_FLAGS:
3035
+ case GI_INFO_TYPE_OBJECT:
3036
+ case GI_INFO_TYPE_INTERFACE:
3037
+ case GI_INFO_TYPE_CONSTANT:
3038
+ case GI_INFO_TYPE_INVALID_0:
3039
+ case GI_INFO_TYPE_UNION:
3040
+ case GI_INFO_TYPE_VALUE:
3041
+ case GI_INFO_TYPE_SIGNAL:
3042
+ case GI_INFO_TYPE_VFUNC:
3043
+ case GI_INFO_TYPE_PROPERTY:
3044
+ case GI_INFO_TYPE_FIELD:
3045
+ case GI_INFO_TYPE_ARG:
3046
+ case GI_INFO_TYPE_TYPE:
3047
+ case GI_INFO_TYPE_UNRESOLVED:
3048
+ interface_name = g_info_type_to_string(interface_type);
3049
+ g_base_info_unref(interface_info);
3050
+ rb_raise(rb_eNotImpError,
3051
+ "TODO: Ruby -> GIArgument(array)[interface(%s)](%s)",
3052
+ interface_name,
3053
+ g_type_name(gtype));
3054
+ break;
3055
+ default:
3056
+ g_assert_not_reached();
3057
+ break;
3058
+ }
3059
+ }
3060
+
1556
3061
  static void
1557
3062
  in_array_c_argument_from_ruby(GIArgument *array_argument,
1558
3063
  GIArgument *length_argument,
@@ -1565,54 +3070,103 @@ in_array_c_argument_from_ruby(GIArgument *array_argument,
1565
3070
 
1566
3071
  element_type_tag = g_type_info_get_tag(element_type_info);
1567
3072
  switch (element_type_tag) {
1568
- case GI_TYPE_TAG_VOID:
1569
- case GI_TYPE_TAG_BOOLEAN:
3073
+ case GI_TYPE_TAG_VOID:
3074
+ case GI_TYPE_TAG_BOOLEAN:
1570
3075
  rb_raise(rb_eNotImpError,
1571
3076
  "TODO: Ruby -> GIArgument(array)[%s]",
1572
3077
  g_type_tag_to_string(element_type_tag));
1573
3078
  break;
1574
- case GI_TYPE_TAG_INT8:
1575
- case GI_TYPE_TAG_UINT8:
3079
+ case GI_TYPE_TAG_INT8:
3080
+ case GI_TYPE_TAG_UINT8:
1576
3081
  array_argument->v_pointer = RSTRING_PTR(rb_argument);
1577
3082
  set_in_array_length_argument(length_argument, length_type_info,
1578
3083
  RSTRING_LEN(rb_argument));
1579
3084
  break;
1580
- case GI_TYPE_TAG_INT16:
1581
- case GI_TYPE_TAG_UINT16:
1582
- case GI_TYPE_TAG_INT32:
1583
- case GI_TYPE_TAG_UINT32:
1584
- case GI_TYPE_TAG_INT64:
1585
- case GI_TYPE_TAG_UINT64:
1586
- case GI_TYPE_TAG_FLOAT:
1587
- case GI_TYPE_TAG_DOUBLE:
1588
- rb_raise(rb_eNotImpError,
1589
- "TODO: Ruby -> GIArgument(array)[%s]",
1590
- g_type_tag_to_string(element_type_tag));
3085
+ case GI_TYPE_TAG_INT16:
3086
+ rb_argument = rbg_to_array(rb_argument);
3087
+ set_in_array_int16_arguments_from_ruby(array_argument, rb_argument);
3088
+ set_in_array_length_argument(length_argument, length_type_info,
3089
+ RARRAY_LEN(rb_argument));
3090
+ break;
3091
+ case GI_TYPE_TAG_UINT16:
3092
+ rb_argument = rbg_to_array(rb_argument);
3093
+ set_in_array_uint16_arguments_from_ruby(array_argument, rb_argument);
3094
+ set_in_array_length_argument(length_argument, length_type_info,
3095
+ RARRAY_LEN(rb_argument));
3096
+ break;
3097
+ case GI_TYPE_TAG_INT32:
3098
+ rb_argument = rbg_to_array(rb_argument);
3099
+ set_in_array_int32_arguments_from_ruby(array_argument, rb_argument);
3100
+ set_in_array_length_argument(length_argument, length_type_info,
3101
+ RARRAY_LEN(rb_argument));
3102
+ break;
3103
+ case GI_TYPE_TAG_UINT32:
3104
+ rb_argument = rbg_to_array(rb_argument);
3105
+ set_in_array_uint32_arguments_from_ruby(array_argument, rb_argument);
3106
+ set_in_array_length_argument(length_argument, length_type_info,
3107
+ RARRAY_LEN(rb_argument));
3108
+ break;
3109
+ case GI_TYPE_TAG_INT64:
3110
+ rb_argument = rbg_to_array(rb_argument);
3111
+ set_in_array_int64_arguments_from_ruby(array_argument, rb_argument);
3112
+ set_in_array_length_argument(length_argument, length_type_info,
3113
+ RARRAY_LEN(rb_argument));
3114
+ break;
3115
+ case GI_TYPE_TAG_UINT64:
3116
+ rb_argument = rbg_to_array(rb_argument);
3117
+ set_in_array_uint64_arguments_from_ruby(array_argument, rb_argument);
3118
+ set_in_array_length_argument(length_argument, length_type_info,
3119
+ RARRAY_LEN(rb_argument));
3120
+ break;
3121
+ case GI_TYPE_TAG_FLOAT:
3122
+ rb_argument = rbg_to_array(rb_argument);
3123
+ set_in_array_float_arguments_from_ruby(array_argument, rb_argument);
3124
+ set_in_array_length_argument(length_argument, length_type_info,
3125
+ RARRAY_LEN(rb_argument));
3126
+ break;
3127
+ case GI_TYPE_TAG_DOUBLE:
3128
+ rb_argument = rbg_to_array(rb_argument);
3129
+ set_in_array_double_arguments_from_ruby(array_argument, rb_argument);
3130
+ set_in_array_length_argument(length_argument, length_type_info,
3131
+ RARRAY_LEN(rb_argument));
1591
3132
  break;
1592
- case GI_TYPE_TAG_GTYPE:
3133
+ case GI_TYPE_TAG_GTYPE:
3134
+ rb_argument = rbg_to_array(rb_argument);
1593
3135
  set_in_array_gtype_arguments_from_ruby(array_argument,
1594
3136
  rb_argument);
1595
3137
  set_in_array_length_argument(length_argument, length_type_info,
1596
3138
  RARRAY_LEN(rb_argument));
1597
3139
  break;
1598
- case GI_TYPE_TAG_UTF8:
1599
- case GI_TYPE_TAG_FILENAME:
3140
+ case GI_TYPE_TAG_UTF8:
3141
+ case GI_TYPE_TAG_FILENAME:
3142
+ rb_argument = rbg_to_array(rb_argument);
1600
3143
  array_argument->v_pointer = RVAL2STRV(rb_argument);
1601
3144
  set_in_array_length_argument(length_argument, length_type_info,
1602
3145
  RARRAY_LEN(rb_argument));
1603
3146
  break;
1604
- case GI_TYPE_TAG_ARRAY:
1605
- case GI_TYPE_TAG_INTERFACE:
1606
- case GI_TYPE_TAG_GLIST:
1607
- case GI_TYPE_TAG_GSLIST:
1608
- case GI_TYPE_TAG_GHASH:
1609
- case GI_TYPE_TAG_ERROR:
1610
- case GI_TYPE_TAG_UNICHAR:
3147
+ case GI_TYPE_TAG_ARRAY:
3148
+ rb_raise(rb_eNotImpError,
3149
+ "TODO: Ruby -> GIArgument(array)[%s]",
3150
+ g_type_tag_to_string(element_type_tag));
3151
+ break;
3152
+ case GI_TYPE_TAG_INTERFACE:
3153
+ rb_argument = rbg_to_array(rb_argument);
3154
+ set_in_array_interface_arguments_from_ruby(array_argument,
3155
+ element_type_info,
3156
+ rb_argument);
3157
+ set_in_array_length_argument(length_argument, length_type_info,
3158
+ RARRAY_LEN(rb_argument));
3159
+ break;
3160
+ case GI_TYPE_TAG_GLIST:
3161
+ case GI_TYPE_TAG_GSLIST:
3162
+ case GI_TYPE_TAG_GHASH:
3163
+ case GI_TYPE_TAG_ERROR:
3164
+ case GI_TYPE_TAG_UNICHAR:
1611
3165
  rb_raise(rb_eNotImpError,
1612
3166
  "TODO: Ruby -> GIArgument(array)[%s]",
1613
3167
  g_type_tag_to_string(element_type_tag));
1614
3168
  break;
1615
- default:
3169
+ default:
1616
3170
  g_assert_not_reached();
1617
3171
  break;
1618
3172
  }
@@ -1631,7 +3185,7 @@ in_array_argument_from_ruby(GIArgument *array_argument,
1631
3185
  array_type = g_type_info_get_array_type(array_type_info);
1632
3186
  element_type_info = g_type_info_get_param_type(array_type_info, 0);
1633
3187
  switch (array_type) {
1634
- case GI_ARRAY_TYPE_C:
3188
+ case GI_ARRAY_TYPE_C:
1635
3189
  in_array_c_argument_from_ruby(array_argument,
1636
3190
  length_argument,
1637
3191
  array_type_info,
@@ -1639,14 +3193,14 @@ in_array_argument_from_ruby(GIArgument *array_argument,
1639
3193
  element_type_info,
1640
3194
  rb_argument);
1641
3195
  break;
1642
- case GI_ARRAY_TYPE_ARRAY:
1643
- case GI_ARRAY_TYPE_PTR_ARRAY:
1644
- case GI_ARRAY_TYPE_BYTE_ARRAY:
3196
+ case GI_ARRAY_TYPE_ARRAY:
3197
+ case GI_ARRAY_TYPE_PTR_ARRAY:
3198
+ case GI_ARRAY_TYPE_BYTE_ARRAY:
1645
3199
  rb_raise(rb_eNotImpError,
1646
3200
  "TODO: Ruby -> GIArgument(array)[%s]",
1647
3201
  g_type_tag_to_string(g_type_info_get_tag(element_type_info)));
1648
3202
  break;
1649
- default:
3203
+ default:
1650
3204
  g_assert_not_reached();
1651
3205
  break;
1652
3206
  }
@@ -1666,61 +3220,61 @@ set_inout_array_length_argument(GIArgument *argument,
1666
3220
 
1667
3221
  type_tag = g_type_info_get_tag(type_info);
1668
3222
  switch (type_tag) {
1669
- case GI_TYPE_TAG_VOID:
1670
- case GI_TYPE_TAG_BOOLEAN:
3223
+ case GI_TYPE_TAG_VOID:
3224
+ case GI_TYPE_TAG_BOOLEAN:
1671
3225
  rb_raise(rb_eNotImpError,
1672
3226
  "TODO: invalid argument?: length[%s]",
1673
3227
  g_type_tag_to_string(type_tag));
1674
3228
  break;
1675
- case GI_TYPE_TAG_INT8:
3229
+ case GI_TYPE_TAG_INT8:
1676
3230
  argument->v_pointer = ALLOC(gint8);
1677
3231
  *((gint8 *)argument->v_pointer) = length->v_int8;
1678
3232
  break;
1679
- case GI_TYPE_TAG_UINT8:
3233
+ case GI_TYPE_TAG_UINT8:
1680
3234
  argument->v_pointer = ALLOC(guint8);
1681
3235
  *((guint8 *)argument->v_pointer) = length->v_uint8;
1682
3236
  break;
1683
- case GI_TYPE_TAG_INT16:
3237
+ case GI_TYPE_TAG_INT16:
1684
3238
  argument->v_pointer = ALLOC(gint16);
1685
3239
  *((gint16 *)argument->v_pointer) = length->v_int16;
1686
3240
  break;
1687
- case GI_TYPE_TAG_UINT16:
3241
+ case GI_TYPE_TAG_UINT16:
1688
3242
  argument->v_pointer = ALLOC(guint16);
1689
3243
  *((guint16 *)argument->v_pointer) = length->v_uint16;
1690
3244
  break;
1691
- case GI_TYPE_TAG_INT32:
3245
+ case GI_TYPE_TAG_INT32:
1692
3246
  argument->v_pointer = ALLOC(gint32);
1693
3247
  *((gint32 *)argument->v_pointer) = length->v_int32;
1694
3248
  break;
1695
- case GI_TYPE_TAG_UINT32:
3249
+ case GI_TYPE_TAG_UINT32:
1696
3250
  argument->v_pointer = ALLOC(guint32);
1697
3251
  *((guint32 *)argument->v_pointer) = length->v_uint32;
1698
3252
  break;
1699
- case GI_TYPE_TAG_INT64:
3253
+ case GI_TYPE_TAG_INT64:
1700
3254
  argument->v_pointer = ALLOC(gint64);
1701
3255
  *((gint64 *)argument->v_pointer) = length->v_int64;
1702
3256
  break;
1703
- case GI_TYPE_TAG_UINT64:
3257
+ case GI_TYPE_TAG_UINT64:
1704
3258
  argument->v_pointer = ALLOC(guint64);
1705
3259
  *((guint64 *)argument->v_pointer) = length->v_uint64;
1706
3260
  break;
1707
- case GI_TYPE_TAG_FLOAT:
1708
- case GI_TYPE_TAG_DOUBLE:
1709
- case GI_TYPE_TAG_GTYPE:
1710
- case GI_TYPE_TAG_UTF8:
1711
- case GI_TYPE_TAG_FILENAME:
1712
- case GI_TYPE_TAG_ARRAY:
1713
- case GI_TYPE_TAG_INTERFACE:
1714
- case GI_TYPE_TAG_GLIST:
1715
- case GI_TYPE_TAG_GSLIST:
1716
- case GI_TYPE_TAG_GHASH:
1717
- case GI_TYPE_TAG_ERROR:
1718
- case GI_TYPE_TAG_UNICHAR:
3261
+ case GI_TYPE_TAG_FLOAT:
3262
+ case GI_TYPE_TAG_DOUBLE:
3263
+ case GI_TYPE_TAG_GTYPE:
3264
+ case GI_TYPE_TAG_UTF8:
3265
+ case GI_TYPE_TAG_FILENAME:
3266
+ case GI_TYPE_TAG_ARRAY:
3267
+ case GI_TYPE_TAG_INTERFACE:
3268
+ case GI_TYPE_TAG_GLIST:
3269
+ case GI_TYPE_TAG_GSLIST:
3270
+ case GI_TYPE_TAG_GHASH:
3271
+ case GI_TYPE_TAG_ERROR:
3272
+ case GI_TYPE_TAG_UNICHAR:
1719
3273
  rb_raise(rb_eNotImpError,
1720
3274
  "TODO: invalid argument?: length[%s]",
1721
3275
  g_type_tag_to_string(type_tag));
1722
3276
  break;
1723
- default:
3277
+ default:
1724
3278
  g_assert_not_reached();
1725
3279
  break;
1726
3280
  }
@@ -1806,47 +3360,48 @@ rb_gi_value_argument_free_array_c(GIArgument *argument,
1806
3360
 
1807
3361
  element_type_tag = g_type_info_get_tag(element_type_info);
1808
3362
  switch (element_type_tag) {
1809
- case GI_TYPE_TAG_VOID:
1810
- case GI_TYPE_TAG_BOOLEAN:
3363
+ case GI_TYPE_TAG_VOID:
3364
+ case GI_TYPE_TAG_BOOLEAN:
1811
3365
  rb_raise(rb_eNotImpError,
1812
3366
  "TODO: free GIArgument(array)[%s]",
1813
3367
  g_type_tag_to_string(element_type_tag));
1814
3368
  break;
1815
- case GI_TYPE_TAG_INT8:
1816
- case GI_TYPE_TAG_UINT8:
3369
+ case GI_TYPE_TAG_INT8:
3370
+ case GI_TYPE_TAG_UINT8:
1817
3371
  /* Do nothing */
1818
3372
  break;
1819
- case GI_TYPE_TAG_INT16:
1820
- case GI_TYPE_TAG_UINT16:
1821
- case GI_TYPE_TAG_INT32:
1822
- case GI_TYPE_TAG_UINT32:
1823
- case GI_TYPE_TAG_INT64:
1824
- case GI_TYPE_TAG_UINT64:
1825
- case GI_TYPE_TAG_FLOAT:
1826
- case GI_TYPE_TAG_DOUBLE:
3373
+ case GI_TYPE_TAG_INT16:
3374
+ case GI_TYPE_TAG_UINT16:
3375
+ case GI_TYPE_TAG_INT32:
3376
+ case GI_TYPE_TAG_UINT32:
3377
+ case GI_TYPE_TAG_INT64:
3378
+ case GI_TYPE_TAG_UINT64:
3379
+ case GI_TYPE_TAG_FLOAT:
3380
+ case GI_TYPE_TAG_DOUBLE:
3381
+ case GI_TYPE_TAG_GTYPE:
3382
+ xfree(argument->v_pointer);
3383
+ break;
3384
+ case GI_TYPE_TAG_UTF8:
3385
+ case GI_TYPE_TAG_FILENAME:
3386
+ g_free(argument->v_pointer);
3387
+ break;
3388
+ case GI_TYPE_TAG_ARRAY:
1827
3389
  rb_raise(rb_eNotImpError,
1828
3390
  "TODO: free GIArgument(array)[%s]",
1829
3391
  g_type_tag_to_string(element_type_tag));
1830
- break;
1831
- case GI_TYPE_TAG_GTYPE:
3392
+ case GI_TYPE_TAG_INTERFACE:
1832
3393
  xfree(argument->v_pointer);
1833
3394
  break;
1834
- case GI_TYPE_TAG_UTF8:
1835
- case GI_TYPE_TAG_FILENAME:
1836
- g_free(argument->v_pointer);
1837
- break;
1838
- case GI_TYPE_TAG_ARRAY:
1839
- case GI_TYPE_TAG_INTERFACE:
1840
- case GI_TYPE_TAG_GLIST:
1841
- case GI_TYPE_TAG_GSLIST:
1842
- case GI_TYPE_TAG_GHASH:
1843
- case GI_TYPE_TAG_ERROR:
1844
- case GI_TYPE_TAG_UNICHAR:
3395
+ case GI_TYPE_TAG_GLIST:
3396
+ case GI_TYPE_TAG_GSLIST:
3397
+ case GI_TYPE_TAG_GHASH:
3398
+ case GI_TYPE_TAG_ERROR:
3399
+ case GI_TYPE_TAG_UNICHAR:
1845
3400
  rb_raise(rb_eNotImpError,
1846
3401
  "TODO: free GIArgument(array)[%s]",
1847
3402
  g_type_tag_to_string(element_type_tag));
1848
3403
  break;
1849
- default:
3404
+ default:
1850
3405
  g_assert_not_reached();
1851
3406
  break;
1852
3407
  }
@@ -1861,16 +3416,16 @@ rb_gi_value_argument_free_array(GIArgument *argument, GITypeInfo *type_info)
1861
3416
  array_type = g_type_info_get_array_type(type_info);
1862
3417
  element_type_info = g_type_info_get_param_type(type_info, 0);
1863
3418
  switch (array_type) {
1864
- case GI_ARRAY_TYPE_C:
3419
+ case GI_ARRAY_TYPE_C:
1865
3420
  rb_gi_value_argument_free_array_c(argument,
1866
3421
  type_info,
1867
3422
  element_type_info);
1868
3423
  break;
1869
- case GI_ARRAY_TYPE_ARRAY:
1870
- case GI_ARRAY_TYPE_PTR_ARRAY:
1871
- case GI_ARRAY_TYPE_BYTE_ARRAY:
3424
+ case GI_ARRAY_TYPE_ARRAY:
3425
+ case GI_ARRAY_TYPE_PTR_ARRAY:
3426
+ case GI_ARRAY_TYPE_BYTE_ARRAY:
1872
3427
  break;
1873
- default:
3428
+ default:
1874
3429
  g_assert_not_reached();
1875
3430
  break;
1876
3431
  }
@@ -1878,7 +3433,9 @@ rb_gi_value_argument_free_array(GIArgument *argument, GITypeInfo *type_info)
1878
3433
  }
1879
3434
 
1880
3435
  static void
1881
- rb_gi_value_argument_free_interface(GIArgument *argument, GITypeInfo *type_info)
3436
+ rb_gi_value_argument_free_interface(VALUE rb_argument,
3437
+ GIArgument *argument,
3438
+ GITypeInfo *type_info)
1882
3439
  {
1883
3440
  GIBaseInfo *interface_info;
1884
3441
  GIInfoType interface_type;
@@ -1891,9 +3448,13 @@ rb_gi_value_argument_free_interface(GIArgument *argument, GITypeInfo *type_info)
1891
3448
  gtype = g_registered_type_info_get_g_type(interface_info);
1892
3449
 
1893
3450
  if (gtype == G_TYPE_VALUE) {
1894
- GValue *gvalue = argument->v_pointer;
1895
- g_value_unset(gvalue);
1896
- xfree(argument->v_pointer);
3451
+ if (!RVAL2CBOOL(rb_obj_is_kind_of(rb_argument, rb_cGLibValue))) {
3452
+ GValue *gvalue = argument->v_pointer;
3453
+ g_value_unset(gvalue);
3454
+ xfree(argument->v_pointer);
3455
+ }
3456
+ } else if (gtype == G_TYPE_BYTES) {
3457
+ g_bytes_unref(argument->v_pointer);
1897
3458
  }
1898
3459
  }
1899
3460
 
@@ -1901,48 +3462,52 @@ rb_gi_value_argument_free_interface(GIArgument *argument, GITypeInfo *type_info)
1901
3462
  }
1902
3463
 
1903
3464
  void
1904
- rb_gi_value_argument_free(GIArgument *argument, GITypeInfo *type_info)
3465
+ rb_gi_value_argument_free(VALUE rb_argument,
3466
+ GIArgument *argument,
3467
+ GITypeInfo *type_info)
1905
3468
  {
1906
3469
  GITypeTag type_tag;
1907
3470
 
1908
3471
  type_tag = g_type_info_get_tag(type_info);
1909
3472
  switch (type_tag) {
1910
- case GI_TYPE_TAG_VOID:
1911
- case GI_TYPE_TAG_BOOLEAN:
1912
- case GI_TYPE_TAG_INT8:
1913
- case GI_TYPE_TAG_UINT8:
1914
- case GI_TYPE_TAG_INT16:
1915
- case GI_TYPE_TAG_UINT16:
1916
- case GI_TYPE_TAG_INT32:
1917
- case GI_TYPE_TAG_UINT32:
1918
- case GI_TYPE_TAG_INT64:
1919
- case GI_TYPE_TAG_UINT64:
1920
- case GI_TYPE_TAG_FLOAT:
1921
- case GI_TYPE_TAG_DOUBLE:
1922
- case GI_TYPE_TAG_GTYPE:
1923
- case GI_TYPE_TAG_UTF8:
1924
- case GI_TYPE_TAG_FILENAME:
1925
- break;
1926
- case GI_TYPE_TAG_ARRAY:
3473
+ case GI_TYPE_TAG_VOID:
3474
+ case GI_TYPE_TAG_BOOLEAN:
3475
+ case GI_TYPE_TAG_INT8:
3476
+ case GI_TYPE_TAG_UINT8:
3477
+ case GI_TYPE_TAG_INT16:
3478
+ case GI_TYPE_TAG_UINT16:
3479
+ case GI_TYPE_TAG_INT32:
3480
+ case GI_TYPE_TAG_UINT32:
3481
+ case GI_TYPE_TAG_INT64:
3482
+ case GI_TYPE_TAG_UINT64:
3483
+ case GI_TYPE_TAG_FLOAT:
3484
+ case GI_TYPE_TAG_DOUBLE:
3485
+ case GI_TYPE_TAG_GTYPE:
3486
+ case GI_TYPE_TAG_UTF8:
3487
+ case GI_TYPE_TAG_FILENAME:
3488
+ break;
3489
+ case GI_TYPE_TAG_ARRAY:
1927
3490
  rb_gi_value_argument_free_array(argument, type_info);
1928
3491
  break;
1929
- case GI_TYPE_TAG_INTERFACE:
1930
- rb_gi_value_argument_free_interface(argument, type_info);
3492
+ case GI_TYPE_TAG_INTERFACE:
3493
+ rb_gi_value_argument_free_interface(rb_argument, argument, type_info);
1931
3494
  break;
1932
- case GI_TYPE_TAG_GLIST:
1933
- case GI_TYPE_TAG_GSLIST:
1934
- case GI_TYPE_TAG_GHASH:
1935
- case GI_TYPE_TAG_ERROR:
1936
- case GI_TYPE_TAG_UNICHAR:
3495
+ case GI_TYPE_TAG_GLIST:
3496
+ case GI_TYPE_TAG_GSLIST:
3497
+ case GI_TYPE_TAG_GHASH:
3498
+ case GI_TYPE_TAG_ERROR:
3499
+ case GI_TYPE_TAG_UNICHAR:
1937
3500
  break;
1938
- default:
3501
+ default:
1939
3502
  g_assert_not_reached();
1940
3503
  break;
1941
3504
  }
1942
3505
  }
1943
3506
 
1944
3507
  static void
1945
- rb_gi_inout_argument_free(GIArgument *argument, GITypeInfo *type_info)
3508
+ rb_gi_inout_argument_free(VALUE rb_argument,
3509
+ GIArgument *argument,
3510
+ GITypeInfo *type_info)
1946
3511
  {
1947
3512
  GIArgument in_argument;
1948
3513
  GITypeTag type_tag;
@@ -1950,99 +3515,101 @@ rb_gi_inout_argument_free(GIArgument *argument, GITypeInfo *type_info)
1950
3515
  memset(&in_argument, 0, sizeof(GIArgument));
1951
3516
  type_tag = g_type_info_get_tag(type_info);
1952
3517
  switch (type_tag) {
1953
- case GI_TYPE_TAG_VOID:
3518
+ case GI_TYPE_TAG_VOID:
1954
3519
  break;
1955
- case GI_TYPE_TAG_BOOLEAN:
3520
+ case GI_TYPE_TAG_BOOLEAN:
1956
3521
  in_argument.v_boolean = *((gboolean *)(argument->v_pointer));
1957
3522
  break;
1958
- case GI_TYPE_TAG_INT8:
3523
+ case GI_TYPE_TAG_INT8:
1959
3524
  in_argument.v_int8 = *((gint8 *)(argument->v_pointer));
1960
3525
  break;
1961
- case GI_TYPE_TAG_UINT8:
3526
+ case GI_TYPE_TAG_UINT8:
1962
3527
  /* TODO!!! */
1963
3528
  in_argument.v_uint8 = *((guint8 *)(argument->v_pointer));
1964
3529
  argument->v_pointer = ALLOC(guint8);
1965
3530
  *((guint8 *)argument->v_pointer) = in_argument.v_uint8;
1966
3531
  break;
1967
- case GI_TYPE_TAG_INT16:
3532
+ case GI_TYPE_TAG_INT16:
1968
3533
  in_argument.v_int16 = *((gint16 *)(argument->v_pointer));
1969
3534
  argument->v_pointer = ALLOC(gint16);
1970
3535
  *((gint16 *)argument->v_pointer) = in_argument.v_int16;
1971
3536
  break;
1972
- case GI_TYPE_TAG_UINT16:
3537
+ case GI_TYPE_TAG_UINT16:
1973
3538
  in_argument.v_uint16 = *((guint16 *)(argument->v_pointer));
1974
3539
  argument->v_pointer = ALLOC(guint16);
1975
3540
  *((guint16 *)argument->v_pointer) = in_argument.v_uint16;
1976
3541
  break;
1977
- case GI_TYPE_TAG_INT32:
3542
+ case GI_TYPE_TAG_INT32:
1978
3543
  in_argument.v_int32 = *((gint32 *)(argument->v_pointer));
1979
3544
  argument->v_pointer = ALLOC(gint32);
1980
3545
  *((gint32 *)argument->v_pointer) = in_argument.v_int32;
1981
3546
  break;
1982
- case GI_TYPE_TAG_UINT32:
3547
+ case GI_TYPE_TAG_UINT32:
1983
3548
  in_argument.v_uint32 = *((guint32 *)(argument->v_pointer));
1984
3549
  argument->v_pointer = ALLOC(guint32);
1985
3550
  *((guint32 *)argument->v_pointer) = in_argument.v_uint32;
1986
3551
  break;
1987
- case GI_TYPE_TAG_INT64:
3552
+ case GI_TYPE_TAG_INT64:
1988
3553
  in_argument.v_int64 = *((gint64 *)(argument->v_pointer));
1989
3554
  argument->v_pointer = ALLOC(gint64);
1990
3555
  *((gint64 *)argument->v_pointer) = in_argument.v_int64;
1991
3556
  break;
1992
- case GI_TYPE_TAG_UINT64:
3557
+ case GI_TYPE_TAG_UINT64:
1993
3558
  in_argument.v_uint64 = *((guint64 *)(argument->v_pointer));
1994
3559
  argument->v_pointer = ALLOC(guint64);
1995
3560
  *((guint64 *)argument->v_pointer) = in_argument.v_uint64;
1996
3561
  break;
1997
- case GI_TYPE_TAG_FLOAT:
3562
+ case GI_TYPE_TAG_FLOAT:
1998
3563
  in_argument.v_float = *((gfloat *)(argument->v_pointer));
1999
3564
  argument->v_pointer = ALLOC(gfloat);
2000
3565
  *((gfloat *)argument->v_pointer) = in_argument.v_float;
2001
3566
  break;
2002
- case GI_TYPE_TAG_DOUBLE:
3567
+ case GI_TYPE_TAG_DOUBLE:
2003
3568
  in_argument.v_double = *((gdouble *)(argument->v_pointer));
2004
3569
  argument->v_pointer = ALLOC(gdouble);
2005
3570
  *((gdouble *)argument->v_pointer) = in_argument.v_double;
2006
3571
  break;
2007
- case GI_TYPE_TAG_GTYPE:
3572
+ case GI_TYPE_TAG_GTYPE:
2008
3573
  in_argument.v_size = *((gsize *)(argument->v_pointer));
2009
3574
  break;
2010
- case GI_TYPE_TAG_UTF8:
2011
- case GI_TYPE_TAG_FILENAME:
3575
+ case GI_TYPE_TAG_UTF8:
3576
+ case GI_TYPE_TAG_FILENAME:
2012
3577
  in_argument.v_string = *((gchar **)(argument->v_pointer));
2013
3578
  break;
2014
- case GI_TYPE_TAG_ARRAY:
2015
- case GI_TYPE_TAG_INTERFACE:
2016
- case GI_TYPE_TAG_GLIST:
2017
- case GI_TYPE_TAG_GSLIST:
2018
- case GI_TYPE_TAG_GHASH:
3579
+ case GI_TYPE_TAG_ARRAY:
3580
+ case GI_TYPE_TAG_INTERFACE:
3581
+ case GI_TYPE_TAG_GLIST:
3582
+ case GI_TYPE_TAG_GSLIST:
3583
+ case GI_TYPE_TAG_GHASH:
2019
3584
  in_argument.v_pointer = *((gpointer *)(argument->v_pointer));
2020
3585
  break;
2021
- case GI_TYPE_TAG_ERROR:
3586
+ case GI_TYPE_TAG_ERROR:
2022
3587
  in_argument.v_pointer = *((GError **)(argument->v_pointer));
2023
3588
  break;
2024
- case GI_TYPE_TAG_UNICHAR:
3589
+ case GI_TYPE_TAG_UNICHAR:
2025
3590
  in_argument.v_uint32 = *((gunichar *)(argument->v_pointer));
2026
3591
  break;
2027
- default:
3592
+ default:
2028
3593
  g_assert_not_reached();
2029
3594
  break;
2030
3595
  }
2031
3596
 
2032
- rb_gi_value_argument_free(&in_argument, type_info);
3597
+ rb_gi_value_argument_free(rb_argument, &in_argument, type_info);
2033
3598
  xfree(argument->v_pointer);
2034
3599
  }
2035
3600
 
2036
3601
  void
2037
- rb_gi_in_argument_free(GIArgument *argument, GIArgInfo *arg_info)
3602
+ rb_gi_in_argument_free(VALUE rb_argument,
3603
+ GIArgument *argument,
3604
+ GIArgInfo *arg_info)
2038
3605
  {
2039
3606
  GITypeInfo type_info;
2040
3607
 
2041
3608
  g_arg_info_load_type(arg_info, &type_info);
2042
3609
  if (g_arg_info_get_direction(arg_info) == GI_DIRECTION_INOUT) {
2043
- rb_gi_inout_argument_free(argument, &type_info);
3610
+ rb_gi_inout_argument_free(rb_argument, argument, &type_info);
2044
3611
  } else {
2045
- rb_gi_value_argument_free(argument, &type_info);
3612
+ rb_gi_value_argument_free(rb_argument, argument, &type_info);
2046
3613
  }
2047
3614
  }
2048
3615