gobject-introspection 3.3.8 → 3.3.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/ext/gobject-introspection/extconf.rb +4 -4
  3. data/ext/gobject-introspection/gobject_introspection.def +2 -1
  4. data/ext/gobject-introspection/rb-gi-arg-info.c +33 -1
  5. data/ext/gobject-introspection/rb-gi-argument.c +384 -3291
  6. data/ext/gobject-introspection/rb-gi-arguments-in.c +2229 -0
  7. data/ext/gobject-introspection/rb-gi-arguments-out.c +929 -0
  8. data/ext/gobject-introspection/rb-gi-arguments.c +850 -0
  9. data/ext/gobject-introspection/rb-gi-array-type.c +54 -0
  10. data/ext/gobject-introspection/rb-gi-callback.c +242 -0
  11. data/ext/gobject-introspection/rb-gi-conversions.h +0 -43
  12. data/ext/gobject-introspection/rb-gi-direction.c +36 -0
  13. data/ext/gobject-introspection/rb-gi-field-info.c +172 -81
  14. data/ext/gobject-introspection/rb-gi-function-info.c +15 -1404
  15. data/ext/gobject-introspection/rb-gi-private-arg-info.h +24 -0
  16. data/ext/gobject-introspection/rb-gi-private-arguments-in.h +26 -0
  17. data/ext/gobject-introspection/rb-gi-private-arguments-out.h +28 -0
  18. data/ext/gobject-introspection/rb-gi-private-arguments.h +107 -0
  19. data/ext/gobject-introspection/rb-gi-private-array-type.h +26 -0
  20. data/ext/gobject-introspection/rb-gi-private-callback.h +41 -0
  21. data/ext/gobject-introspection/rb-gi-private-direction.h +24 -0
  22. data/ext/gobject-introspection/rb-gi-private-transfer.h +24 -0
  23. data/ext/gobject-introspection/rb-gi-private.h +11 -5
  24. data/ext/gobject-introspection/rb-gi-struct-info.c +2 -0
  25. data/ext/gobject-introspection/rb-gi-transfer.c +36 -0
  26. data/ext/gobject-introspection/rb-gi-type-info.c +1 -13
  27. data/ext/gobject-introspection/rb-gobject-introspection.c +4 -1
  28. data/ext/gobject-introspection/rb-gobject-introspection.h +5 -23
  29. data/lib/gobject-introspection/arg-info.rb +2 -0
  30. data/lib/gobject-introspection/callable-info.rb +1 -1
  31. data/lib/gobject-introspection/loader.rb +0 -39
  32. data/lib/gobject-introspection/type-tag.rb +39 -2
  33. metadata +21 -5
