gobject-introspection 3.4.9 → 4.0.0
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/rb-gi-arg-info.c +44 -1
- data/ext/gobject-introspection/rb-gi-arguments-in.c +31 -24
- data/ext/gobject-introspection/rb-gi-arguments-out.c +17 -17
- data/ext/gobject-introspection/rb-gi-arguments.c +2054 -104
- data/ext/gobject-introspection/rb-gi-callable-info.c +2 -2
- data/ext/gobject-introspection/rb-gi-callback.c +33 -13
- data/ext/gobject-introspection/rb-gi-constant-info.c +14 -10
- data/ext/gobject-introspection/rb-gi-conversions.h +1 -23
- data/ext/gobject-introspection/rb-gi-field-info.c +77 -76
- data/ext/gobject-introspection/rb-gi-function-info.c +57 -16
- data/ext/gobject-introspection/rb-gi-private-arg-info.h +3 -1
- data/ext/gobject-introspection/rb-gi-private-arguments.h +21 -3
- data/ext/gobject-introspection/rb-gi-private.h +6 -3
- data/ext/gobject-introspection/rb-gobject-introspection.c +5 -225
- data/lib/gobject-introspection/function-info.rb +2 -2
- data/lib/gobject-introspection/loader.rb +149 -75
- data/lib/gobject-introspection/type-tag.rb +115 -123
- data/test/test-loader.rb +29 -1
- metadata +8 -12
- data/ext/gobject-introspection/gobject-introspection-enum-types.c +0 -230
- data/ext/gobject-introspection/gobject-introspection-enum-types.h +0 -42
- data/ext/gobject-introspection/rb-gi-argument.c +0 -2051
- data/ext/gobject-introspection/rbgiversion.h +0 -24
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
2
|
/*
|
3
|
-
* Copyright (C) 2012-
|
3
|
+
* Copyright (C) 2012-2022 Ruby-GNOME 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
|
@@ -48,7 +48,7 @@ rg_return_type(VALUE self)
|
|
48
48
|
GICallableInfo *info;
|
49
49
|
|
50
50
|
info = SELF(self);
|
51
|
-
return
|
51
|
+
return GI_BASE_INFO2RVAL_WITH_UNREF(g_callable_info_get_return_type(info));
|
52
52
|
}
|
53
53
|
|
54
54
|
static VALUE
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
2
|
/*
|
3
|
-
* Copyright (C) 2012-
|
3
|
+
* Copyright (C) 2012-2022 Ruby-GNOME 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
|
@@ -20,6 +20,21 @@
|
|
20
20
|
|
21
21
|
#include "rb-gi-private.h"
|
22
22
|
|
23
|
+
#if !GI_CHECK_VERSION(1, 72, 0)
|
24
|
+
# define g_callable_info_create_closure(callable_info, \
|
25
|
+
cif, \
|
26
|
+
callback, \
|
27
|
+
user_data) \
|
28
|
+
g_callable_info_prepare_closure((callable_info), \
|
29
|
+
(cif), \
|
30
|
+
(callback), \
|
31
|
+
(user_data))
|
32
|
+
# define g_callable_info_destroy_closure(callable_info, \
|
33
|
+
closure) \
|
34
|
+
g_callable_info_free_closure((callable_info), \
|
35
|
+
(closure))
|
36
|
+
#endif
|
37
|
+
|
23
38
|
struct RBGICallbackData_ {
|
24
39
|
RBGICallback *callback;
|
25
40
|
RBGIArgMetadata *metadata;
|
@@ -37,14 +52,13 @@ typedef struct {
|
|
37
52
|
} RBGICallbackInvokeData;
|
38
53
|
|
39
54
|
static GPtrArray *callback_finders;
|
40
|
-
static VALUE mGLibObject = Qnil;
|
41
55
|
static VALUE mGI = Qnil;
|
42
56
|
|
43
57
|
static VALUE
|
44
58
|
rb_gi_callback_invoke_without_protect(VALUE user_data)
|
45
59
|
{
|
46
60
|
RBGICallbackInvokeData *data = (RBGICallbackInvokeData *)user_data;
|
47
|
-
VALUE rb_args =
|
61
|
+
VALUE rb_args = rb_gi_arguments_get_rb_in_args(data->args);
|
48
62
|
|
49
63
|
if (data->callback->method_name) {
|
50
64
|
ID id___send__;
|
@@ -91,6 +105,9 @@ rb_gi_callback_invoke(VALUE user_data)
|
|
91
105
|
&state);
|
92
106
|
if (state != 0) {
|
93
107
|
VALUE error = rb_errinfo();
|
108
|
+
if (!g_callable_info_can_throw_gerror(data->args->info)) {
|
109
|
+
rbgutil_on_callback_error(error);
|
110
|
+
}
|
94
111
|
rb_gi_arguments_fill_raw_out_gerror(data->args, error);
|
95
112
|
rb_protect(rb_gi_callback_invoke_fill_raw_results,
|
96
113
|
user_data,
|
@@ -101,7 +118,11 @@ rb_gi_callback_invoke(VALUE user_data)
|
|
101
118
|
&state);
|
102
119
|
if (state != 0) {
|
103
120
|
VALUE error = rb_errinfo();
|
121
|
+
if (!g_callable_info_can_throw_gerror(data->args->info)) {
|
122
|
+
rbgutil_on_callback_error(error);
|
123
|
+
}
|
104
124
|
rb_gi_arguments_fill_raw_out_gerror(data->args, error);
|
125
|
+
memset(data->return_value, 0, sizeof(GIFFIReturnValue));
|
105
126
|
}
|
106
127
|
}
|
107
128
|
return Qnil;
|
@@ -179,18 +200,18 @@ rb_gi_callback_new(GICallbackInfo *callback_info,
|
|
179
200
|
g_base_info_ref(callback->callback_info);
|
180
201
|
callback->method_name = g_strdup(method_name);
|
181
202
|
callback->closure =
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
203
|
+
g_callable_info_create_closure(callback->callback_info,
|
204
|
+
&(callback->cif),
|
205
|
+
rb_gi_ffi_closure_callback,
|
206
|
+
callback);
|
186
207
|
return callback;
|
187
208
|
}
|
188
209
|
|
189
210
|
static void
|
190
211
|
rb_gi_callback_free(RBGICallback *callback)
|
191
212
|
{
|
192
|
-
|
193
|
-
|
213
|
+
g_callable_info_destroy_closure(callback->callback_info,
|
214
|
+
callback->closure);
|
194
215
|
g_free(callback->method_name);
|
195
216
|
g_base_info_unref(callback->callback_info);
|
196
217
|
xfree(callback);
|
@@ -226,14 +247,14 @@ rb_gi_callback_data_new(RBGIArguments *args,
|
|
226
247
|
if (NIL_P(rb_owner)) {
|
227
248
|
/* Module function case. */
|
228
249
|
VALUE rb_first_argument = RARRAY_AREF(args->rb_args, 0);
|
229
|
-
if (RVAL2CBOOL(rb_obj_is_kind_of(rb_first_argument,
|
250
|
+
if (RVAL2CBOOL(rb_obj_is_kind_of(rb_first_argument, rbg_cGLibObject()))) {
|
230
251
|
/* If the first argument of the module function call is
|
231
252
|
GObject, it's suitable for owner.
|
232
253
|
For example: pango_cairo_context_set_shape_renderer() */
|
233
254
|
rb_owner = rb_first_argument;
|
234
255
|
}
|
235
256
|
}
|
236
|
-
if (RVAL2CBOOL(rb_obj_is_kind_of(rb_owner,
|
257
|
+
if (RVAL2CBOOL(rb_obj_is_kind_of(rb_owner, rbg_cGLibObject()))) {
|
237
258
|
rbgobj_object_add_relative(rb_owner, callback_data->rb_callback);
|
238
259
|
callback_data->owner = RVAL2GOBJ(rb_owner);
|
239
260
|
g_object_weak_ref(callback_data->owner,
|
@@ -278,7 +299,7 @@ rb_gi_callback_data_free(RBGICallbackData *callback_data)
|
|
278
299
|
(ID)0,
|
279
300
|
callback_data->rb_callback);
|
280
301
|
}
|
281
|
-
|
302
|
+
rb_gi_arg_metadata_free(callback_data->metadata);
|
282
303
|
xfree(callback_data);
|
283
304
|
}
|
284
305
|
|
@@ -391,6 +412,5 @@ rb_gi_callback_init(VALUE rb_mGI)
|
|
391
412
|
callback_finders = g_ptr_array_new();
|
392
413
|
rb_gi_callback_register_finder(source_func_callback_finder);
|
393
414
|
|
394
|
-
mGLibObject = rb_const_get(mGLib, rb_intern("Object"));
|
395
415
|
mGI = rb_mGI;
|
396
416
|
}
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
2
|
/*
|
3
|
-
* Copyright (C) 2012-
|
3
|
+
* Copyright (C) 2012-2022 Ruby-GNOME 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
|
@@ -47,17 +47,21 @@ rg_type(VALUE self)
|
|
47
47
|
static VALUE
|
48
48
|
rg_value(VALUE self)
|
49
49
|
{
|
50
|
-
GIConstantInfo *info;
|
50
|
+
GIConstantInfo *info = SELF(self);
|
51
51
|
GIArgument value;
|
52
|
-
G_GNUC_UNUSED gint value_size;
|
53
|
-
GITypeInfo *type_info;
|
54
|
-
VALUE rb_value;
|
52
|
+
G_GNUC_UNUSED gint value_size = g_constant_info_get_value(info, &value);
|
55
53
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
54
|
+
RBGIArguments args;
|
55
|
+
rb_gi_arguments_init(&args, NULL, Qnil, Qnil, NULL);
|
56
|
+
RBGIArgMetadata value_metadata;
|
57
|
+
rb_gi_arg_metadata_init_type_info(&value_metadata,
|
58
|
+
g_constant_info_get_type(info));
|
59
|
+
VALUE rb_value = rb_gi_arguments_convert_arg(&args,
|
60
|
+
&value,
|
61
|
+
&value_metadata,
|
62
|
+
FALSE);
|
63
|
+
rb_gi_arg_metadata_clear(&value_metadata);
|
64
|
+
rb_gi_arguments_clear(&args);
|
61
65
|
g_constant_info_free_value(info, &value);
|
62
66
|
|
63
67
|
return rb_value;
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
2
|
/*
|
3
|
-
* Copyright (C) 2012-
|
3
|
+
* Copyright (C) 2012-2022 Ruby-GNOME 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
|
@@ -30,16 +30,6 @@
|
|
30
30
|
(rb_gi_base_info_to_ruby_with_unref((GIBaseInfo *)(info)))
|
31
31
|
#define RVAL2GI_BASE_INFO(rb_object) (rb_gi_base_info_from_ruby(rb_object))
|
32
32
|
|
33
|
-
#define GI_ARGUMENT2RVAL(argument, duplicate, type_info, \
|
34
|
-
in_args, out_args, args_metadata) \
|
35
|
-
(rb_gi_argument_to_ruby((argument), (duplicate), (type_info), \
|
36
|
-
(in_args), (out_args), (args_metadata)))
|
37
|
-
#define GI_RETURN_ARGUMENT2RVAL(callable_info, argument, \
|
38
|
-
in_args, out_args, args_metadata) \
|
39
|
-
(rb_gi_return_argument_to_ruby((callable_info), (argument), \
|
40
|
-
(in_args), (out_args), (args_metadata)))
|
41
|
-
|
42
|
-
|
43
33
|
#define RVAL2GI_REGISTERED_TYPE_INFO(rb_object) \
|
44
34
|
((GIRegisteredTypeInfo *)RVAL2GI_BASE_INFO(rb_object))
|
45
35
|
#define RVAL2GI_FUNCTION_INFO(rb_object) \
|
@@ -90,16 +80,4 @@ VALUE rb_gi_base_info_to_ruby (GIBaseInfo *info);
|
|
90
80
|
VALUE rb_gi_base_info_to_ruby_with_unref(GIBaseInfo *info);
|
91
81
|
GIBaseInfo *rb_gi_base_info_from_ruby (VALUE rb_info);
|
92
82
|
|
93
|
-
VALUE rb_gi_argument_to_ruby (GIArgument *argument,
|
94
|
-
gboolean duplicate,
|
95
|
-
GITypeInfo *type_info,
|
96
|
-
GArray *in_args,
|
97
|
-
GArray *out_args,
|
98
|
-
GPtrArray *args_metadata);
|
99
|
-
VALUE rb_gi_return_argument_to_ruby (GICallableInfo *callable_info,
|
100
|
-
GIArgument *argument,
|
101
|
-
GArray *in_args,
|
102
|
-
GArray *out_args,
|
103
|
-
GPtrArray *args_metadata);
|
104
|
-
|
105
83
|
VALUE rb_gi_array_type_to_ruby (GIArrayType type);
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
2
|
/*
|
3
|
-
* Copyright (C) 2012-
|
3
|
+
* Copyright (C) 2012-2022 Ruby-GNOME 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
|
@@ -71,66 +71,58 @@ rg_type(VALUE self)
|
|
71
71
|
return GI_BASE_INFO2RVAL_WITH_UNREF(g_field_info_get_type(info));
|
72
72
|
}
|
73
73
|
|
74
|
+
typedef struct {
|
75
|
+
RBGIArguments args;
|
76
|
+
GIArgument value;
|
77
|
+
RBGIArgMetadata metadata;
|
78
|
+
GIFieldInfo *info;
|
79
|
+
gpointer memory;
|
80
|
+
} FieldToRubyData;
|
81
|
+
|
74
82
|
static VALUE
|
75
|
-
|
76
|
-
gpointer memory,
|
77
|
-
GITypeInfo *type_info)
|
83
|
+
rb_gi_field_info_get_field_raw_body_interface(FieldToRubyData *data)
|
78
84
|
{
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
gint offset;
|
84
|
-
|
85
|
-
interface_info = g_type_info_get_interface(type_info);
|
86
|
-
interface_type = g_base_info_get_type(interface_info);
|
87
|
-
gtype = g_registered_type_info_get_g_type(interface_info);
|
88
|
-
offset = g_field_info_get_offset(info);
|
89
|
-
switch (interface_type) {
|
85
|
+
GIInfoType type = data->metadata.type.interface_type;
|
86
|
+
GType gtype = data->metadata.type.interface_gtype;
|
87
|
+
gint offset = g_field_info_get_offset(data->info);
|
88
|
+
switch (type) {
|
90
89
|
case GI_INFO_TYPE_INVALID:
|
91
90
|
case GI_INFO_TYPE_FUNCTION:
|
92
91
|
case GI_INFO_TYPE_CALLBACK:
|
93
92
|
rb_raise(rb_eNotImpError,
|
94
93
|
"TODO: GIField(interface)[%s](%s)",
|
95
|
-
g_info_type_to_string(
|
94
|
+
g_info_type_to_string(type),
|
96
95
|
g_type_name(gtype));
|
97
|
-
|
96
|
+
return Qnil;
|
98
97
|
case GI_INFO_TYPE_STRUCT:
|
99
98
|
{
|
100
|
-
GIStructInfo *struct_info =
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
target = (gpointer)((guint8 *)memory + offset);
|
99
|
+
GIStructInfo *struct_info =
|
100
|
+
(GIStructInfo *)(data->metadata.type.interface_info);
|
101
|
+
gboolean is_pointer =
|
102
|
+
g_type_info_is_pointer(data->metadata.type.info);
|
103
|
+
gpointer target = (gpointer)((guint8 *)(data->memory) + offset);
|
106
104
|
if (is_pointer) {
|
107
105
|
target = *((gpointer *)target);
|
108
106
|
}
|
109
|
-
|
110
|
-
target,
|
111
|
-
is_pointer);
|
112
|
-
break;
|
107
|
+
return rb_gi_struct_info_to_ruby(struct_info, target, is_pointer);
|
113
108
|
}
|
114
109
|
case GI_INFO_TYPE_BOXED:
|
115
110
|
case GI_INFO_TYPE_UNION:
|
116
111
|
case GI_INFO_TYPE_OBJECT:
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
NULL, NULL, NULL);
|
123
|
-
}
|
124
|
-
break;
|
112
|
+
data->value.v_pointer = G_STRUCT_MEMBER(gpointer, data->memory, offset);
|
113
|
+
return rb_gi_arguments_convert_arg(&(data->args),
|
114
|
+
&(data->value),
|
115
|
+
&(data->metadata),
|
116
|
+
FALSE);
|
125
117
|
case GI_INFO_TYPE_ENUM:
|
126
118
|
{
|
127
119
|
gint32 raw_value;
|
128
120
|
|
129
|
-
raw_value = G_STRUCT_MEMBER(gint32, memory, offset);
|
121
|
+
raw_value = G_STRUCT_MEMBER(gint32, data->memory, offset);
|
130
122
|
if (gtype == G_TYPE_NONE) {
|
131
|
-
|
123
|
+
return INT2NUM(raw_value);
|
132
124
|
} else {
|
133
|
-
|
125
|
+
return GENUM2RVAL(raw_value, gtype);
|
134
126
|
}
|
135
127
|
}
|
136
128
|
break;
|
@@ -138,11 +130,11 @@ rb_gi_field_info_get_field_raw_interface(GIFieldInfo *info,
|
|
138
130
|
{
|
139
131
|
gint32 raw_value;
|
140
132
|
|
141
|
-
raw_value = G_STRUCT_MEMBER(gint32, memory, offset);
|
133
|
+
raw_value = G_STRUCT_MEMBER(gint32, data->memory, offset);
|
142
134
|
if (gtype == G_TYPE_NONE) {
|
143
|
-
|
135
|
+
return INT2NUM(raw_value);
|
144
136
|
} else {
|
145
|
-
|
137
|
+
return GFLAGS2RVAL(raw_value, gtype);
|
146
138
|
}
|
147
139
|
}
|
148
140
|
break;
|
@@ -157,32 +149,21 @@ rb_gi_field_info_get_field_raw_interface(GIFieldInfo *info,
|
|
157
149
|
case GI_INFO_TYPE_ARG:
|
158
150
|
case GI_INFO_TYPE_TYPE:
|
159
151
|
case GI_INFO_TYPE_UNRESOLVED:
|
152
|
+
default:
|
160
153
|
rb_raise(rb_eNotImpError,
|
161
154
|
"TODO: GIField(interface)[%s](%s)",
|
162
|
-
g_info_type_to_string(
|
155
|
+
g_info_type_to_string(type),
|
163
156
|
g_type_name(gtype));
|
164
|
-
|
165
|
-
default:
|
166
|
-
break;
|
157
|
+
return Qnil;
|
167
158
|
}
|
168
|
-
g_base_info_unref(interface_info);
|
169
|
-
|
170
|
-
return rb_field_value;
|
171
159
|
}
|
172
160
|
|
173
|
-
VALUE
|
174
|
-
|
161
|
+
static VALUE
|
162
|
+
rb_gi_field_info_get_field_raw_body(VALUE user_data)
|
175
163
|
{
|
176
|
-
|
164
|
+
FieldToRubyData *data = (FieldToRubyData *)user_data;
|
177
165
|
gboolean processed = FALSE;
|
178
|
-
|
179
|
-
GITypeTag type_tag;
|
180
|
-
VALUE rb_field_value = Qnil;
|
181
|
-
|
182
|
-
type_info = g_field_info_get_type(info);
|
183
|
-
type_tag = g_type_info_get_tag(type_info);
|
184
|
-
|
185
|
-
switch (type_tag) {
|
166
|
+
switch (data->metadata.type.tag) {
|
186
167
|
case GI_TYPE_TAG_VOID:
|
187
168
|
case GI_TYPE_TAG_BOOLEAN:
|
188
169
|
case GI_TYPE_TAG_INT8:
|
@@ -200,8 +181,9 @@ rb_gi_field_info_get_field_raw(GIFieldInfo *info, gpointer memory)
|
|
200
181
|
case GI_TYPE_TAG_UTF8:
|
201
182
|
{
|
202
183
|
int offset;
|
203
|
-
offset = g_field_info_get_offset(info);
|
204
|
-
|
184
|
+
offset = g_field_info_get_offset(data->info);
|
185
|
+
data->value.v_string =
|
186
|
+
G_STRUCT_MEMBER(gchar *, data->memory, offset);
|
205
187
|
processed = TRUE;
|
206
188
|
}
|
207
189
|
break;
|
@@ -209,13 +191,11 @@ rb_gi_field_info_get_field_raw(GIFieldInfo *info, gpointer memory)
|
|
209
191
|
case GI_TYPE_TAG_ARRAY:
|
210
192
|
break;
|
211
193
|
case GI_TYPE_TAG_INTERFACE:
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
g_base_info_unref(type_info);
|
218
|
-
return rb_field_value;
|
194
|
+
{
|
195
|
+
VALUE rb_value = rb_gi_field_info_get_field_raw_body_interface(data);
|
196
|
+
if (!NIL_P(rb_value)) {
|
197
|
+
return rb_value;
|
198
|
+
}
|
219
199
|
}
|
220
200
|
break;
|
221
201
|
case GI_TYPE_TAG_GLIST:
|
@@ -229,19 +209,40 @@ rb_gi_field_info_get_field_raw(GIFieldInfo *info, gpointer memory)
|
|
229
209
|
}
|
230
210
|
|
231
211
|
if (!processed) {
|
232
|
-
if (!g_field_info_get_field(info, memory, &
|
233
|
-
g_base_info_unref(type_info);
|
212
|
+
if (!g_field_info_get_field(data->info, data->memory, &(data->value))) {
|
234
213
|
rb_raise(rb_eArgError, "failed to get field value: %s[%s]",
|
235
|
-
g_base_info_get_name(info),
|
236
|
-
g_type_tag_to_string(
|
214
|
+
g_base_info_get_name(data->info),
|
215
|
+
g_type_tag_to_string(data->metadata.type.tag));
|
237
216
|
}
|
238
217
|
}
|
239
218
|
|
240
|
-
|
241
|
-
|
242
|
-
|
219
|
+
return rb_gi_arguments_convert_arg(&(data->args),
|
220
|
+
&(data->value),
|
221
|
+
&(data->metadata),
|
222
|
+
FALSE);
|
223
|
+
}
|
243
224
|
|
244
|
-
|
225
|
+
static VALUE
|
226
|
+
rb_gi_field_info_get_field_raw_ensure(VALUE user_data)
|
227
|
+
{
|
228
|
+
FieldToRubyData *data = (FieldToRubyData *)user_data;
|
229
|
+
rb_gi_arguments_clear(&(data->args));
|
230
|
+
rb_gi_arg_metadata_clear(&(data->metadata));
|
231
|
+
return Qnil;
|
232
|
+
}
|
233
|
+
|
234
|
+
VALUE
|
235
|
+
rb_gi_field_info_get_field_raw(GIFieldInfo *info, gpointer memory)
|
236
|
+
{
|
237
|
+
FieldToRubyData data;
|
238
|
+
rb_gi_arguments_init(&(data.args), NULL, Qnil, Qnil, NULL);
|
239
|
+
GITypeInfo *type_info = g_field_info_get_type(info);
|
240
|
+
rb_gi_arg_metadata_init_type_info(&(data.metadata), type_info);
|
241
|
+
data.info = info;
|
242
|
+
data.memory = memory;
|
243
|
+
|
244
|
+
return rb_ensure(rb_gi_field_info_get_field_raw_body, (VALUE)&data,
|
245
|
+
rb_gi_field_info_get_field_raw_ensure, (VALUE)&data);
|
245
246
|
}
|
246
247
|
|
247
248
|
void
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
2
|
/*
|
3
|
-
* Copyright (C) 2012-
|
3
|
+
* Copyright (C) 2012-2022 Ruby-GNOME 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
|
@@ -49,18 +49,55 @@ gi_function_info_get_type(void)
|
|
49
49
|
}
|
50
50
|
|
51
51
|
static VALUE
|
52
|
-
|
52
|
+
rg_set_lock_gvl_default(VALUE self, VALUE rb_boolean)
|
53
53
|
{
|
54
|
-
return rb_iv_set(self, "
|
54
|
+
return rb_iv_set(self, "lock_gvl_default", rb_boolean);
|
55
55
|
}
|
56
56
|
|
57
57
|
static VALUE
|
58
|
-
|
58
|
+
rg_add_lock_gvl_predicate(VALUE self)
|
59
59
|
{
|
60
|
-
|
61
|
-
|
60
|
+
VALUE rb_predicates;
|
61
|
+
if (!RVAL2CBOOL(rb_ivar_defined(self, rb_intern("lock_gvl_predicates")))) {
|
62
|
+
rb_predicates = rb_ary_new();
|
63
|
+
rb_iv_set(self, "lock_gvl_predicates", rb_predicates);
|
64
|
+
} else {
|
65
|
+
rb_predicates = rb_iv_get(self, "lock_gvl_predicates");
|
66
|
+
}
|
67
|
+
rb_ary_push(rb_predicates, rb_block_lambda());
|
68
|
+
return Qnil;
|
69
|
+
}
|
70
|
+
|
71
|
+
static VALUE
|
72
|
+
rg_lock_gvl_p(int argc, VALUE *argv, VALUE self)
|
73
|
+
{
|
74
|
+
VALUE rb_receiver;
|
75
|
+
VALUE rb_lock_gvl_default = Qtrue;
|
76
|
+
rb_scan_args(argc, argv, "01", &rb_receiver);
|
77
|
+
if (RVAL2CBOOL(rb_ivar_defined(self, rb_intern("lock_gvl_default")))) {
|
78
|
+
rb_lock_gvl_default = rb_iv_get(self, "lock_gvl_default");
|
79
|
+
}
|
80
|
+
if (NIL_P(rb_receiver)) {
|
81
|
+
return rb_lock_gvl_default;
|
62
82
|
}
|
63
|
-
|
83
|
+
if (!RVAL2CBOOL(rb_ivar_defined(self, rb_intern("lock_gvl_predicates")))) {
|
84
|
+
return rb_lock_gvl_default;
|
85
|
+
}
|
86
|
+
VALUE rb_predicates = rb_iv_get(self, "lock_gvl_predicates");
|
87
|
+
long n = RARRAY_LEN(rb_predicates);
|
88
|
+
long i;
|
89
|
+
VALUE rb_args = rb_ary_new_from_args(2,
|
90
|
+
self,
|
91
|
+
rb_receiver);
|
92
|
+
for (i = 0; i < n; i++) {
|
93
|
+
VALUE rb_predicate = RARRAY_PTR(rb_predicates)[n - i - 1];
|
94
|
+
VALUE rb_result = rb_proc_call(rb_predicate, rb_args);
|
95
|
+
if (NIL_P(rb_result)) {
|
96
|
+
continue;
|
97
|
+
}
|
98
|
+
return rb_result;
|
99
|
+
}
|
100
|
+
return rb_lock_gvl_default;
|
64
101
|
}
|
65
102
|
|
66
103
|
static VALUE
|
@@ -144,9 +181,12 @@ rb_gi_function_info_invoke_raw(GIFunctionInfo *info,
|
|
144
181
|
VALUE rb_out_args = Qnil;
|
145
182
|
gboolean succeeded;
|
146
183
|
GError *error = NULL;
|
147
|
-
gboolean
|
184
|
+
gboolean lock_gvl = FALSE;
|
148
185
|
|
149
|
-
|
186
|
+
lock_gvl = RVAL2CBOOL(rb_funcall(rb_info,
|
187
|
+
rb_intern("lock_gvl?"),
|
188
|
+
1,
|
189
|
+
rb_receiver));
|
150
190
|
rb_arguments = rbg_to_array(rb_arguments);
|
151
191
|
|
152
192
|
callable_info = (GICallableInfo *)info;
|
@@ -161,12 +201,12 @@ rb_gi_function_info_invoke_raw(GIFunctionInfo *info,
|
|
161
201
|
data.in_args = args.in_args;
|
162
202
|
data.out_args = args.out_args;
|
163
203
|
data.error = &error;
|
164
|
-
if (
|
204
|
+
if (lock_gvl) {
|
205
|
+
rb_gi_function_info_invoke_raw_call(&data);
|
206
|
+
} else {
|
165
207
|
rb_thread_call_without_gvl(
|
166
208
|
rb_gi_function_info_invoke_raw_call_without_gvl_body, &data,
|
167
209
|
NULL, NULL);
|
168
|
-
} else {
|
169
|
-
rb_gi_function_info_invoke_raw_call(&data);
|
170
210
|
}
|
171
211
|
succeeded = data.succeeded;
|
172
212
|
|
@@ -176,8 +216,8 @@ rb_gi_function_info_invoke_raw(GIFunctionInfo *info,
|
|
176
216
|
if (rb_return_value) {
|
177
217
|
if (succeeded) {
|
178
218
|
*rb_return_value =
|
179
|
-
|
180
|
-
|
219
|
+
rb_gi_arguments_convert_return_value(&args,
|
220
|
+
&(data.return_value));
|
181
221
|
} else {
|
182
222
|
*rb_return_value = Qnil;
|
183
223
|
}
|
@@ -243,8 +283,9 @@ rb_gi_function_info_init(VALUE rb_mGI, VALUE rb_cGICallableInfo)
|
|
243
283
|
G_DEF_CLASS_WITH_PARENT(GI_TYPE_FUNCTION_INFO, "FunctionInfo", rb_mGI,
|
244
284
|
rb_cGICallableInfo);
|
245
285
|
|
246
|
-
RG_DEF_METHOD(
|
247
|
-
|
286
|
+
RG_DEF_METHOD(set_lock_gvl_default, 1);
|
287
|
+
RG_DEF_METHOD(add_lock_gvl_predicate, 0);
|
288
|
+
RG_DEF_METHOD_P(lock_gvl, -1);
|
248
289
|
|
249
290
|
RG_DEF_METHOD(symbol, 0);
|
250
291
|
RG_DEF_METHOD(flags, 0);
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
2
|
/*
|
3
|
-
* Copyright (C) 2019 Ruby-GNOME Project Team
|
3
|
+
* Copyright (C) 2019-2022 Ruby-GNOME 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
|
@@ -20,5 +20,7 @@
|
|
20
20
|
|
21
21
|
#pragma once
|
22
22
|
|
23
|
+
G_GNUC_INTERNAL gboolean
|
24
|
+
rb_gi_arg_info_is_input_buffer(GIArgInfo *info);
|
23
25
|
G_GNUC_INTERNAL gboolean
|
24
26
|
rb_gi_arg_info_is_output_buffer(GIArgInfo *info);
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
2
|
/*
|
3
|
-
* Copyright (C) 2019-
|
3
|
+
* Copyright (C) 2019-2022 Ruby-GNOME 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
|
@@ -50,6 +50,7 @@ typedef struct {
|
|
50
50
|
struct RBGIArgMetadata_ {
|
51
51
|
GICallableInfo *callable_info;
|
52
52
|
GIArgInfo arg_info;
|
53
|
+
GITypeInfo *type_info;
|
53
54
|
const gchar *name;
|
54
55
|
RBGIArgMetadataType type;
|
55
56
|
RBGIArgMetadataType element_type;
|
@@ -67,6 +68,7 @@ struct RBGIArgMetadata_ {
|
|
67
68
|
gboolean may_be_null_p;
|
68
69
|
gboolean caller_allocates_p;
|
69
70
|
gboolean zero_terminated_p;
|
71
|
+
gboolean input_buffer_p;
|
70
72
|
gboolean output_buffer_p;
|
71
73
|
GIArrayType array_type;
|
72
74
|
gint index;
|
@@ -85,6 +87,14 @@ struct RBGIArgMetadata_ {
|
|
85
87
|
gpointer free_func_data;
|
86
88
|
};
|
87
89
|
|
90
|
+
G_GNUC_INTERNAL void
|
91
|
+
rb_gi_arg_metadata_init_type_info(RBGIArgMetadata *metadata,
|
92
|
+
GITypeInfo *type_info);
|
93
|
+
G_GNUC_INTERNAL void
|
94
|
+
rb_gi_arg_metadata_clear(RBGIArgMetadata *metadata);
|
95
|
+
G_GNUC_INTERNAL void
|
96
|
+
rb_gi_arg_metadata_free(RBGIArgMetadata *metadata);
|
97
|
+
|
88
98
|
G_GNUC_INTERNAL void
|
89
99
|
rb_gi_arguments_init(RBGIArguments *args,
|
90
100
|
GICallableInfo *info,
|
@@ -94,12 +104,20 @@ rb_gi_arguments_init(RBGIArguments *args,
|
|
94
104
|
G_GNUC_INTERNAL void
|
95
105
|
rb_gi_arguments_clear(RBGIArguments *args);
|
96
106
|
|
107
|
+
G_GNUC_INTERNAL VALUE
|
108
|
+
rb_gi_arguments_get_rb_in_args(RBGIArguments *args);
|
97
109
|
G_GNUC_INTERNAL VALUE
|
98
110
|
rb_gi_arguments_get_rb_out_args(RBGIArguments *args);
|
99
111
|
|
100
112
|
G_GNUC_INTERNAL VALUE
|
101
|
-
|
102
|
-
|
113
|
+
rb_gi_arguments_convert_arg(RBGIArguments *args,
|
114
|
+
GIArgument *arg,
|
115
|
+
RBGIArgMetadata *arg_metadata,
|
116
|
+
gboolean duplicate);
|
117
|
+
|
118
|
+
G_GNUC_INTERNAL VALUE
|
119
|
+
rb_gi_arguments_convert_return_value(RBGIArguments *args,
|
120
|
+
GIArgument *return_value);
|
103
121
|
|
104
122
|
G_GNUC_INTERNAL void
|
105
123
|
rb_gi_arguments_fill_raw_out_gerror(RBGIArguments *args,
|