gobject-introspection 3.4.3 → 3.4.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 +1 -4
  3. data/ext/gobject-introspection/gobject-introspection-enum-types.c +230 -0
  4. data/ext/gobject-introspection/gobject-introspection-enum-types.h +42 -0
  5. data/ext/gobject-introspection/rb-gi-argument.c +11 -4
  6. data/ext/gobject-introspection/rb-gi-arguments-in.c +28 -108
  7. data/ext/gobject-introspection/rb-gi-arguments-out.c +20 -2
  8. data/ext/gobject-introspection/rb-gi-arguments.c +244 -18
  9. data/ext/gobject-introspection/rb-gi-base-info.c +11 -1
  10. data/ext/gobject-introspection/rb-gi-callable-info.c +10 -2
  11. data/ext/gobject-introspection/rb-gi-callback.c +156 -2
  12. data/ext/gobject-introspection/rb-gi-conversions.h +6 -6
  13. data/ext/gobject-introspection/rb-gi-interface-info.c +1 -7
  14. data/ext/gobject-introspection/rb-gi-loader.c +60 -12
  15. data/ext/gobject-introspection/rb-gi-object-info.c +11 -1
  16. data/ext/gobject-introspection/rb-gi-private-arguments-in.h +3 -1
  17. data/ext/gobject-introspection/rb-gi-private-arguments.h +5 -1
  18. data/ext/gobject-introspection/rb-gi-private-callback.h +6 -3
  19. data/ext/gobject-introspection/rb-gi-private.h +1 -0
  20. data/ext/gobject-introspection/rb-gi-repository.c +1 -1
  21. data/ext/gobject-introspection/rb-gi-struct-info.c +15 -3
  22. data/ext/gobject-introspection/rb-gi-vfunc-info.c +2 -2
  23. data/ext/gobject-introspection/rb-gobject-introspection.c +231 -0
  24. data/ext/gobject-introspection/rbgiversion.h +24 -0
  25. data/lib/gobject-introspection/loader.rb +65 -1
  26. data/test/gobject-introspection-test-utils.rb +2 -2
  27. data/test/run-test.rb +18 -25
  28. data/test/test-base-info.rb +5 -1
  29. data/test/test-callable-info.rb +16 -2
  30. data/test/test-loader.rb +53 -7
  31. data/test/test-object-info.rb +5 -1
  32. data/test/test-struct-info.rb +6 -1
  33. metadata +8 -5
@@ -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-2021 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,16 +23,7 @@
23
23
  static gboolean
24
24
  rb_gi_arg_info_may_be_null(GIArgInfo *arg_info)
25
25
  {
26
- #if GI_CHECK_VERSION(1, 42, 0)
27
26
  return g_arg_info_may_be_null(arg_info);
28
- #else
29
- /*
30
- GObject Introspection < 1.42 doesn't support "(nullable)" yet.
31
- So, we assume that all argument may be NULL. It's danger but
32
- convenient.
33
- */
34
- return TRUE;
35
- #endif
36
27
  }
37
28
 
38
29
  static gboolean
@@ -506,12 +497,53 @@ rb_gi_arguments_get_rb_out_args(RBGIArguments *args)
506
497
  return rb_gi_arguments_out_to_ruby(args);
507
498
  }
508
499
 
