gobject-introspection 3.0.9-x86-mingw32 → 3.1.0-x86-mingw32

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.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +2 -2
  3. data/ext/gobject-introspection/rb-gi-argument.c +205 -47
  4. data/ext/gobject-introspection/rb-gi-constructor-info.c +9 -15
  5. data/ext/gobject-introspection/rb-gi-function-info.c +147 -46
  6. data/ext/gobject-introspection/rb-gi-method-info.c +5 -3
  7. data/ext/gobject-introspection/rb-gi-private.h +3 -1
  8. data/lib/2.2/gobject_introspection.so +0 -0
  9. data/lib/2.3/gobject_introspection.so +0 -0
  10. data/lib/gi.rb +19 -0
  11. data/lib/gobject-introspection.rb +10 -0
  12. data/lib/gobject-introspection/callable-info.rb +19 -5
  13. data/lib/gobject-introspection/loader.rb +113 -82
  14. data/vendor/local/bin/g-ir-compiler.exe +0 -0
  15. data/vendor/local/bin/g-ir-generate.exe +0 -0
  16. data/vendor/local/bin/g-ir-inspect.exe +0 -0
  17. data/vendor/local/bin/libgirepository-1.0-1.dll +0 -0
  18. data/vendor/local/lib/girepository-1.0/GIRepository-2.0.typelib +0 -0
  19. data/vendor/local/lib/girepository-1.0/GLib-2.0.typelib +0 -0
  20. data/vendor/local/lib/girepository-1.0/Gio-2.0.typelib +0 -0
  21. data/vendor/local/lib/gobject-introspection/giscanner/__init__.pyc +0 -0
  22. data/vendor/local/lib/gobject-introspection/giscanner/__init__.pyo +0 -0
  23. data/vendor/local/lib/gobject-introspection/giscanner/annotationmain.pyc +0 -0
  24. data/vendor/local/lib/gobject-introspection/giscanner/annotationmain.pyo +0 -0
  25. data/vendor/local/lib/gobject-introspection/giscanner/annotationparser.pyc +0 -0
  26. data/vendor/local/lib/gobject-introspection/giscanner/annotationparser.pyo +0 -0
  27. data/vendor/local/lib/gobject-introspection/giscanner/ast.py +2 -1
  28. data/vendor/local/lib/gobject-introspection/giscanner/ast.pyc +0 -0
  29. data/vendor/local/lib/gobject-introspection/giscanner/ast.pyo +0 -0
  30. data/vendor/local/lib/gobject-introspection/giscanner/cachestore.pyc +0 -0
  31. data/vendor/local/lib/gobject-introspection/giscanner/cachestore.pyo +0 -0
  32. data/vendor/local/lib/gobject-introspection/giscanner/ccompiler.pyc +0 -0
  33. data/vendor/local/lib/gobject-introspection/giscanner/ccompiler.pyo +0 -0
  34. data/vendor/local/lib/gobject-introspection/giscanner/codegen.pyc +0 -0
  35. data/vendor/local/lib/gobject-introspection/giscanner/codegen.pyo +0 -0
  36. data/vendor/local/lib/gobject-introspection/giscanner/collections/__init__.pyc +0 -0
  37. data/vendor/local/lib/gobject-introspection/giscanner/collections/__init__.pyo +0 -0
  38. data/vendor/local/lib/gobject-introspection/giscanner/collections/counter.pyc +0 -0
  39. data/vendor/local/lib/gobject-introspection/giscanner/collections/counter.pyo +0 -0
  40. data/vendor/local/lib/gobject-introspection/giscanner/collections/ordereddict.pyc +0 -0
  41. data/vendor/local/lib/gobject-introspection/giscanner/collections/ordereddict.pyo +0 -0
  42. data/vendor/local/lib/gobject-introspection/giscanner/docmain.pyc +0 -0
  43. data/vendor/local/lib/gobject-introspection/giscanner/docmain.pyo +0 -0
  44. data/vendor/local/lib/gobject-introspection/giscanner/docwriter.pyc +0 -0
  45. data/vendor/local/lib/gobject-introspection/giscanner/docwriter.pyo +0 -0
  46. data/vendor/local/lib/gobject-introspection/giscanner/dumper.pyc +0 -0
  47. data/vendor/local/lib/gobject-introspection/giscanner/dumper.pyo +0 -0
  48. data/vendor/local/lib/gobject-introspection/giscanner/gdumpparser.pyc +0 -0
  49. data/vendor/local/lib/gobject-introspection/giscanner/gdumpparser.pyo +0 -0
  50. data/vendor/local/lib/gobject-introspection/giscanner/girparser.pyc +0 -0
  51. data/vendor/local/lib/gobject-introspection/giscanner/girparser.pyo +0 -0
  52. data/vendor/local/lib/gobject-introspection/giscanner/girwriter.pyc +0 -0
  53. data/vendor/local/lib/gobject-introspection/giscanner/girwriter.pyo +0 -0
  54. data/vendor/local/lib/gobject-introspection/giscanner/introspectablepass.pyc +0 -0
  55. data/vendor/local/lib/gobject-introspection/giscanner/introspectablepass.pyo +0 -0
  56. data/vendor/local/lib/gobject-introspection/giscanner/libtoolimporter.pyc +0 -0
  57. data/vendor/local/lib/gobject-introspection/giscanner/libtoolimporter.pyo +0 -0
  58. data/vendor/local/lib/gobject-introspection/giscanner/maintransformer.pyc +0 -0
  59. data/vendor/local/lib/gobject-introspection/giscanner/maintransformer.pyo +0 -0
  60. data/vendor/local/lib/gobject-introspection/giscanner/message.pyc +0 -0
  61. data/vendor/local/lib/gobject-introspection/giscanner/message.pyo +0 -0
  62. data/vendor/local/lib/gobject-introspection/giscanner/msvccompiler.pyc +0 -0
  63. data/vendor/local/lib/gobject-introspection/giscanner/msvccompiler.pyo +0 -0
  64. data/vendor/local/lib/gobject-introspection/giscanner/scannermain.pyc +0 -0
  65. data/vendor/local/lib/gobject-introspection/giscanner/scannermain.pyo +0 -0
  66. data/vendor/local/lib/gobject-introspection/giscanner/sectionparser.pyc +0 -0
  67. data/vendor/local/lib/gobject-introspection/giscanner/sectionparser.pyo +0 -0
  68. data/vendor/local/lib/gobject-introspection/giscanner/shlibs.pyc +0 -0
  69. data/vendor/local/lib/gobject-introspection/giscanner/shlibs.pyo +0 -0
  70. data/vendor/local/lib/gobject-introspection/giscanner/sourcescanner.pyc +0 -0
  71. data/vendor/local/lib/gobject-introspection/giscanner/sourcescanner.pyo +0 -0
  72. data/vendor/local/lib/gobject-introspection/giscanner/testcodegen.pyc +0 -0
  73. data/vendor/local/lib/gobject-introspection/giscanner/testcodegen.pyo +0 -0
  74. data/vendor/local/lib/gobject-introspection/giscanner/transformer.pyc +0 -0
  75. data/vendor/local/lib/gobject-introspection/giscanner/transformer.pyo +0 -0
  76. data/vendor/local/lib/gobject-introspection/giscanner/utils.pyc +0 -0
  77. data/vendor/local/lib/gobject-introspection/giscanner/utils.pyo +0 -0
  78. data/vendor/local/lib/gobject-introspection/giscanner/xmlwriter.pyc +0 -0
  79. data/vendor/local/lib/gobject-introspection/giscanner/xmlwriter.pyo +0 -0
  80. data/vendor/local/lib/libgirepository-1.0.a +0 -0
  81. data/vendor/local/lib/libgirepository-1.0.dll.a +0 -0
  82. data/vendor/local/lib/libgirepository-1.0.la +2 -2
  83. data/vendor/local/lib/pkgconfig/gobject-introspection-1.0.pc +1 -1
  84. data/vendor/local/lib/pkgconfig/gobject-introspection-no-export-1.0.pc +1 -1
  85. data/vendor/local/share/gir-1.0/GIRepository-2.0.gir +10 -4
  86. data/vendor/local/share/gir-1.0/GLib-2.0.gir +939 -162
  87. data/vendor/local/share/gir-1.0/GObject-2.0.gir +389 -565
  88. data/vendor/local/share/gir-1.0/Gio-2.0.gir +594 -173
  89. data/vendor/local/share/gobject-introspection-1.0/gdump.c +8 -1
  90. data/vendor/local/share/gobject-introspection-1.0/tests/regress.h +13 -0
  91. metadata +7 -5