@@ -0,0 +1,54 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright (C) 2012-2019 Ruby-GNOME Project Team
4
+ *
5
+ * This library is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU Lesser General Public
7
+ * License as published by the Free Software Foundation; either
8
+ * version 2.1 of the License, or (at your option) any later version.
9
+ *
10
+ * This library is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ * Lesser General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Lesser General Public
16
+ * License along with this library; if not, write to the Free Software
17
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18
+ * MA 02110-1301 USA
19
+ */
20
+
21
+ #include "rb-gi-private.h"
22
+
23
+ VALUE
24
+ rb_gi_array_type_to_ruby(GIArrayType type)
25
+ {
26
+ if (type == (GIArrayType)-1) {
27
+ return Qnil;
28
+ } else {
29
+ return GENUM2RVAL(type, G_TYPE_I_ARRAY_TYPE);
30
+ }
31
+ }
32
+
33
+ const gchar *
34
+ rb_gi_array_type_to_string(GIArrayType type)
35
+ {
36
+ switch (type) {
37
+ case GI_ARRAY_TYPE_C:
38
+ return "C";
39
+ case GI_ARRAY_TYPE_ARRAY:
40
+ return "GArray";
41
+ case GI_ARRAY_TYPE_PTR_ARRAY:
42
+ return "GPtrArray";
43
+ case GI_ARRAY_TYPE_BYTE_ARRAY:
44
+ return "GByteArray";
45
+ default:
46
+ return "unknown";
47
+ }
48
+ }
49
+
50
+ void
51
+ rb_gi_array_type_init(VALUE rb_mGI)
52
+ {
53
+ G_DEF_CLASS(G_TYPE_I_ARRAY_TYPE, "ArrayType", rb_mGI);
54
+ }
@@ -0,0 +1,242 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright (C) 2012-2019 Ruby-GNOME Project Team
4
+ *
5
+ * This library is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU Lesser General Public
7
+ * License as published by the Free Software Foundation; either
8
+ * version 2.1 of the License, or (at your option) any later version.
9
+ *
10
+ * This library is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ * Lesser General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Lesser General Public
16
+ * License along with this library; if not, write to the Free Software
17
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18
+ * MA 02110-1301 USA
19
+ */
20
+
21
+ #include "rb-gi-private.h"
22
+
23
+ struct RBGICallbackData_ {
24
+ RBGICallback *callback;
25
+ RBGIArgMetadata *metadata;
26
+ VALUE rb_callback;
27
+ GObject *owner;
28
+ VALUE rb_owner;
29
+ };
30
+
31
+ static GPtrArray *callback_finders;
32
+ static VALUE mGLibObject = Qnil;
33
+ static VALUE mGI = Qnil;
34
+
35
+ static void
36
+ rb_gi_callback_free(RBGICallback *callback)
37
+ {
38
+ g_callable_info_free_closure(callback->callback_info,
39
+ callback->closure);
40
+ g_base_info_unref(callback->callback_info);
41
+ g_base_info_unref(callback->type_info);
42
+ xfree(callback);
43
+ }
44
+
45
+ static void
46
+ rb_gi_callback_data_weak_notify(gpointer data,
47
+ G_GNUC_UNUSED GObject *where_the_object_was)
48
+ {
49
+ RBGICallbackData *callback_data = data;
50
+ callback_data->owner = NULL;
51
+ }
52
+
53
+ RBGICallbackData *
54
+ rb_gi_callback_data_new(RBGIArguments *args,
55
+ RBGICallback *callback,
56
+ RBGIArgMetadata *metadata)
57
+ {
58
+ RBGICallbackData *callback_data;
59
+ VALUE rb_owner = args->rb_receiver;
60
+
61
+ if (rb_gi_is_debug_mode()) {
62
+ g_print("[rb-gi] callback: %s::%s()\n",
63
+ g_base_info_get_namespace(args->info),
64
+ g_base_info_get_name(args->info));
65
+ rb_p(rb_ary_new_from_args(2, args->rb_receiver, args->rb_args));
66
+ }
67
+
68
+ callback_data = ALLOC(RBGICallbackData);
69
+ callback_data->callback = callback;
70
+ callback_data->metadata = metadata;
71
+ callback_data->rb_callback = rb_block_proc();
72
+ if (NIL_P(rb_owner)) {
73
+ /* Module function case. */
74
+ VALUE rb_first_argument = RARRAY_AREF(args->rb_args, 0);
75
+ if (RVAL2CBOOL(rb_obj_is_kind_of(rb_first_argument, mGLibObject))) {
76
+ /* If the first argument of the module function call is
77
+ GObject, it's suitable for owner.
78
+ For example: pango_cairo_context_set_shape_renderer() */
79
+ rb_owner = rb_first_argument;
80
+ }
81
+ }
82
+ if (RVAL2CBOOL(rb_obj_is_kind_of(rb_owner, mGLibObject))) {
83
+ rbgobj_object_add_relative(rb_owner, callback_data->rb_callback);
84
+ callback_data->owner = RVAL2GOBJ(rb_owner);
85
+ g_object_weak_ref(callback_data->owner,
86
+ rb_gi_callback_data_weak_notify,
87
+ callback_data);
88
+ callback_data->rb_owner = Qnil;
89
+ } else {
90
+ /* Callback is GC-ed only when callback is invalidated. */
91
+ if (NIL_P(rb_owner)) {
92
+ /* Module function case. */
93
+ rbgobj_add_relative(mGI, callback_data->rb_callback);
94
+ callback_data->rb_owner = mGI;
95
+ } else {
96
+ /* Class method case. */
97
+ rbgobj_add_relative(rb_owner, callback_data->rb_callback);
98
+ callback_data->rb_owner = rb_owner;
99
+ }
100
+ callback_data->owner = NULL;
101
+ }
102
+ return callback_data;
103
+ }
104
+
105
+ void
106
+ rb_gi_callback_data_free(RBGICallbackData *callback_data)
107
+ {
108
+ if (callback_data->callback) {
109
+ rb_gi_callback_free(callback_data->callback);
110
+ }
111
+ if (callback_data->owner) {
112
+ VALUE rb_owner;
113
+ g_object_weak_unref(callback_data->owner,
114
+ rb_gi_callback_data_weak_notify,
115
+ callback_data);
116
+ rb_owner = rbgobj_ruby_object_from_instance2(callback_data->owner,
117
+ FALSE);
118
+ if (!NIL_P(rb_owner)) {
119
+ rbgobj_object_remove_relative(rb_owner, callback_data->rb_callback);
120
+ }
121
+ }
122
+ if (!NIL_P(callback_data->rb_owner)) {
123
+ rbgobj_remove_relative(callback_data->rb_owner,
124
+ (ID)0,
125
+ callback_data->rb_callback);
126
+ }
127
+ xfree(callback_data->metadata);
128
+ xfree(callback_data);
129
+ }
130
+
131
+ RBGIArgMetadata *
132
+ rb_gi_callback_data_get_metadata(RBGICallbackData *callback_data)
133
+ {
134
+ return callback_data->metadata;
135
+ }
136
+
137
+ VALUE
138
+ rb_gi_callback_data_get_rb_callback(RBGICallbackData *callback_data)
139
+ {
140
+ return callback_data->rb_callback;
141
+ }
142
+
143
+ void
144
+ rb_gi_callback_register_finder(RBGICallbackFinderFunc finder)
145
+ {
146
+ g_ptr_array_add(callback_finders, finder);
147
+ }
148
+
149
+ gpointer
150
+ rb_gi_callback_find(GIArgInfo *info)
151
+ {
152
+ guint i;
153
+ gpointer callback = NULL;
154
+
155
+ for (i = 0; i < callback_finders->len; i++) {
156
+ RBGICallbackFinderFunc finder = g_ptr_array_index(callback_finders, i);
157
+ callback = finder(info);
158
+ if (callback) {
159
+ break;
160
+ }
161
+ }
162
+
163
+ return callback;
164
+ }
165
+
166
+ static gboolean
167
+ source_func_p(GIArgInfo *info)
168
+ {
169
+ GITypeInfo type_info;
170
+ GIBaseInfo *interface_info;
171
+ GICallableInfo *callback_info;
172
+ GITypeInfo return_type_info;
173
+ GIArgInfo first_arg_info;
174
+ GITypeInfo first_arg_type_info;
175
+
176
+ g_arg_info_load_type(info, &type_info);
177
+ if (g_type_info_get_tag(&type_info) != GI_TYPE_TAG_INTERFACE) {
178
+ return FALSE;
179
+ }
180
+
181
+ interface_info = g_type_info_get_interface(&type_info);
182
+ if (g_base_info_get_type(interface_info) != GI_INFO_TYPE_CALLBACK) {
183
+ g_base_info_unref(interface_info);
184
+ return FALSE;
185
+ }
186
+
187
+ callback_info = (GICallableInfo *)interface_info;
188
+ g_callable_info_load_return_type(callback_info, &return_type_info);
189
+ if (g_type_info_get_tag(&return_type_info) != GI_TYPE_TAG_BOOLEAN) {
190
+ g_base_info_unref(interface_info);
191
+ return FALSE;
192
+ }
193
+
194
+ if (g_callable_info_get_n_args(interface_info) != 1) {
195
+ g_base_info_unref(interface_info);
196
+ return FALSE;
197
+ }
198
+
199
+ g_callable_info_load_arg(interface_info, 0, &first_arg_info);
200
+ g_arg_info_load_type(&first_arg_info, &first_arg_type_info);
201
+ if (g_type_info_get_tag(&first_arg_type_info) != GI_TYPE_TAG_VOID) {
202
+ g_base_info_unref(interface_info);
203
+ return FALSE;
204
+ }
205
+
206
+ g_base_info_unref(interface_info);
207
+ return TRUE;
208
+ }
209
+
210
+ static gboolean
211
+ source_func_callback(gpointer user_data)
212
+ {
213
+ RBGICallbackData *callback_data = user_data;
214
+ VALUE rb_keep;
215
+ ID id_call;
216
+
217
+ CONST_ID(id_call, "call");
218
+ rb_keep = rb_funcall(callback_data->rb_callback, id_call, 0);
219
+ if (callback_data->metadata->scope_type == GI_SCOPE_TYPE_ASYNC) {
220
+ rb_gi_callback_data_free(callback_data);
221
+ }
222
+ return RVAL2CBOOL(rb_keep);
223
+ }
224
+
225
+ static gpointer
226
+ source_func_callback_finder(GIArgInfo *arg_info)
227
+ {
228
+ if (!source_func_p(arg_info)) {
229
+ return NULL;
230
+ }
231
+ return source_func_callback;
232
+ }
233
+
234
+ void
235
+ rb_gi_callback_init(VALUE rb_mGI)
236
+ {
237
+ callback_finders = g_ptr_array_new();
238
+ rb_gi_callback_register_finder(source_func_callback_finder);
239
+
240
+ mGLibObject = rb_const_get(mGLib, rb_intern("Object"));
241
+ mGI = rb_mGI;
242
+ }
@@ -35,23 +35,10 @@
35
35
  in_args, out_args, args_metadata) \
