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.
@@ -1,6 +1,6 @@
1
1
  /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright (C) 2012-2021 Ruby-GNOME Project Team
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 GI_BASE_INFO2RVAL(g_callable_info_get_return_type(info));
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-2021 Ruby-GNOME Project Team
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 = rb_gi_arguments_in_to_ruby(data->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
- g_callable_info_prepare_closure(callback->callback_info,
183
- &(callback->cif),
184
- rb_gi_ffi_closure_callback,
185
- callback);
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
- g_callable_info_free_closure(callback->callback_info,
193
- callback->closure);
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, mGLibObject))) {
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, mGLibObject))) {
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
- xfree(callback_data->metadata);
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-2018 Ruby-GNOME2 Project Team
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
- info = SELF(self);
57
- type_info = g_constant_info_get_type(info);
58
- value_size = g_constant_info_get_value(info, &value);
59
- rb_value = GI_ARGUMENT2RVAL(&value, FALSE, type_info, NULL, NULL, NULL);
60
- g_base_info_unref(type_info);
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-2021 Ruby-GNOME Project Team
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-2013 Ruby-GNOME2 Project Team
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
- rb_gi_field_info_get_field_raw_interface(GIFieldInfo *info,
76
- gpointer memory,
77
- GITypeInfo *type_info)
83
+ rb_gi_field_info_get_field_raw_body_interface(FieldToRubyData *data)
78
84
  {
79
- VALUE rb_field_value = Qnil;
80
- GIBaseInfo *interface_info;
81
- GIInfoType interface_type;
82
- GType gtype;
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(interface_type),
94
+ g_info_type_to_string(type),
96
95
  g_type_name(gtype));
97
- break;
96
+ return Qnil;
98
97
  case GI_INFO_TYPE_STRUCT:
99
98
  {
100
- GIStructInfo *struct_info = (GIStructInfo *)interface_info;
101
- gboolean is_pointer;
102
- gpointer target;
103
-
104
- is_pointer = g_type_info_is_pointer(type_info);
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
- rb_field_value = rb_gi_struct_info_to_ruby(struct_info,
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
- GIArgument argument;
119
-
120
- argument.v_pointer = G_STRUCT_MEMBER(gpointer, memory, offset);
121
- rb_field_value = GI_ARGUMENT2RVAL(&argument, FALSE, type_info,
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
- rb_field_value = INT2NUM(raw_value);
123
+ return INT2NUM(raw_value);
132
124
  } else {
133
- rb_field_value = GENUM2RVAL(raw_value, gtype);
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
- rb_field_value = INT2NUM(raw_value);
135
+ return INT2NUM(raw_value);
144
136
  } else {
145
- rb_field_value = GFLAGS2RVAL(raw_value, gtype);
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(interface_type),
155
+ g_info_type_to_string(type),
163
156
  g_type_name(gtype));
164
- break;
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
- rb_gi_field_info_get_field_raw(GIFieldInfo *info, gpointer memory)
161
+ static VALUE
162
+ rb_gi_field_info_get_field_raw_body(VALUE user_data)
175
163
  {
176
- GIArgument argument;
164
+ FieldToRubyData *data = (FieldToRubyData *)user_data;
177
165
  gboolean processed = FALSE;
178
- GITypeInfo *type_info;
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
- argument.v_string = G_STRUCT_MEMBER(gchar *, memory, offset);
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
- rb_field_value =
213
- rb_gi_field_info_get_field_raw_interface(info,
214
- memory,
215
- type_info);
216
- if (!NIL_P(rb_field_value)) {
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, &argument)) {
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(type_tag));
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
- rb_field_value = GI_ARGUMENT2RVAL(&argument, FALSE, type_info,
241
- NULL, NULL, NULL);
242
- g_base_info_unref(type_info);
219
+ return rb_gi_arguments_convert_arg(&(data->args),
220
+ &(data->value),
221
+ &(data->metadata),
222
+ FALSE);
223
+ }
243
224
 
244
- return rb_field_value;
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-2019 Ruby-GNOME Project Team
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
- rg_set_unlock_gvl(VALUE self, VALUE rb_boolean)
52
+ rg_set_lock_gvl_default(VALUE self, VALUE rb_boolean)
53
53
  {
54
- return rb_iv_set(self, "unlock_gvl", rb_boolean);
54
+ return rb_iv_set(self, "lock_gvl_default", rb_boolean);
55
55
  }
56
56
 
57
57
  static VALUE
58
- rg_unlock_gvl_p(VALUE self)
58
+ rg_add_lock_gvl_predicate(VALUE self)
59
59
  {
60
- if (!RVAL2CBOOL(rb_ivar_defined(self, rb_intern("unlock_gvl")))) {
61
- rb_iv_set(self, "unlock_gvl", Qfalse);
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
- return rb_iv_get(self, "unlock_gvl");
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 unlock_gvl = FALSE;
184
+ gboolean lock_gvl = FALSE;
148
185
 
149
- unlock_gvl = RVAL2CBOOL(rb_funcall(rb_info, rb_intern("unlock_gvl?"), 0));
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 (unlock_gvl) {
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
- rb_gi_arguments_get_rb_return_value(&args,
180
- &(data.return_value));
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(set_unlock_gvl, 1);
247
- RG_DEF_METHOD_P(unlock_gvl, 0);
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-2021 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
@@ -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
- rb_gi_arguments_get_rb_return_value(RBGIArguments *args,
102
- GIArgument *return_value);
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,