@@ -59,6 +59,21 @@ gi_function_info_get_type(void)
59
59
  return type;
60
60
  }
61
61
 
62
+ static VALUE
63
+ rg_set_unlock_gvl(VALUE self, VALUE rb_boolean)
64
+ {
65
+ return rb_iv_set(self, "unlock_gvl", rb_boolean);
66
+ }
67
+
68
+ static VALUE
69
+ rg_unlock_gvl_p(VALUE self)
70
+ {
71
+ if (!RVAL2CBOOL(rb_ivar_defined(self, rb_intern("unlock_gvl")))) {
72
+ rb_iv_set(self, "unlock_gvl", Qfalse);
73
+ }
74
+ return rb_iv_get(self, "unlock_gvl");
75
+ }
76
+
62
77
  static VALUE
63
78
  rg_symbol(VALUE self)
64
79
  {
@@ -665,10 +680,12 @@ out_argument_to_raw_data_interface(GICallableInfo *callable_info,
665
680
  GIArgument *argument,
666
681
  gpointer result,
667
682
  GITypeInfo *type_info,
668
- G_GNUC_UNUSED GITransfer transfer /* TODO */)
683
+ G_GNUC_UNUSED GITransfer transfer /* TODO */,
684
+ gboolean is_return_value)
669
685
  {
670
686
  GIBaseInfo *interface_info;
671
687
  GIInfoType interface_type;
688
+ GIFFIReturnValue *ffi_return_value = result;
672
689
 
673
690
  interface_info = g_type_info_get_interface(type_info);
674
691
  interface_type = g_base_info_get_type(interface_info);
@@ -687,7 +704,11 @@ out_argument_to_raw_data_interface(GICallableInfo *callable_info,
687
704
  g_base_info_get_name(interface_info));
688
705
  break;
689
706
  case GI_INFO_TYPE_ENUM:
690
- *((gint *)result) = argument->v_int;
707
+ if (is_return_value) {
708
+ ffi_return_value->v_ulong = argument->v_int;
709
+ } else {
710
+ *((gint *)result) = argument->v_int;
711
+ }
691
712
  break;
692
713
  case GI_INFO_TYPE_FLAGS:
693
714
  case GI_INFO_TYPE_OBJECT:
@@ -725,15 +746,50 @@ out_argument_to_raw_data_interface(GICallableInfo *callable_info,
725
746
  g_base_info_unref(interface_info);
726
747
  }
727
748
 
749
+ /*
750
+ We need to cast from different type for return value. (We don't
751
+ need it for out arguments.) Because of libffi specification:
752
+
753
+ https://github.com/libffi/libffi/blob/master/doc/libffi.texi#L190
754
+
755
+ @var{rvalue} is a pointer to a chunk of memory that will hold the
756
+ result of the function call. This must be large enough to hold the
757
+ result, no smaller than the system register size (generally 32 or 64
758
+ bits), and must be suitably aligned; it is the caller's responsibility
759
+ to ensure this. If @var{cif} declares that the function returns
760
+ @code{void} (using @code{ffi_type_void}), then @var{rvalue} is
761
+ ignored.
762
+
763
+ https://github.com/libffi/libffi/blob/master/doc/libffi.texi#L198
764
+
765
+ In most situations, @samp{libffi} will handle promotion according to
766
+ the ABI. However, for historical reasons, there is a special case
767
+ with return values that must be handled by your code. In particular,
768
+ for integral (not @code{struct}) types that are narrower than the
769
+ system register size, the return value will be widened by
770
+ @samp{libffi}. @samp{libffi} provides a type, @code{ffi_arg}, that
771
+ can be used as the return type. For example, if the CIF was defined
772
+ with a return type of @code{char}, @samp{libffi} will try to store a
773
+ full @code{ffi_arg} into the return value.
774
+
775
+ See also:
776
+ * https://github.com/ruby-gnome2/ruby-gnome2/issues/758#issuecomment-243149237
777
+ * https://github.com/libffi/libffi/pull/216
778
+
779
+ This ffi_return_value case implementation is based on
780
+ gi_type_info_extract_ffi_return_value().
781
+ */
728
782
  static void
729
783
  out_argument_to_raw_data(GICallableInfo *callable_info,
730
784
  VALUE rb_result,
731
785
  gpointer result,
732
786
  GITypeInfo *type_info,
733
- GITransfer transfer)
787
+ GITransfer transfer,
788
+ gboolean is_return_value)
734
789
  {
735
790
  GIArgument argument;
736
791
  GITypeTag type_tag;
792
+ GIFFIReturnValue *ffi_return_value = result;
737
793
 
738
794
  rb_gi_value_argument_from_ruby(&argument,
739
795
  type_info,
@@ -745,25 +801,53 @@ out_argument_to_raw_data(GICallableInfo *callable_info,
745
801
  g_assert_not_reached();
746
802
  break;
747
803
  case GI_TYPE_TAG_BOOLEAN:
748
- *((gboolean *)result) = argument.v_boolean;
804
+ if (is_return_value) {
805
+ ffi_return_value->v_ulong = argument.v_boolean;
806
+ } else {
807
+ *((gboolean *)result) = argument.v_boolean;
808
+ }
749
809
  break;
750
810
  case GI_TYPE_TAG_INT8:
751
- *((gint8 *)result) = argument.v_int8;
811
+ if (is_return_value) {
812
+ ffi_return_value->v_long = argument.v_int8;
813
+ } else {
814
+ *((gint8 *)result) = argument.v_int8;
815
+ }
752
816
  break;
753
817
  case GI_TYPE_TAG_UINT8:
754
- *((guint8 *)result) = argument.v_uint8;
818
+ if (is_return_value) {
819
+ ffi_return_value->v_ulong = argument.v_uint8;
820
+ } else {
821
+ *((guint8 *)result) = argument.v_uint8;
822
+ }
755
823
  break;
756
824
  case GI_TYPE_TAG_INT16:
757
- *((gint16 *)result) = argument.v_int16;
825
+ if (is_return_value) {
826
+ ffi_return_value->v_long = argument.v_int16;
827
+ } else {
828
+ *((gint16 *)result) = argument.v_int16;
829
+ }
758
830
  break;
759
831
  case GI_TYPE_TAG_UINT16:
760
- *((guint16 *)result) = argument.v_uint16;
832
+ if (is_return_value) {
833
+ ffi_return_value->v_ulong = argument.v_uint16;
834
+ } else {
835
+ *((guint16 *)result) = argument.v_uint16;
836
+ }
761
837
  break;
762
838
  case GI_TYPE_TAG_INT32:
763
- *((gint32 *)result) = argument.v_int32;
839
+ if (is_return_value) {
840
+ ffi_return_value->v_long = argument.v_int32;
841
+ } else {
842
+ *((gint32 *)result) = argument.v_int32;
843
+ }
764
844
  break;
765
845
  case GI_TYPE_TAG_UINT32:
766
- *((guint32 *)result) = argument.v_uint32;
846
+ if (is_return_value) {
847
+ ffi_return_value->v_ulong = argument.v_uint32;
848
+ } else {
849
+ *((guint32 *)result) = argument.v_uint32;
850
+ }
767
851
  break;
768
852
  case GI_TYPE_TAG_INT64:
769
853
  *((gint64 *)result) = argument.v_int64;
@@ -778,32 +862,57 @@ out_argument_to_raw_data(GICallableInfo *callable_info,
778
862
  *((gdouble *)result) = argument.v_double;
779
863
  break;
780
864
  case GI_TYPE_TAG_GTYPE:
781
- *((gsize *)result) = argument.v_size;
865
+ if (is_return_value) {
866
+ ffi_return_value->v_ulong = argument.v_size;
867
+ } else {
868
+ *((gsize *)result) = argument.v_size;
869
+ }
782
870
  break;
783
871
  case GI_TYPE_TAG_UTF8:
784
872
  case GI_TYPE_TAG_FILENAME:
785
- *((gchar **)result) = argument.v_string;
873
+ if (is_return_value) {
874
+ ffi_return_value->v_ulong = (gulong)(argument.v_string);
875
+ } else {
876
+ *((gchar **)result) = argument.v_string;
877
+ }
786
878
  break;
787
879
  case GI_TYPE_TAG_ARRAY:
788
- *((gpointer *)result) = argument.v_pointer;
880
+ if (is_return_value) {
881
+ ffi_return_value->v_ulong = (gulong)(argument.v_pointer);
882
+ } else {
883
+ *((gpointer *)result) = argument.v_pointer;
884
+ }
789
885
  break;
790
886
  case GI_TYPE_TAG_INTERFACE:
791
887
  out_argument_to_raw_data_interface(callable_info,
792
888
  &argument,
793
889
  result,
794
890
  type_info,
795
- transfer);
891
+ transfer,
892
+ is_return_value);
796
893
  break;
797
894
  case GI_TYPE_TAG_GLIST:
798
895
  case GI_TYPE_TAG_GSLIST:
799
896
  case GI_TYPE_TAG_GHASH:
800
- *((gpointer *)result) = argument.v_pointer;
897
+ if (is_return_value) {
898
+ ffi_return_value->v_ulong = (gulong)(argument.v_pointer);
899
+ } else {
900
+ *((gpointer *)result) = argument.v_pointer;
901
+ }
801
902
  break;
802
903
  case GI_TYPE_TAG_ERROR:
803
- *((GError **)result) = argument.v_pointer;
904
+ if (is_return_value) {
905
+ ffi_return_value->v_ulong = (gulong)(argument.v_pointer);
906
+ } else {
907
+ *((GError **)result) = argument.v_pointer;
908
+ }
804
909
  break;
805
910
  case GI_TYPE_TAG_UNICHAR:
806
- *((gunichar *)result) = argument.v_uint32;
911
+ if (is_return_value) {
912
+ ffi_return_value->v_ulong = argument.v_uint32;
913
+ } else {
914
+ *((gunichar *)result) = argument.v_uint32;
915
+ }
807
916
  break;
808
917
  default:
809
918
  g_assert_not_reached();
@@ -834,13 +943,15 @@ out_arguments_to_raw_data(GICallableInfo *callable_info,
834
943
  rb_return_value,
835
944
  result,
836
945
  return_type_info,
837
- transfer);
946
+ transfer,
947
+ TRUE);
838
948
  } else {
839
949
  out_argument_to_raw_data(callable_info,
840
950
  RARRAY_AREF(rb_results, i_rb_result),
841
951
  result,
842
952
  return_type_info,
843
- transfer);
953
+ transfer,
954
+ TRUE);
844
955
  i_rb_result++;
845
956
  }