36
36
  (rb_gi_argument_to_ruby((argument), (duplicate), (type_info), \
37
37
  (in_args), (out_args), (args_metadata)))
38
- #define GI_OUT_ARGUMENT2RVAL(argument, arg_info, \
39
- in_args, out_args, args_metadata) \
40
- (rb_gi_out_argument_to_ruby((argument), (arg_info), \
41
- (in_args), (out_args), (args_metadata)))
42
38
  #define GI_RETURN_ARGUMENT2RVAL(callable_info, argument, \
43
39
  in_args, out_args, args_metadata) \
44
40
  (rb_gi_return_argument_to_ruby((callable_info), (argument), \
45
41
  (in_args), (out_args), (args_metadata)))
46
- #define RVAL2GI_VALUE_ARGUMENT(argument, type_info, rb_argument, self) \
47
- (rb_gi_value_argument_from_ruby((argument), (type_info), \
48
- (rb_argument), (self)))
49
- #define RVAL2GI_IN_ARRAY_ARGUMENT(array_argument, length_argument, \
50
- array_arg_info, length_arg_info, \
51
- rb_argument) \
52
- (rb_gi_in_array_argument_from_ruby((array_argument), (length_argument), \
53
- (array_arg_info), (length_arg_info), \
54
- (rb_argument)))
55
42
 
