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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 46669e91b4af175368180fc2152330751da6a7a240f942e6d7acef846822fdf7
4
- data.tar.gz: 0456bafef2aca2d5c43dff46556b11d181251bc95e455b3de4b12d9ddc298f87
3
+ metadata.gz: 54062f046bb51a2e07d28faa23e18411b178410186c51ef6d5f233e4a9192af8
4
+ data.tar.gz: 83e81475c6625c0765a309bfaac9cde57e156a6916bdee19a29eb3b52eaeb0e0
5
5
  SHA512:
6
- metadata.gz: a5a15ad2b14adf1be44f0924eb002c24256c77c30016f5fa0734d0035e1a5842ca70edb624614da61c8f3065bcf1f4bc832685cfc383a0e3daa5e5aa020bb312
7
- data.tar.gz: e5e058654ef3ac94dd75dd1c247ee3c68fcda15eb7996f9523688ae77f6f5a7e7d3943f450864aa4acbc94cefa6da6da0a6aec221eaca9bba8de3087a853ad4d
6
+ metadata.gz: fb439ff8c2eb5aead6a768ea4b68b65d9c7f6fa36c7fdc027ec3b184578eeb5471e81c45e752922cfdd1a2ecd4a752ffe111c0af89d96e1105e5a385f775550f
7
+ data.tar.gz: b285185c0bedfc226e8cefd3c31b929254dc33addf84756f5d83d9e01b3bb1a2c15da3d5600531159ab2e2dd1c27988e9146816fb30c12911c3cfa512b5e2ea1
@@ -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
@@ -23,6 +23,41 @@
23
23
  #define RG_TARGET_NAMESPACE rb_cGIArgInfo
24
24
  #define SELF(self) (RVAL2GI_ARG_INFO(self))
25
25
 
26
+ gboolean
27
+ rb_gi_arg_info_is_input_buffer(GIArgInfo *info)
28
+ {
29
+ if (g_arg_info_get_direction(info) != GI_DIRECTION_IN) {
30
+ return FALSE;
31
+ }
32
+
33
+ /* Heuristic */
34
+ const gchar *name = g_base_info_get_name((GIBaseInfo *)info);
35
+ if (strcmp(name, "buffer") != 0) {
36
+ return FALSE;
37
+ }
38
+
39
+ GITypeInfo type_info;
40
+ g_arg_info_load_type(info, &type_info);
41
+ if (g_type_info_get_tag(&type_info) != GI_TYPE_TAG_ARRAY) {
42
+ return FALSE;
43
+ }
44
+
45
+ GIArrayType array_type = g_type_info_get_array_type(&type_info);
46
+ if (array_type != GI_ARRAY_TYPE_C) {
47
+ return FALSE;
48
+ }
49
+
50
+ gint length_index = g_type_info_get_array_length(&type_info);
51
+ if (length_index == -1) {
52
+ return FALSE;
53
+ }
54
+
55
+ GITypeInfo *element_type_info = g_type_info_get_param_type(&type_info, 0);
56
+ GITypeTag element_type_tag = g_type_info_get_tag(element_type_info);
57
+ g_base_info_unref(element_type_info);
58
+ return element_type_tag == GI_TYPE_TAG_UINT8;
59
+ }
60
+
26
61
  gboolean
27
62
  rb_gi_arg_info_is_output_buffer(GIArgInfo *info)
28
63
  {
@@ -148,6 +183,13 @@ rg_type(VALUE self)
148
183
  return GI_BASE_INFO2RVAL_WITH_UNREF(g_arg_info_get_type(info));
149
184
  }
150
185
 
186
+ static VALUE
187
+ rg_input_buffer_p(VALUE self)
188
+ {
189
+ GIArgInfo *info = SELF(self);
190
+ return CBOOL2RVAL(rb_gi_arg_info_is_input_buffer(info));
191
+ }
192
+
151
193
  static VALUE
152
194
  rg_output_buffer_p(VALUE self)