846
957
  }
@@ -866,7 +977,8 @@ out_arguments_to_raw_data(GICallableInfo *callable_info,
866
977
  RARRAY_AREF(rb_results, i_rb_result),
867
978
  argument->v_pointer,
868
979
  type_info,
869
- transfer);
980
+ transfer,
981
+ FALSE);
870
982
  i_rb_result++;
871
983
  g_base_info_unref(type_info);
872
984
  }
@@ -1194,7 +1306,7 @@ arguments_free(VALUE rb_arguments,
1194
1306
  GIArgument *argument;
1195
1307
 
1196
1308
  rb_arg_index = metadata->rb_arg_index;
1197
- if (rb_arg_index > 0) {
1309
+ if (RARRAY_LEN(rb_arguments) > rb_arg_index) {
1198
1310
  rb_argument = RARRAY_PTR(rb_arguments)[rb_arg_index];
1199
1311
  }
1200
1312
  argument = &(g_array_index(in_args, GIArgument, in_arg_index));
@@ -1267,8 +1379,12 @@ gobject_based_p(GIBaseInfo *info)
1267
1379
  }
1268
1380
 
1269
1381
  VALUE
1270
- rb_gi_function_info_invoke_raw(GIFunctionInfo *info, VALUE rb_options,
1271
- GIArgument *return_value, VALUE *rb_return_value)
1382
+ rb_gi_function_info_invoke_raw(GIFunctionInfo *info,
1383
+ VALUE rb_info,
1384
+ VALUE rb_receiver,
1385
+ VALUE rb_arguments,
1386
+ GIArgument *return_value,
1387
+ VALUE *rb_return_value)
1272
1388
  {
1273
1389
  GICallableInfo *callable_info;
1274
1390
  GIArgument receiver;
@@ -1278,26 +1394,9 @@ rb_gi_function_info_invoke_raw(GIFunctionInfo *info, VALUE rb_options,
1278
1394
  gboolean succeeded;
1279
1395
  GError *error = NULL;
1280
1396
  gboolean unlock_gvl = FALSE;
1281
- VALUE rb_receiver, rb_arguments, rb_unlock_gvl;
1282
1397
  gboolean rb_receiver_is_class = FALSE;
1283
1398
 
1284
- if (RB_TYPE_P(rb_options, RUBY_T_ARRAY)) {
1285
- rb_receiver = Qnil;
1286
- rb_arguments = rb_options;
1287
- rb_unlock_gvl = Qnil;
1288
- } else if (NIL_P(rb_options)) {
1289
- rb_receiver = Qnil;
1290
- rb_arguments = rb_ary_new();
1291
- rb_unlock_gvl = Qnil;
1292
- } else {
1293
- rb_options = rbg_check_hash_type(rb_options);
1294
- rbg_scan_options(rb_options,
1295
- "receiver", &rb_receiver,
1296
- "arguments", &rb_arguments,
1297
- "unlock_gvl", &rb_unlock_gvl,
1298
- NULL);
1299
- }
1300
-
1399
+ unlock_gvl = RVAL2CBOOL(rb_funcall(rb_info, rb_intern("unlock_gvl?"), 0));
1301
1400
  if (NIL_P(rb_receiver)) {
1302
1401
  receiver.v_pointer = NULL;
1303
1402
  } else {
@@ -1314,9 +1413,6 @@ rb_gi_function_info_invoke_raw(GIFunctionInfo *info, VALUE rb_options,
1314
1413
  }
1315
1414
  }
1316
1415
  rb_arguments = rbg_to_array(rb_arguments);
1317
- if (!NIL_P(rb_unlock_gvl) && RVAL2CBOOL(rb_unlock_gvl)) {
1318
- unlock_gvl = TRUE;
1319
- }
1320
1416
 
1321
1417
  callable_info = (GICallableInfo *)info;
1322
1418
  arguments_init(&in_args, &out_args, &args_metadata);
@@ -1382,7 +1478,7 @@ rb_gi_function_info_invoke_raw(GIFunctionInfo *info, VALUE rb_options,
1382
1478
  }
1383
1479
 
1384
1480
  static VALUE
1385
- rg_invoke(VALUE self, VALUE rb_options)
1481
+ rg_invoke(VALUE self, VALUE rb_arguments)
1386
1482
  {
1387
1483
  GIFunctionInfo *info;
1388
1484
  VALUE rb_out_args;
@@ -1391,7 +1487,9 @@ rg_invoke(VALUE self, VALUE rb_options)
1391
1487
  info = SELF(self);
1392
1488
  /* TODO: use rb_protect() */
1393
1489
  rb_out_args = rb_gi_function_info_invoke_raw(info,
1394
- rb_options,
1490
+ self,
1491
+ Qnil,
1492
+ rb_arguments,
1395
1493
  NULL,
1396
1494
  &rb_return_value);
1397
1495
 
@@ -1426,6 +1524,9 @@ rb_gi_function_info_init(VALUE rb_mGI, VALUE rb_cGICallableInfo)
1426
1524
  callback_finders = g_ptr_array_new();
1427
1525
  rb_gi_callback_register_finder(source_func_callback_finder);
1428
1526
 
1527
+ RG_DEF_METHOD(set_unlock_gvl, 1);
1528
+ RG_DEF_METHOD_P(unlock_gvl, 0);
1529
+
1429
1530
  RG_DEF_METHOD(symbol, 0);
1430
1531
  RG_DEF_METHOD(flags, 0);
1431
1532
  RG_DEF_METHOD(property, 0);
@@ -36,7 +36,7 @@ gi_method_info_get_type(void)
36
36
  }
37
37
 
38
38
  static VALUE
39
- rg_invoke(VALUE self, VALUE rb_options)
39
+ rg_invoke(VALUE self, VALUE rb_receiver, VALUE rb_arguments)
40
40
  {
41
41
  GIFunctionInfo *info;
42
42
  VALUE rb_out_args;
@@ -46,7 +46,9 @@ rg_invoke(VALUE self, VALUE rb_options)
46
46
 
47
47
  /* TODO: use rb_protect */
48
48
  rb_out_args = rb_gi_function_info_invoke_raw(info,
49
- rb_options,
49
+ self,
50
+ rb_receiver,
51
+ rb_arguments,
50
52
  NULL,
51
53
  &rb_return_value);
52
54
 
@@ -76,5 +78,5 @@ rb_gi_method_info_init(VALUE rb_mGI, VALUE rb_cGIFunctionInfo)
76
78
  G_DEF_CLASS_WITH_PARENT(GI_TYPE_METHOD_INFO, "MethodInfo", rb_mGI,
77
79
  rb_cGIFunctionInfo);
78
80
 
79
- RG_DEF_METHOD(invoke, 1);
81
+ RG_DEF_METHOD(invoke, 2);
80
82
  }
@@ -93,7 +93,9 @@ void rb_gi_repository_init (VALUE rb_mGI);
93
93
  void rb_gi_loader_init (VALUE rb_mGI);
94
94
 
95
95
  VALUE rb_gi_function_info_invoke_raw (GIFunctionInfo *info,
96
- VALUE rb_options,
96
+ VALUE rb_info,
97
+ VALUE rb_receiver,
98
+ VALUE rb_arguments,
97
99
  GIArgument *return_value,
98
100
  VALUE *rb_return_value);
99
101
 
Binary file
Binary file
data/lib/gi.rb ADDED
@@ -0,0 +1,19 @@
1
+ # Copyright (C) 2016 Ruby-GNOME2 Project Team
2
+ #
3
+ # This library is free software; you can redistribute it and/or
4
+ # modify it under the terms of the GNU Lesser General Public
5
+ # License as published by the Free Software Foundation; either
6
+ # version 2.1 of the License, or (at your option) any later version.
7
+ #
8
+ # This library is distributed in the hope that it will be useful,
9
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
10
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
+ # Lesser General Public License for more details.
12
+ #
13
+ # You should have received a copy of the GNU Lesser General Public
14
+ # License along with this library; if not, write to the Free Software
15
+ # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
+
17
+ require "gobject-introspection"
18
+
19
+ GI = GObjectIntrospection
@@ -47,6 +47,16 @@ GObjectIntrospection.prepend_typelib_path(vendor_girepository_dir)
47
47
 
48
48
  module GObjectIntrospection
49
49
  LOG_DOMAIN = "GObjectIntrospection"
50
+
51
+ class << self
52
+ def load(namespace, options={})
53
+ base_module = Module.new
54
+ loader = Loader.new(base_module)
55
+ loader.version = options[:version]
56
+ loader.load(namespace)
57
+ base_module
58
+ end
59
+ end
50
60
  end
51
61
  GLib::Log.set_log_domain(GObjectIntrospection::LOG_DOMAIN)
52
62
 
@@ -41,11 +41,7 @@ module GObjectIntrospection
41
41
  end
42
42
 
43
43
  def require_callback?
44
- args.any? do |arg|
45
- arg.direction == Direction::IN and
46
- arg.scope != ScopeType::INVALID and
47
- !arg.may_be_null?
48
- end
44
+ (@require_callback ||= compute_require_callback) == :required
49
45
  end
50
46
 
51
47
  def out_args
@@ -63,6 +59,12 @@ module GObjectIntrospection
63
59
  out_args.size
64
60
  end
65
61
 
62
+ def have_return_value?
63
+ return true if return_type.tag != TypeTag::VOID
64
+ return true if return_type.pointer?
65
+ not n_out_args.zero?
66
+ end
67
+
66
68
  private
67
69
  def compute_in_args
68
70
  array_length_indexes = []
@@ -103,5 +105,17 @@ module GObjectIntrospection
103
105
  end
104
106
  end
105
107
  end
108
+
109
+ def compute_require_callback
110
+ args.each do |arg|
111
+ if arg.direction == Direction::IN and
112
+ arg.scope != ScopeType::INVALID and
113
+ !arg.may_be_null?
114
+ return :required
115
+ end
116
+ end
117
+
118
+ :not_required
119
+ end
106
120
  end
107
121
  end