56
43
 
57
44
  #define RVAL2GI_REGISTERED_TYPE_INFO(rb_object) \
@@ -106,41 +93,11 @@ VALUE rb_gi_argument_to_ruby (GIArgument *argument,
106
93
  GArray *in_args,
107
94
  GArray *out_args,
108
95
  GPtrArray *args_metadata);
109
- void rb_gi_out_argument_init (GIArgument *argument,
110
- GIArgInfo *arg_info);
111
- VALUE rb_gi_out_argument_to_ruby (GIArgument *argument,
112
- GIArgInfo *arg_info,
113
- GArray *in_args,
114
- GArray *out_args,
115
- GPtrArray *args_metadata);
116
- void rb_gi_out_argument_fin (GIArgument *argument,
117
- GIArgInfo *arg_info);
118
96
  VALUE rb_gi_return_argument_to_ruby (GICallableInfo *callable_info,
119
97
  GIArgument *argument,
120
98
  GArray *in_args,
121
99
  GArray *out_args,
122
100
  GPtrArray *args_metadata);
123
- GIArgument *rb_gi_value_argument_from_ruby (GIArgument *argument,
124
- GITypeInfo *type_info,
125
- VALUE rb_argument,
126
- VALUE self);
127
- GIArgument *rb_gi_in_argument_from_ruby (GICallableInfo *callable_info,
128
- GIArgument *argument,
129
- GIArgInfo *arg_info,
130
- guint nth_rb_argument,
131
- VALUE rb_argument,
132
- VALUE self);
133
- GIArgument *rb_gi_in_array_argument_from_ruby (GIArgument *array_argument,
134
- GIArgument *length_argument,
135
- GIArgInfo *array_arg_info,
136
- GIArgInfo *length_arg_info,
137
- VALUE rb_argument);
138
- void rb_gi_value_argument_free (VALUE rb_argument,
139
- GIArgument *argument,
140
- GITypeInfo *type_info);
141
- void rb_gi_in_argument_free (VALUE rb_argument,
142
- GIArgument *argument,
143
- GIArgInfo *arg_info);
144
101
 
