gobject-introspection 3.3.8 → 3.3.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/gobject-introspection/extconf.rb +4 -4
- data/ext/gobject-introspection/gobject_introspection.def +2 -1
- data/ext/gobject-introspection/rb-gi-arg-info.c +33 -1
- data/ext/gobject-introspection/rb-gi-argument.c +384 -3291
- data/ext/gobject-introspection/rb-gi-arguments-in.c +2229 -0
- data/ext/gobject-introspection/rb-gi-arguments-out.c +929 -0
- data/ext/gobject-introspection/rb-gi-arguments.c +850 -0
- data/ext/gobject-introspection/rb-gi-array-type.c +54 -0
- data/ext/gobject-introspection/rb-gi-callback.c +242 -0
- data/ext/gobject-introspection/rb-gi-conversions.h +0 -43
- data/ext/gobject-introspection/rb-gi-direction.c +36 -0
- data/ext/gobject-introspection/rb-gi-field-info.c +172 -81
- data/ext/gobject-introspection/rb-gi-function-info.c +15 -1404
- data/ext/gobject-introspection/rb-gi-private-arg-info.h +24 -0
- data/ext/gobject-introspection/rb-gi-private-arguments-in.h +26 -0
- data/ext/gobject-introspection/rb-gi-private-arguments-out.h +28 -0
- data/ext/gobject-introspection/rb-gi-private-arguments.h +107 -0
- data/ext/gobject-introspection/rb-gi-private-array-type.h +26 -0
- data/ext/gobject-introspection/rb-gi-private-callback.h +41 -0
- data/ext/gobject-introspection/rb-gi-private-direction.h +24 -0
- data/ext/gobject-introspection/rb-gi-private-transfer.h +24 -0
- data/ext/gobject-introspection/rb-gi-private.h +11 -5
- data/ext/gobject-introspection/rb-gi-struct-info.c +2 -0
- data/ext/gobject-introspection/rb-gi-transfer.c +36 -0
- data/ext/gobject-introspection/rb-gi-type-info.c +1 -13
- data/ext/gobject-introspection/rb-gobject-introspection.c +4 -1
- data/ext/gobject-introspection/rb-gobject-introspection.h +5 -23
- data/lib/gobject-introspection/arg-info.rb +2 -0
- data/lib/gobject-introspection/callable-info.rb +1 -1
- data/lib/gobject-introspection/loader.rb +0 -39
- data/lib/gobject-introspection/type-tag.rb +39 -2
- 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
|
-
|
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
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
|
305
|
-
|
306
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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) {
|