500
+ void
501
+ rb_gi_arguments_fill_raw_out_gerror(RBGIArguments *args,
502
+ VALUE rb_error)
503
+ {
504
+ if (!g_callable_info_can_throw_gerror(args->info)) {
505
+ return;
506
+ }
507
+
508
+ gint n_args = g_callable_info_get_n_args(args->info);
509
+ /* GError ** isn't listed in args. */
510
+ GError **gerror = *((gpointer *)(args->raw_args[n_args]));
511
+ VALUE cGLibErrorInfo = rb_const_get(mGLib, rb_intern("ErrorInfo"));
512
+ if (NIL_P(rb_error)) {
513
+ g_set_error(gerror,
514
+ RBG_RUBY_ERROR,
515
+ RBG_RUBY_ERROR_UNKNOWN,
516
+ "Unknown error");
517
+ } else {
518
+ VALUE message = rb_funcall(rb_error, rb_intern("message"), 0);
519
+ VALUE backtrace = rb_funcall(rb_error, rb_intern("backtrace"), 0);
520
+ VALUE formatted_backtrace =
521
+ rb_ary_join(backtrace, rb_str_new_cstr(" \n"));
522
+ GQuark gdomain = RBG_RUBY_ERROR;
523
+ gint gcode = RBG_RUBY_ERROR_UNKNOWN;
524
+ if (RVAL2CBOOL(rb_obj_is_kind_of(rb_error, cGLibErrorInfo))) {
525
+ VALUE domain = rb_funcall(rb_error, rb_intern("domain"), 0);
526
+ VALUE code = rb_funcall(rb_error, rb_intern("code"), 0);
527
+ if (!NIL_P(domain) && !NIL_P(code)) {
528
+ gdomain = g_quark_from_string(RVAL2CSTR(domain));
529
+ gcode = NUM2INT(code);
530
+ }
531
+ }
532
+ g_set_error(gerror,
533
+ gdomain,
534
+ gcode,
535
+ "%s\n %s\n",
536
+ RVAL2CSTR(message),
537
+ RVAL2CSTR(formatted_backtrace));
538
+ }
539
+ }
540
+
509
541
  static void
510
542
  rb_gi_arguments_fill_raw_result_interface(RBGIArguments *args,
511
543
  VALUE rb_result,
512
544
  gpointer raw_result,
513
545
  GITypeInfo *type_info,
514
- G_GNUC_UNUSED GITransfer transfer /* TODO */,
546
+ GITransfer transfer,
515
547
  gboolean is_return_value)