145
102
  VALUE rb_gi_array_type_to_ruby (GIArrayType type);
146
103
 
@@ -0,0 +1,36 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright (C) 2019 Ruby-GNOME Project Team
4
+ *
5
+ * This library is free software; you can redistribute it and/or
6
+ * modify it under the terms of the GNU Lesser General Public
7
+ * License as published by the Free Software Foundation; either
8
+ * version 2.1 of the License, or (at your option) any later version.
9
+ *
10
+ * This library is distributed in the hope that it will be useful,
11
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ * Lesser General Public License for more details.
14
+ *
15
+ * You should have received a copy of the GNU Lesser General Public
16
+ * License along with this library; if not, write to the Free Software
17
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
18
+ * MA 02110-1301 USA
19
+ */
20
+
21
+ #include "rb-gi-private.h"
22
+
23
+ const gchar *
24
+ rb_gi_direction_to_string(GIDirection direction)
25
+ {
26
+ switch (direction) {
27
+ case GI_DIRECTION_IN:
28
+ return "in";
29
+ case GI_DIRECTION_OUT:
30
+ return "out";
31
+ case GI_DIRECTION_INOUT:
32
+ return "inout";
33
+ default:
34
+ return "unknown";
35
+ }
36
+ }
@@ -248,99 +248,190 @@ void
248
248
  rb_gi_field_info_set_field_raw(GIFieldInfo *info, gpointer memory,
249
249
  VALUE rb_field_value)