153
195
  {
@@ -175,6 +217,7 @@ rb_gi_arg_info_init(VALUE rb_mGI, VALUE rb_cGIBaseInfo)
175
217
  RG_DEF_METHOD(destroy, 0);
176
218
  RG_DEF_METHOD(type, 0);
177
219
 
220
+ RG_DEF_METHOD_P(input_buffer, 0);
178
221
  RG_DEF_METHOD_P(output_buffer, 0);
179
222
 
180
223
  G_DEF_CLASS(G_TYPE_I_DIRECTION, "Direction", rb_mGI);
@@ -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
@@ -36,7 +36,6 @@ rb_gi_arguments_in_to_ruby(RBGIArguments *args)
36
36
  rb_in_args = rb_ary_new_capa(args->metadata->len);
37
37
  for (i = 0; i < args->metadata->len; i++) {
38
38
  RBGIArgMetadata *metadata;
39
- GITypeInfo *type_info;
40
39
  VALUE rb_arg;
41
40
 
42
41
  metadata = g_ptr_array_index(args->metadata, i);
@@ -47,15 +46,14 @@ rb_gi_arguments_in_to_ruby(RBGIArguments *args)
47
46
  if (metadata->closure_p) {
48
47
  continue;
49
48
  }
49
+ if (metadata->array_length_p) {
50
+ continue;
51
+ }
50
52
 
51
- type_info = g_arg_info_get_type(&(metadata->arg_info));
52
- /* TODO */
53
- rb_arg = GI_ARGUMENT2RVAL(metadata->in_arg,
54
- FALSE,
55
- type_info,
56
- args->in_args,
57
- args->out_args,
58
- args->metadata);
53
+ rb_arg = rb_gi_arguments_convert_arg(args,
54
+ metadata->in_arg,
55
+ metadata,
56
+ FALSE);
59
57
  rb_ary_push(rb_in_args, rb_arg);
60
58
  }
61
59
 
@@ -1203,10 +1201,14 @@ rb_gi_arguments_in_init_arg_ruby_interface(RBGIArguments *args,
1203
1201
  rb_gi_arguments_in_free_interface_struct_gbytes;
1204
1202
  }
1205
1203
  } else if (metadata->type.interface_gtype == G_TYPE_CLOSURE) {
1206
- GClosure *rclosure = NULL;
1207
-
1208
- rclosure = g_rclosure_new(metadata->rb_arg, Qnil, NULL);
1209
- g_rclosure_attach(rclosure, args->rb_receiver);
1204
+ GClosure *rclosure = g_rclosure_new(metadata->rb_arg, Qnil, NULL);
1205
+ if (RVAL2CBOOL(rb_obj_is_kind_of(args->rb_receiver,
1206
+ rbg_cGLibObject()))) {
1207
+ g_rclosure_attach_gobject(rclosure, args->rb_receiver);
1208
+ g_closure_unref(rclosure);
1209
+ } else {
1210
+ g_rclosure_attach(rclosure, args->rb_receiver);
1211
+ }
1210
1212
  metadata->in_arg->v_pointer = rclosure;
1211
1213
  } else {
1212
1214
  metadata->in_arg->v_pointer =
@@ -1503,7 +1505,7 @@ rb_gi_arguments_in_init_arg_ruby_ghash_convert(VALUE rb_key,
1503
1505
  data->key_ruby_to_c_data->rb_value = rb_key;
1504
1506
  key = data->key_ruby_to_c_func(data->key_ruby_to_c_data);
1505
1507
  data->value_ruby_to_c_data->rb_value = rb_value;
1506
- value = data->key_ruby_to_c_func(data->value_ruby_to_c_data);
1508
+ value = data->value_ruby_to_c_func(data->value_ruby_to_c_data);
1507
1509
  g_hash_table_insert(data->hash_table, key, value);
1508
1510
  return ST_CONTINUE;
1509
1511
  }
@@ -2023,16 +2025,18 @@ rb_gi_arguments_in_init_arg_raw_interface(RBGIArguments *args,
2023
2025
  metadata->in_arg->v_pointer = *((gpointer *)(args->raw_args[metadata->index]));
2024
2026
  break;
2025
2027
  case GI_INFO_TYPE_BOXED:
2028
+ rb_raise(rb_eNotImpError,
2029
+ "TODO: %s::%s: raw argument -> GIArgument(interface)[%s]: <%s>",
2030
+ g_base_info_get_namespace(args->info),
2031
+ g_base_info_get_name(args->info),
2032
+ g_info_type_to_string(metadata->type.interface_type),
2033
+ g_base_info_get_name(metadata->type.interface_info));
2034
+ break;
2026
2035
  case GI_INFO_TYPE_ENUM:
2027
- rb_raise(rb_eNotImpError,
2028
- "TODO: %s::%s: raw argument -> GIArgument(interface)[%s]: <%s>",
2029
- g_base_info_get_namespace(args->info),
2030
- g_base_info_get_name(args->info),
2031
- g_info_type_to_string(metadata->type.interface_type),
2032
- g_base_info_get_name(metadata->type.interface_info));
2033
- break;
2036
+ metadata->in_arg->v_int32 = *((gint32 *)(args->raw_args[metadata->index]));
2037
+ break;
2034
2038
  case GI_INFO_TYPE_FLAGS:
2035
- metadata->in_arg->v_int32= *((gint32 *)(args->raw_args[metadata->index]));
2039
+ metadata->in_arg->v_int32 = *((gint32 *)(args->raw_args[metadata->index]));
2036
2040
  break;
2037
2041
  case GI_INFO_TYPE_OBJECT:
2038
2042
  case GI_INFO_TYPE_INTERFACE:
@@ -2164,12 +2168,15 @@ rb_gi_arguments_in_init(RBGIArguments *args)
2164
2168
  void
2165
2169
  rb_gi_arguments_in_clear(RBGIArguments *args)
2166
2170
  {
2167
- guint i;
2171
+ if (!args->metadata) {
2172
+ return;
2173
+ }
2168
2174
 
2169
2175
  if (!args->rb_mode_p) {
2170
2176
  return;
2171
2177
  }
2172
2178
 
2179
+ guint i;
2173
2180
  for (i = 0; i < args->metadata->len; i++) {
2174
2181
  RBGIArgMetadata *metadata;
2175
2182
 
@@ -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
@@ -140,6 +140,7 @@ rb_gi_arguments_out_free_array_array_interface_struct(RBGIArguments *args,
140
140
  */
141
141
  break;
142
142
  }
143
+ G_GNUC_FALLTHROUGH;
143
144
  default:
144
145
  rb_raise(rb_eNotImpError,
145
146
  "TODO: [%s] %s free GIArgument(%s/%s)[interface(%s)](%s)[%s]",
@@ -150,6 +151,7 @@ rb_gi_arguments_out_free_array_array_interface_struct(RBGIArguments *args,
150
151
  g_info_type_to_string(metadata->element_type.interface_type),
151
152
  g_type_name(metadata->element_type.interface_gtype),
152
153
  rb_gi_transfer_to_string(metadata->transfer));
154
+ break;
153
155
  }
154
156
  g_array_free(target, TRUE);
155
157
  }
@@ -264,14 +266,6 @@ rb_gi_arguments_out_free_error(RBGIArguments *args,
264
266
  gpointer user_data)
265
267
  {
266
268
  GError **target = metadata->out_arg->v_pointer;
267
- if (metadata->transfer != GI_TRANSFER_NOTHING) {
268
- rb_raise(rb_eNotImpError,
269
- "TODO: [%s] %s free GIArgument(%s)[%s]",
270
- metadata->name,
271
- rb_gi_direction_to_string(metadata->direction),
272
- g_type_tag_to_string(metadata->type.tag),
273
- rb_gi_transfer_to_string(metadata->transfer));
274
- }
275
269
  xfree(target);
276
270
  }
277
271
 
@@ -315,7 +309,12 @@ rb_gi_arguments_out_init_arg_array_c(RBGIArguments *args,
315
309
  rb_gi_transfer_to_string(metadata->transfer));
316
310
  }
317
311
  argument->v_pointer = RSTRING_PTR(metadata->rb_arg);
318
- length_metadata->out_arg->v_size = RSTRING_LEN(metadata->rb_arg);
312
+ if (length_metadata->in_arg) {
313
+ length_metadata->in_arg->v_size = RSTRING_LEN(metadata->rb_arg);
314
+ }
315
+ if (length_metadata->out_arg) {
316
+ length_metadata->out_arg->v_size = RSTRING_LEN(metadata->rb_arg);
317
+ }
319
318
  } else {
320
319
  argument->v_pointer = ALLOC(guint8 *);
321
320
  metadata->free_func = rb_gi_arguments_out_free_array_c_uint8;
@@ -788,8 +787,11 @@ rb_gi_arguments_out_init(RBGIArguments *args)
788
787
  void
789
788
  rb_gi_arguments_out_clear(RBGIArguments *args)
790
789
  {
791
- guint i;
790
+ if (!args->metadata) {
791
+ return;
792
+ }
792
793
 
794
+ guint i;
793
795
  for (i = 0; i < args->metadata->len; i++) {
794
796
  RBGIArgMetadata *metadata;
795
797
 
@@ -887,12 +889,10 @@ rb_gi_arguments_out_to_ruby_arg(RBGIArguments *args,
887
889
  break;
888
890
  }
889
891
 
890
- return rb_gi_argument_to_ruby(&normalized_argument,
891
- duplicate,
892
- metadata->type.info,
893
- args->in_args,
894
- args->out_args,
895
- args->metadata);
892
+ return rb_gi_arguments_convert_arg(args,
893
+ &normalized_argument,
894
+ metadata,
895
+ duplicate);
896
896
  }
897
897
 
898
898
  VALUE