516
548
  {
517
549
  GIBaseInfo *interface_info;
@@ -551,8 +583,37 @@ rb_gi_arguments_fill_raw_result_interface(RBGIArguments *args,
551
583
  }
552
584
  break;
553
585
  case GI_INFO_TYPE_FLAGS:
586
+ rb_raise(rb_eNotImpError,
587
+ "TODO: %s::%s: out raw result(interface)[%s]: <%s>",
588
+ g_base_info_get_namespace(args->info),
589
+ g_base_info_get_name(args->info),
590
+ g_info_type_to_string(interface_type),
591
+ g_base_info_get_name(interface_info));
592
+ break;
554
593
  case GI_INFO_TYPE_OBJECT:
555
594
  case GI_INFO_TYPE_INTERFACE:
595
+ {
596
+ GObject *value = RVAL2GOBJ(rb_result);
597
+ GType gtype = g_registered_type_info_get_g_type(interface_info);
598
+ if (gtype != G_TYPE_NONE &&
599
+ !G_TYPE_CHECK_INSTANCE_TYPE(value, gtype)) {
600
+ rb_raise(rb_eArgError,
601
+ "%s::%s: must return <%s> object: <%" PRIsVALUE ">",
602
+ g_base_info_get_namespace(args->info),
603
+ g_base_info_get_name(args->info),
604
+ g_type_name(gtype),
605
+ rb_result);
606
+ }
607
+ if (transfer == GI_TRANSFER_EVERYTHING) {
608
+ g_object_ref(value);
609
+ }
610
+ if (is_return_value) {
611
+ ffi_return_value->v_pointer = value;
612
+ } else {
613
+ *((gpointer *)raw_result) = value;
614
+ }
615
+ }
616
+ break;
556
617
  case GI_INFO_TYPE_CONSTANT:
557
618
  rb_raise(rb_eNotImpError,
558
619
  "TODO: %s::%s: out raw result(interface)[%s]: <%s>",
@@ -586,6 +647,160 @@ rb_gi_arguments_fill_raw_result_interface(RBGIArguments *args,
586
647
  g_base_info_unref(interface_info);
587
648
  }
588
649
 
650
+ static void
651
+ rb_gi_arguments_fill_raw_result_glist_interface(
652
+ RBGIArguments *args,
653
+ VALUE rb_result,
654
+ gpointer raw_result,
655
+ GITypeInfo *type_info,
656
+ GITypeInfo *element_type_info,
657
+ G_GNUC_UNUSED GITransfer transfer /* TODO */,
658
+ gboolean is_return_value)
659
+ {
660
+ GIFFIReturnValue *ffi_return_value = raw_result;
661
+ GIBaseInfo *interface_info;
662
+ GIInfoType interface_type;
663
+ const gchar *interface_name;
664
+ GType gtype;
665
+ GList *list = NULL;
666
+
667
+ interface_info = g_type_info_get_interface(element_type_info);
668
+ interface_type = g_base_info_get_type(interface_info);
669
+ interface_name = g_info_type_to_string(interface_type);
670
+ gtype = g_registered_type_info_get_g_type(interface_info);
671
+
672
+ switch (interface_type) {
673
+ case GI_INFO_TYPE_INVALID:
674
+ case GI_INFO_TYPE_FUNCTION:
675
+ case GI_INFO_TYPE_CALLBACK:
676
+ case GI_INFO_TYPE_STRUCT:
677
+ case GI_INFO_TYPE_BOXED:
678
+ case GI_INFO_TYPE_ENUM:
679
+ case GI_INFO_TYPE_FLAGS:
680
+ g_base_info_unref(interface_info);
681
+ g_base_info_unref(element_type_info);
682
+ rb_raise(rb_eNotImpError,
683
+ "TODO: %s::%s: out raw result(glist)[interface(%s)](%s)",
684
+ g_base_info_get_namespace(args->info),
685
+ g_base_info_get_name(args->info),
686
+ interface_name,
687
+ g_type_name(gtype));
688
+ break;
689
+ case GI_INFO_TYPE_OBJECT:
690
+ list = RVAL2GOBJGLIST(rb_result);
691
+ if (transfer == GI_TRANSFER_EVERYTHING) {
692
+ g_list_foreach(list, (GFunc)g_object_ref, NULL);
693
+ }
694
+ break;
695
+ case GI_INFO_TYPE_INTERFACE:
696
+ case GI_INFO_TYPE_CONSTANT:
697
+ case GI_INFO_TYPE_INVALID_0:
698
+ case GI_INFO_TYPE_UNION:
699
+ case GI_INFO_TYPE_VALUE:
700
+ case GI_INFO_TYPE_SIGNAL:
701
+ case GI_INFO_TYPE_VFUNC:
702
+ case GI_INFO_TYPE_PROPERTY:
703
+ case GI_INFO_TYPE_FIELD:
704
+ case GI_INFO_TYPE_ARG:
705
+ case GI_INFO_TYPE_TYPE:
706
+ case GI_INFO_TYPE_UNRESOLVED:
707
+ g_base_info_unref(interface_info);
708
+ g_base_info_unref(element_type_info);
709
+ rb_raise(rb_eNotImpError,
710
+ "TODO: %s::%s: out raw result(glist)[interface(%s)](%s)",
711
+ g_base_info_get_namespace(args->info),
712
+ g_base_info_get_name(args->info),
713
+ interface_name,
714
+ g_type_name(gtype));
715
+ break;
716
+ default:
717
+ g_base_info_unref(interface_info);
718
+ g_base_info_unref(element_type_info);
719
+ g_assert_not_reached();
720
+ break;
721
+ }
722
+
723
+ if (is_return_value) {
724
+ ffi_return_value->v_ulong = (gulong)list;
725
+ } else {
726
+ *((gpointer *)raw_result) = list;
727
+ }
728
+ }
729
+
730
+ static void
731
+ rb_gi_arguments_fill_raw_result_glist(RBGIArguments *args,
732
+ VALUE rb_result,
733
+ gpointer raw_result,
734
+ GITypeInfo *type_info,
735
+ GITransfer transfer,
736
+ gboolean is_return_value)
737
+ {
738
+ GIFFIReturnValue *ffi_return_value = raw_result;
739
+ GITypeInfo *element_type_info;
740
+ GITypeTag element_type_tag;
741
+
742
+ element_type_info = g_type_info_get_param_type(type_info, 0);
743
+ element_type_tag = g_type_info_get_tag(element_type_info);
744
+
745
+ if (is_return_value) {
746
+ ffi_return_value->v_ulong = (gulong)NULL;
747
+ } else {
748
+ *((gpointer *)raw_result) = NULL;
749
+ }
750
+
751
+ switch (element_type_tag) {
752
+ case GI_TYPE_TAG_VOID:
753
+ case GI_TYPE_TAG_BOOLEAN:
754
+ case GI_TYPE_TAG_INT8:
755
+ case GI_TYPE_TAG_UINT8:
756
+ case GI_TYPE_TAG_INT16:
757
+ case GI_TYPE_TAG_UINT16:
758
+ case GI_TYPE_TAG_INT32:
759
+ case GI_TYPE_TAG_UINT32:
760
+ case GI_TYPE_TAG_INT64:
761
+ case GI_TYPE_TAG_UINT64:
762
+ case GI_TYPE_TAG_FLOAT:
763
+ case GI_TYPE_TAG_DOUBLE:
764
+ case GI_TYPE_TAG_GTYPE:
765
+ case GI_TYPE_TAG_UTF8:
766
+ case GI_TYPE_TAG_FILENAME:
767
+ case GI_TYPE_TAG_ARRAY:
768
+ g_base_info_unref(element_type_info);
769
+ rb_raise(rb_eNotImpError,
770
+ "TODO: %s::%s: out raw result(GList)[%s]",
771
+ g_base_info_get_namespace(args->info),
772
+ g_base_info_get_name(args->info),
773
+ g_type_tag_to_string(element_type_tag));
774
+ break;
775
+ case GI_TYPE_TAG_INTERFACE:
776
+ rb_gi_arguments_fill_raw_result_glist_interface(
777
+ args,
778
+ rb_result,
779
+ raw_result,
780
+ type_info,
781
+ element_type_info,
782
+ transfer,
783
+ is_return_value);
784
+ break;
785
+ case GI_TYPE_TAG_GLIST:
786
+ case GI_TYPE_TAG_GSLIST:
787
+ case GI_TYPE_TAG_GHASH:
788
+ case GI_TYPE_TAG_ERROR:
789
+ case GI_TYPE_TAG_UNICHAR:
790
+ g_base_info_unref(element_type_info);
791
+ rb_raise(rb_eNotImpError,
792
+ "TODO: %s::%s: out raw result(GList)[%s]",
793
+ g_base_info_get_namespace(args->info),
794
+ g_base_info_get_name(args->info),
795
+ g_type_tag_to_string(element_type_tag));
796
+ break;
797
+ default:
798
+ g_base_info_unref(element_type_info);
799
+ g_assert_not_reached();
800
+ break;
801
+ }
802
+ }
803
+
589
804
  /*
590
805
  We need to cast from different type for return value. (We don't
591
806
  need it for out arguments.) Because of libffi specification:
@@ -704,12 +919,16 @@ rb_gi_arguments_fill_raw_result(RBGIArguments *args,
704
919
  }
705
920
  break;
706
921
  case GI_TYPE_TAG_UTF8:
707
- if (is_return_value) {
708
- ffi_return_value->v_ulong =
709
- (gulong)RVAL2CSTR_ACCEPT_SYMBOL(rb_result);
710
- } else {
711
- *((gchar **)raw_result) =
712
- (gchar *)RVAL2CSTR_ACCEPT_SYMBOL(rb_result);
922
+ {
923
+ gchar *result = (gchar *)RVAL2CSTR_ACCEPT_SYMBOL(rb_result);
924
+ if (transfer == GI_TRANSFER_EVERYTHING) {
925
+ result = g_strdup(result);
926
+ }
927
+ if (is_return_value) {
928
+ ffi_return_value->v_ulong = (gulong)result;
929
+ } else {
930
+ *((gchar **)raw_result) = (gchar *)result;
931
+ }
713
932
  }
714
933
  break;
715
934
  case GI_TYPE_TAG_FILENAME:
@@ -748,6 +967,13 @@ rb_gi_arguments_fill_raw_result(RBGIArguments *args,
748
967
  is_return_value);
749
968
  break;
750
969
  case GI_TYPE_TAG_GLIST:
970
+ rb_gi_arguments_fill_raw_result_glist(args,
971
+ rb_result,
972
+ raw_result,
973
+ type_info,
974
+ transfer,
975
+ is_return_value);
976
+ break;
751
977
  case GI_TYPE_TAG_GSLIST:
752
978
  case GI_TYPE_TAG_GHASH:
753
979
  rb_raise(rb_eNotImpError,
@@ -842,7 +1068,7 @@ rb_gi_arguments_fill_raw_results(RBGIArguments *args,
842
1068
  rb_gi_arguments_fill_raw_result(args,
843
1069
  RARRAY_AREF(rb_results, i_rb_result),
844
1070
  argument->v_pointer,
845
- return_type_info,
1071
+ type_info,
846
1072
  transfer,
847
1073
  FALSE);
848
1074
  i_rb_result++;
@@ -1,6 +1,6 @@
1
1
  /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright (C) 2012 Ruby-GNOME2 Project Team
3
+ * Copyright (C) 2012-2021 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
@@ -160,6 +160,15 @@ rg_namespace(VALUE self)
160
160
  return CSTR2RVAL(g_base_info_get_namespace(info));
161
161
  }
162
162
 
163
+ static VALUE
164
+ rg_container(VALUE self)
165
+ {
166
+ GIBaseInfo *info;
167
+
168
+ info = SELF(self);
169
+ return rb_gi_base_info_to_ruby(g_base_info_get_container(info));
170
+ }
171
+
163
172
  static VALUE
164
173
  rg_operator_aref(VALUE self, VALUE name)
165
174
  {
@@ -201,6 +210,7 @@ rb_gi_base_info_init(VALUE rb_mGI)
201
210
  RG_DEF_METHOD(type, 0);
202
211
  RG_DEF_METHOD(name, 0);
203
212
  RG_DEF_METHOD(namespace, 0);
213
+ RG_DEF_METHOD(container, 0);
204
214
  RG_DEF_METHOD_OPERATOR("[]", aref, 1);
205
215
  RG_DEF_METHOD(each, 0);
206
216
 
@@ -1,6 +1,6 @@
1
1
  /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright (C) 2012 Ruby-GNOME2 Project Team
3
+ * Copyright (C) 2012-2021 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
@@ -21,7 +21,7 @@
21
21
  #include "rb-gi-private.h"
22
22
 
23
23
  #define RG_TARGET_NAMESPACE rb_cGICallableInfo
24
- #define SELF(self) ((GICallableInfo *)(RVAL2GI_BASE_INFO(self)))
24
+ #define SELF(self) RVAL2GI_CALLABLE_INFO(self)
25
25
 
26
26
  GType
27
27
  gi_callable_info_get_type(void)
@@ -35,6 +35,13 @@ gi_callable_info_get_type(void)
35
35
  return type;
36
36
  }
37
37
 
38
+ static VALUE
39
+ rg_can_throw_gerror_p(VALUE self)
40
+ {
41
+ GICallableInfo *info = SELF(self);
42
+ return CBOOL2RVAL(g_callable_info_can_throw_gerror(info));
43
+ }
44
+
38
45
  static VALUE
39
46
  rg_return_type(VALUE self)
40
47
  {
@@ -91,6 +98,7 @@ rb_gi_callable_info_init(VALUE rb_mGI, VALUE rb_cGIBaseInfo)
91
98
  G_DEF_CLASS_WITH_PARENT(GI_TYPE_CALLABLE_INFO, "CallableInfo", rb_mGI,
92
99
  rb_cGIBaseInfo);
93
100
 
101
+ RG_DEF_METHOD_P(can_throw_gerror, 0);
94
102
  RG_DEF_METHOD(return_type, 0);
95
103
  RG_DEF_METHOD(caller_owns, 0);
96
104
  RG_DEF_METHOD_P(may_return_null, 0);
@@ -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-2021 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
@@ -28,17 +28,171 @@ struct RBGICallbackData_ {
28
28
  VALUE rb_owner;
29
29
  };
30
30
 
31
+ typedef struct {
32
+ RBGIArguments *args;
33
+ RBGICallback *callback;
34
+ RBGICallbackData *callback_data;
35
+ void *return_value;
36
+ VALUE rb_return_value;
37
+ } RBGICallbackInvokeData;
38
+
31
39
  static GPtrArray *callback_finders;
32
40
  static VALUE mGLibObject = Qnil;
33
41
  static VALUE mGI = Qnil;
34
42
 
43
+ static VALUE
44
+ rb_gi_callback_invoke_without_protect(VALUE user_data)
45
+ {
46
+ RBGICallbackInvokeData *data = (RBGICallbackInvokeData *)user_data;
47
+ VALUE rb_args = rb_gi_arguments_in_to_ruby(data->args);
48
+
49
+ if (data->callback->method_name) {
50
+ ID id___send__;
51
+ VALUE rb_receiver = rb_ary_shift(rb_args);
52
+ CONST_ID(id___send__, "__send__");
53
+ rb_ary_unshift(rb_args, rb_str_new_cstr(data->callback->method_name));
54
+ data->rb_return_value =
55
+ rb_funcallv(rb_receiver,
56
+ id___send__,
57
+ RARRAY_LENINT(rb_args),
58
+ RARRAY_CONST_PTR(rb_args));
59
+ } else {
60
+ ID id_call;
61
+ CONST_ID(id_call, "call");
62
+ VALUE rb_callback =
63
+ rb_gi_callback_data_get_rb_callback(data->callback_data);
64
+ data->rb_return_value =
65
+ rb_funcallv(rb_callback,
66
+ id_call,
67
+ RARRAY_LENINT(rb_args),
68
+ RARRAY_CONST_PTR(rb_args));
69
+ }
70
+
71
+ return Qnil;
72
+ }
73
+
74
+ static VALUE
75
+ rb_gi_callback_invoke_fill_raw_results(VALUE user_data)
76
+ {
77
+ RBGICallbackInvokeData *data = (RBGICallbackInvokeData *)user_data;
78
+ rb_gi_arguments_fill_raw_results(data->args,
79
+ data->rb_return_value,
80
+ data->return_value);
81
+ return Qnil;
82
+ }
83
+
84
+ static VALUE
85
+ rb_gi_callback_invoke(VALUE user_data)
86
+ {
87
+ RBGICallbackInvokeData *data = (RBGICallbackInvokeData *)user_data;
88
+ int state = 0;
89
+ rb_protect(rb_gi_callback_invoke_without_protect,
90
+ user_data,
91
+ &state);
92
+ if (state != 0) {
93
+ VALUE error = rb_errinfo();
94
+ rb_gi_arguments_fill_raw_out_gerror(data->args, error);
95
+ rb_protect(rb_gi_callback_invoke_fill_raw_results,
96
+ user_data,
97
+ &state);
98
+ } else {
99
+ rb_protect(rb_gi_callback_invoke_fill_raw_results,
100
+ user_data,
101
+ &state);
102
+ if (state != 0) {
103
+ VALUE error = rb_errinfo();
104
+ rb_gi_arguments_fill_raw_out_gerror(data->args, error);
105
+ }
106
+ }
107
+ return Qnil;
108
+ }
109
+
110
+ static void
111
+ rb_gi_ffi_closure_callback(G_GNUC_UNUSED ffi_cif *cif,
112
+ void *return_value,
113
+ void **raw_args,
114
+ void *data)
115
+ {
116
+ RBGICallback *callback = data;
117
+ RBGICallbackData *callback_data = NULL;
118
+ RBGIArguments args;
119
+
120
+ rb_gi_arguments_init(&args,
121
+ callback->callback_info,
122
+ Qnil,
123
+ Qnil,
124
+ raw_args);
125
+ {
126
+ guint i;
127
+
128
+ for (i = 0; i < args.metadata->len; i++) {
129
+ RBGIArgMetadata *metadata;
130
+
131
+ metadata = g_ptr_array_index(args.metadata, i);
132
+ if (!metadata->closure_p) {
133
+ continue;
134
+ }
135
+
136
+ callback_data = *((RBGICallbackData **)(raw_args[i]));
137
+ break;
138
+ }
139
+
140
+ if (!callback_data && args.metadata->len > 0) {
141
+ RBGIArgMetadata *metadata;
142
+
143
+ i = args.metadata->len - 1;
144
+ metadata = g_ptr_array_index(args.metadata, i);
145
+ if (metadata->type.tag == GI_TYPE_TAG_VOID &&
146
+ metadata->type.pointer_p &&
147
+ strcmp(metadata->name, "data") == 0) {
148
+ callback_data = *((RBGICallbackData **)(raw_args[i]));
149
+ }
150
+ }
151
+ }
152
+
153
+ {
154
+ RBGICallbackInvokeData data;
155
+ data.args = &args;
156
+ data.callback = callback;
157
+ data.callback_data = callback_data;
158
+ data.return_value = return_value;
159
+ data.rb_return_value = Qnil;
160
+ rbgutil_invoke_callback(rb_gi_callback_invoke, (VALUE)&data);
161
+ }
162
+ rb_gi_arguments_clear(&args);
163
+
164
+ if (callback_data) {
165
+ RBGIArgMetadata *callback_metadata =
166
+ rb_gi_callback_data_get_metadata(callback_data);
167
+ if (callback_metadata->scope_type == GI_SCOPE_TYPE_ASYNC) {
168
+ rb_gi_callback_data_free(callback_data);
169
+ }
170
+ }
171
+ }
172
+
173
+ RBGICallback *
174
+ rb_gi_callback_new(GICallbackInfo *callback_info,
175
+ const gchar *method_name)
176
+ {
177
+ RBGICallback *callback = RB_ZALLOC(RBGICallback);
178
+ callback->callback_info = callback_info;
179
+ g_base_info_ref(callback->callback_info);
180
+ callback->method_name = g_strdup(method_name);
181
+ callback->closure =
182
+ g_callable_info_prepare_closure(callback->callback_info,
183
+ &(callback->cif),
184
+ rb_gi_ffi_closure_callback,
185
+ callback);
186
+ return callback;
187
+ }
188
+
35
189
  static void
36
190
  rb_gi_callback_free(RBGICallback *callback)
37
191
  {
38
192
  g_callable_info_free_closure(callback->callback_info,
39
193
  callback->closure);
194
+ g_free(callback->method_name);
40
195
  g_base_info_unref(callback->callback_info);
41
- g_base_info_unref(callback->type_info);
42
196
  xfree(callback);
43
197
  }
44
198
 
@@ -1,6 +1,6 @@
1
1
  /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright (C) 2012-2014 Ruby-GNOME2 Project Team
3
+ * Copyright (C) 2012-2021 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
@@ -18,8 +18,7 @@
18
18
  * MA 02110-1301 USA
19
19
  */
20
20
 
21
- #ifndef RB_GI_CONVERSIONS_H
22
- #define RB_GI_CONVERSIONS_H
21
+ #pragma once
23
22
 
24
23
  #define RVAL2GI_REPOSITORY(rb_object) (G_IREPOSITORY(RVAL2GOBJ(rb_object)))
25
24
  #define RVAL2GI_REPOSITORY_LOAD_FLAGS(rb_flags) \
@@ -65,6 +64,10 @@
65
64
  ((GIFieldInfo *)RVAL2GI_BASE_INFO(rb_object))
66
65
  #define RVAL2GI_TYPE_INFO(rb_object) \
67
66
  ((GITypeInfo *)RVAL2GI_BASE_INFO(rb_object))
67
+ #define RVAL2GI_CALLABLE_INFO(rb_object) \
68
+ ((GICallableInfo *)RVAL2GI_BASE_INFO(rb_object))
69
+ #define RVAL2GI_VFUNC_INFO(rb_object) \
70
+ ((GIVFuncInfo *)RVAL2GI_BASE_INFO(rb_object))
68
71
 
69
72
  #define GI_INFO_TYPE2RVAL(type) (GENUM2RVAL(type, G_TYPE_I_INFO_TYPE))
70
73
  #define GI_TRANSFER2RVAL(transfer) (GENUM2RVAL(transfer, G_TYPE_I_TRANSFER))
@@ -100,6 +103,3 @@ VALUE rb_gi_return_argument_to_ruby (GICallableInfo *callable_info,
100
103
  GPtrArray *args_metadata);
101
104
 
102
105
  VALUE rb_gi_array_type_to_ruby (GIArrayType type);
103
-
104
- #endif
105
-
@@ -1,6 +1,6 @@
1
1
  /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright (C) 2012-2017 Ruby-GNOME2 Project Team
3
+ * Copyright (C) 2012-2021 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
@@ -125,15 +125,9 @@ rg_get_signal(VALUE self, VALUE rb_n_or_name)
125
125
  n = NUM2INT(rb_n_or_name);
126
126
  signal_info = g_interface_info_get_signal(info, n);
127
127
  } else {
128
- #ifdef HAVE_G_INTERFACE_INFO_FIND_SIGNAL
129
128
  const char *name;
130
129
  name = RVAL2CSTR(rb_n_or_name);
131
130
  signal_info = g_interface_info_find_signal(info, name);
132
- #else
133
- rb_raise(rb_eArgError,
134
- "g_interface_info_find_signal() is defined "
135
- "since GObjectIntrospection 1.34");
136
- #endif
137
131
  }
138
132
 
139
133
  return GI_BASE_INFO2RVAL_WITH_UNREF(signal_info);