250
250
  {
251
- GIArgument field_value;
251
+ gint offset;
252
252
  GITypeInfo *type_info;
253
253
  GITypeTag type_tag;
254
- gboolean succeeded;
254
+ gboolean succeeded = TRUE;
255
255
 
256
+ offset = g_field_info_get_offset(info);
256
257
  type_info = g_field_info_get_type(info);
257
258
  type_tag = g_type_info_get_tag(type_info);
258
- RVAL2GI_VALUE_ARGUMENT(&field_value, type_info, rb_field_value, Qnil);
259
259
 
260
- succeeded = g_field_info_set_field(info, memory, &field_value);
261
- if (!succeeded) {
262
- switch (type_tag) {
263
- case GI_TYPE_TAG_VOID:
264
- case GI_TYPE_TAG_BOOLEAN:
265
- case GI_TYPE_TAG_INT8:
266
- case GI_TYPE_TAG_UINT8:
267
- case GI_TYPE_TAG_INT16:
268
- case GI_TYPE_TAG_UINT16:
269
- case GI_TYPE_TAG_INT32:
270
- case GI_TYPE_TAG_UINT32:
271
- case GI_TYPE_TAG_INT64:
272
- case GI_TYPE_TAG_UINT64:
273
- case GI_TYPE_TAG_FLOAT:
274
- case GI_TYPE_TAG_DOUBLE:
275
- case GI_TYPE_TAG_GTYPE:
276
- break;
277
- case GI_TYPE_TAG_UTF8:
278
- {
279
- int offset;
280
- offset = g_field_info_get_offset(info);
281
- G_STRUCT_MEMBER(gchar *, memory, offset) = field_value.v_string;
282
- succeeded = TRUE;
283
- }
284
- break;
285
- case GI_TYPE_TAG_FILENAME:
286
- case GI_TYPE_TAG_ARRAY:
287
- break;
288
- case GI_TYPE_TAG_INTERFACE:
289
- {
290
- GIBaseInfo *interface_info;
291
- GIInfoType interface_type;
292
-
293
- interface_info = g_type_info_get_interface(type_info);
294
- interface_type = g_base_info_get_type(interface_info);
295
- switch (interface_type) {
296
- case GI_INFO_TYPE_INVALID:
297
- case GI_INFO_TYPE_FUNCTION:
298
- case GI_INFO_TYPE_CALLBACK:
299
- break;
300
- case GI_INFO_TYPE_STRUCT:
301
- case GI_INFO_TYPE_BOXED:
302
- case GI_INFO_TYPE_UNION:
303
- {
304
- int offset;
305
-
306
- offset = g_field_info_get_offset(info);
260
+ if ((g_field_info_get_flags(info) & GI_FIELD_IS_WRITABLE) == 0) {
261
+ g_base_info_unref(type_info);
262
+ rb_raise(rb_eArgError,
263
+ "failed to set field value: not writable: %s[%s]",
264
+ g_base_info_get_name(info),
265
+ g_type_tag_to_string(type_tag));
266
+ }
267
+
268
+ /* TODO: Use g_field_info_set_field() again? */
269
+ switch (type_tag) {
270
+ case GI_TYPE_TAG_VOID:
271
+ succeeded = FALSE;
272
+ break;
273
+ case GI_TYPE_TAG_BOOLEAN:
274
+ G_STRUCT_MEMBER(gboolean, memory, offset) = RVAL2CBOOL(rb_field_value);
275
+ break;
276
+ case GI_TYPE_TAG_INT8:
277
+ G_STRUCT_MEMBER(gint8, memory, offset) = NUM2CHR(rb_field_value);
278
+ break;
279
+ case GI_TYPE_TAG_UINT8:
280
+ G_STRUCT_MEMBER(guint8, memory, offset) =
281
+ (guint8)NUM2CHR(rb_field_value);
282
+ break;
283
+ case GI_TYPE_TAG_INT16:
284
+ G_STRUCT_MEMBER(gint16, memory, offset) = NUM2SHORT(rb_field_value);
285
+ break;
286
+ case GI_TYPE_TAG_UINT16:
287
+ G_STRUCT_MEMBER(guint16, memory, offset) = NUM2USHORT(rb_field_value);
288
+ break;
289
+ case GI_TYPE_TAG_INT32:
290
+ G_STRUCT_MEMBER(gint32, memory, offset) = NUM2INT(rb_field_value);
291
+ break;
292
+ case GI_TYPE_TAG_UINT32:
293
+ G_STRUCT_MEMBER(guint32, memory, offset) = NUM2UINT(rb_field_value);
294
+ break;
295
+ case GI_TYPE_TAG_INT64:
296
+ G_STRUCT_MEMBER(gint64, memory, offset) = NUM2LL(rb_field_value);
297
+ break;
298
+ case GI_TYPE_TAG_UINT64:
299
+ G_STRUCT_MEMBER(guint64, memory, offset) = NUM2ULL(rb_field_value);
300
+ break;
301
+ case GI_TYPE_TAG_FLOAT:
302
+ G_STRUCT_MEMBER(gfloat, memory, offset) = NUM2DBL(rb_field_value);
303
+ break;
304
+ case GI_TYPE_TAG_DOUBLE:
305
+ G_STRUCT_MEMBER(gdouble, memory, offset) = NUM2DBL(rb_field_value);
306
+ break;
307
+ case GI_TYPE_TAG_GTYPE:
308
+ G_STRUCT_MEMBER(GType, memory, offset) =
309
+ rbgobj_gtype_from_ruby(rb_field_value);
310
+ break;
311
+ case GI_TYPE_TAG_UTF8:
312
+ G_STRUCT_MEMBER(const gchar *, memory, offset) =
313
+ RVAL2CSTR_ACCEPT_SYMBOL(rb_field_value);
314
+ break;
315
+ case GI_TYPE_TAG_FILENAME:
316
+ /* TODO: How to free? */
317
+ /* G_STRUCT_MEMBER(gchar *, memory, offset) = */
318
+ /* rbg_filename_from_ruby(rb_field_value); */
319
+ succeeded = FALSE;
320
+ break;
321
+ case GI_TYPE_TAG_ARRAY:
322
+ succeeded = FALSE;
323
+ break;
324
+ case GI_TYPE_TAG_INTERFACE:
325
+ {
326
+ GIBaseInfo *interface_info;
327
+ GIInfoType interface_type;
328
+
329
+ interface_info = g_type_info_get_interface(type_info);
330
+ interface_type = g_base_info_get_type(interface_info);
331
+ switch (interface_type) {
332
+ case GI_INFO_TYPE_INVALID:
333
+ case GI_INFO_TYPE_FUNCTION:
334
+ case GI_INFO_TYPE_CALLBACK:
335
+ succeeded = FALSE;
336
+ break;
337
+ case GI_INFO_TYPE_STRUCT:
338
+ {
339
+ GType gtype =
340
+ g_registered_type_info_get_g_type(interface_info);
341
+ G_STRUCT_MEMBER(gpointer, memory, offset) =
342
+ rb_gi_struct_get_raw(rb_field_value, gtype);
343
+ }
344
+ break;
345
+ case GI_INFO_TYPE_BOXED:
346
+ case GI_INFO_TYPE_UNION:
347
+ {
348
+ GType gtype =
349
+ g_registered_type_info_get_g_type(interface_info);
350
+ if (gtype == G_TYPE_NONE) {
351
+ succeeded = FALSE;
352
+ } else {
307
353
  G_STRUCT_MEMBER(gpointer, memory, offset) =
308
- field_value.v_pointer;
309
- succeeded = TRUE;
354
+ RVAL2BOXED(rb_field_value, gtype);
310
355
  }
311
- break;
312
- case GI_INFO_TYPE_ENUM:
313
- case GI_INFO_TYPE_FLAGS:
314
- case GI_INFO_TYPE_OBJECT:
315
- case GI_INFO_TYPE_INTERFACE:
316
- case GI_INFO_TYPE_CONSTANT:
317
- case GI_INFO_TYPE_INVALID_0:
318
- case GI_INFO_TYPE_VALUE:
319
- case GI_INFO_TYPE_SIGNAL:
320
- case GI_INFO_TYPE_VFUNC:
321
- case GI_INFO_TYPE_PROPERTY:
322
- case GI_INFO_TYPE_FIELD:
323
- case GI_INFO_TYPE_ARG:
324
- case GI_INFO_TYPE_TYPE:
325
- case GI_INFO_TYPE_UNRESOLVED:
326
- break;
327
- default:
328
- break;
329
356
  }
330
- g_base_info_unref(interface_info);
357
+ break;
358
+ case GI_INFO_TYPE_ENUM:
359
+ case GI_INFO_TYPE_FLAGS:
360
+ {
361
+ GType gtype =
362
+ g_registered_type_info_get_g_type(interface_info);
363
+ GITypeTag storage_type =
364
+ g_enum_info_get_storage_type(interface_info);
365
+ gint value;
366
+ if (gtype == G_TYPE_NONE) {
367
+ value = NUM2INT(rb_field_value);
368
+ } else {
369
+ if (interface_type == GI_INFO_TYPE_ENUM) {
370
+ value = RVAL2GENUM(rb_field_value, gtype);
371
+ } else {
372
+ value = RVAL2GFLAGS(rb_field_value, gtype);
373
+ }
374
+ }
375
+ switch (storage_type) {
376
+ case GI_TYPE_TAG_INT8:
377
+ case GI_TYPE_TAG_UINT8:
378
+ G_STRUCT_MEMBER(guint8, memory, offset) =
379
+ (guint8)value;
380
+ break;
381
+ case GI_TYPE_TAG_INT16:
382
+ case GI_TYPE_TAG_UINT16:
383
+ G_STRUCT_MEMBER(guint16, memory, offset) =
384
+ (guint16)value;
385
+ break;
386
+ case GI_TYPE_TAG_INT32:
387
+ case GI_TYPE_TAG_UINT32:
388
+ G_STRUCT_MEMBER(guint32, memory, offset) =
389
+ (guint32)value;
390
+ break;
391
+ case GI_TYPE_TAG_INT64:
392
+ case GI_TYPE_TAG_UINT64:
393
+ G_STRUCT_MEMBER(guint64, memory, offset) =
394
+ (guint64)value;
395
+ break;
396
+ default:
397
+ succeeded = FALSE;
398
+ break;
399
+ }
400
+ }
401
+ break;
402
+ case GI_INFO_TYPE_OBJECT:
403
+ G_STRUCT_MEMBER(gpointer, memory, offset) =
404
+ RVAL2GOBJ(rb_field_value);
405
+ break;
406
+ case GI_INFO_TYPE_INTERFACE:
407
+ case GI_INFO_TYPE_CONSTANT:
408
+ case GI_INFO_TYPE_INVALID_0:
409
+ case GI_INFO_TYPE_VALUE:
410
+ case GI_INFO_TYPE_SIGNAL:
411
+ case GI_INFO_TYPE_VFUNC:
412
+ case GI_INFO_TYPE_PROPERTY:
413
+ case GI_INFO_TYPE_FIELD:
414
+ case GI_INFO_TYPE_ARG:
415
+ case GI_INFO_TYPE_TYPE:
416
+ case GI_INFO_TYPE_UNRESOLVED:
417
+ succeeded = FALSE;
418
+ break;
419
+ default:
420
+ break;
331
421
  }
332
- break;
333
- case GI_TYPE_TAG_GLIST:
334
- case GI_TYPE_TAG_GSLIST:
335
- case GI_TYPE_TAG_GHASH:
336
- case GI_TYPE_TAG_ERROR:
337
- case GI_TYPE_TAG_UNICHAR:
338
- break;
339
- default:
340
- break;
422
+ g_base_info_unref(interface_info);
341
423
  }
424
+ break;
425
+ case GI_TYPE_TAG_GLIST:
426
+ case GI_TYPE_TAG_GSLIST:
427
+ case GI_TYPE_TAG_GHASH:
428
+ case GI_TYPE_TAG_ERROR:
429
+ case GI_TYPE_TAG_UNICHAR:
430
+ succeeded = FALSE;
431
+ break;
432
+ default:
433
+ break;
342
434
  }
343
- rb_gi_value_argument_free(rb_field_value, &field_value, type_info);
344
435
  g_base_info_unref(type_info);
345
436
 
346
437
  if (!succeeded) {