gobject-introspection 3.0.7-x86-mingw32 → 3.0.8-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 (126) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +2 -2
  3. data/ext/gobject-introspection/extconf.rb +1 -0
  4. data/ext/gobject-introspection/rb-gi-argument.c +123 -26
  5. data/ext/gobject-introspection/rb-gi-function-info.c +558 -19
  6. data/ext/gobject-introspection/rb-gi-repository.c +9 -0
  7. data/ext/gobject-introspection/rb-gobject-introspection.h +3 -0
  8. data/lib/2.2/gobject_introspection.so +0 -0
  9. data/lib/2.3/gobject_introspection.so +0 -0
  10. data/lib/gobject-introspection/loader.rb +1 -1
  11. data/vendor/local/bin/g-ir-compiler.exe +0 -0
  12. data/vendor/local/bin/g-ir-generate.exe +0 -0
  13. data/vendor/local/bin/libgirepository-1.0-1.dll +0 -0
  14. data/vendor/local/include/gobject-introspection-1.0/gistructinfo.h +4 -0
  15. data/vendor/local/lib/girepository-1.0/GIRepository-2.0.typelib +0 -0
  16. data/vendor/local/lib/girepository-1.0/GLib-2.0.typelib +0 -0
  17. data/vendor/local/lib/girepository-1.0/GModule-2.0.typelib +0 -0
  18. data/vendor/local/lib/girepository-1.0/GObject-2.0.typelib +0 -0
  19. data/vendor/local/lib/girepository-1.0/Gio-2.0.typelib +0 -0
  20. data/vendor/local/lib/gobject-introspection/giscanner/__init__.py +1 -1
  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.py +39 -11
  24. data/vendor/local/lib/gobject-introspection/giscanner/annotationmain.pyc +0 -0
  25. data/vendor/local/lib/gobject-introspection/giscanner/annotationmain.pyo +0 -0
  26. data/vendor/local/lib/gobject-introspection/giscanner/annotationparser.py +187 -164
  27. data/vendor/local/lib/gobject-introspection/giscanner/annotationparser.pyc +0 -0
  28. data/vendor/local/lib/gobject-introspection/giscanner/annotationparser.pyo +0 -0
  29. data/vendor/local/lib/gobject-introspection/giscanner/ast.py +191 -58
  30. data/vendor/local/lib/gobject-introspection/giscanner/ast.pyc +0 -0
  31. data/vendor/local/lib/gobject-introspection/giscanner/ast.pyo +0 -0
  32. data/vendor/local/lib/gobject-introspection/giscanner/cachestore.py +42 -54
  33. data/vendor/local/lib/gobject-introspection/giscanner/cachestore.pyc +0 -0
  34. data/vendor/local/lib/gobject-introspection/giscanner/cachestore.pyo +0 -0
  35. data/vendor/local/lib/gobject-introspection/giscanner/ccompiler.py +272 -82
  36. data/vendor/local/lib/gobject-introspection/giscanner/ccompiler.pyc +0 -0
  37. data/vendor/local/lib/gobject-introspection/giscanner/ccompiler.pyo +0 -0
  38. data/vendor/local/lib/gobject-introspection/giscanner/codegen.py +18 -11
  39. data/vendor/local/lib/gobject-introspection/giscanner/codegen.pyc +0 -0
  40. data/vendor/local/lib/gobject-introspection/giscanner/codegen.pyo +0 -0
  41. data/vendor/local/lib/gobject-introspection/giscanner/collections/__init__.py +4 -0
  42. data/vendor/local/lib/gobject-introspection/giscanner/collections/__init__.pyc +0 -0
  43. data/vendor/local/lib/gobject-introspection/giscanner/collections/__init__.pyo +0 -0
  44. data/vendor/local/lib/gobject-introspection/giscanner/collections/counter.pyc +0 -0
  45. data/vendor/local/lib/gobject-introspection/giscanner/collections/counter.pyo +0 -0
  46. data/vendor/local/lib/gobject-introspection/giscanner/collections/ordereddict.py +25 -13
  47. data/vendor/local/lib/gobject-introspection/giscanner/collections/ordereddict.pyc +0 -0
  48. data/vendor/local/lib/gobject-introspection/giscanner/collections/ordereddict.pyo +0 -0
  49. data/vendor/local/lib/gobject-introspection/giscanner/docmain.py +21 -19
  50. data/vendor/local/lib/gobject-introspection/giscanner/docmain.pyc +0 -0
  51. data/vendor/local/lib/gobject-introspection/giscanner/docmain.pyo +0 -0
  52. data/vendor/local/lib/gobject-introspection/giscanner/docwriter.py +19 -16
  53. data/vendor/local/lib/gobject-introspection/giscanner/docwriter.pyc +0 -0
  54. data/vendor/local/lib/gobject-introspection/giscanner/docwriter.pyo +0 -0
  55. data/vendor/local/lib/gobject-introspection/giscanner/dumper.py +148 -158
  56. data/vendor/local/lib/gobject-introspection/giscanner/dumper.pyc +0 -0
  57. data/vendor/local/lib/gobject-introspection/giscanner/dumper.pyo +0 -0
  58. data/vendor/local/lib/gobject-introspection/giscanner/gdumpparser.py +31 -21
  59. data/vendor/local/lib/gobject-introspection/giscanner/gdumpparser.pyc +0 -0
  60. data/vendor/local/lib/gobject-introspection/giscanner/gdumpparser.pyo +0 -0
  61. data/vendor/local/lib/gobject-introspection/giscanner/girparser.py +13 -5
  62. data/vendor/local/lib/gobject-introspection/giscanner/girparser.pyc +0 -0
  63. data/vendor/local/lib/gobject-introspection/giscanner/girparser.pyo +0 -0
  64. data/vendor/local/lib/gobject-introspection/giscanner/girwriter.py +12 -13
  65. data/vendor/local/lib/gobject-introspection/giscanner/girwriter.pyc +0 -0
  66. data/vendor/local/lib/gobject-introspection/giscanner/girwriter.pyo +0 -0
  67. data/vendor/local/lib/gobject-introspection/giscanner/introspectablepass.py +5 -1
  68. data/vendor/local/lib/gobject-introspection/giscanner/introspectablepass.pyc +0 -0
  69. data/vendor/local/lib/gobject-introspection/giscanner/introspectablepass.pyo +0 -0
  70. data/vendor/local/lib/gobject-introspection/giscanner/libtoolimporter.py +11 -9
  71. data/vendor/local/lib/gobject-introspection/giscanner/libtoolimporter.pyc +0 -0
  72. data/vendor/local/lib/gobject-introspection/giscanner/libtoolimporter.pyo +0 -0
  73. data/vendor/local/lib/gobject-introspection/giscanner/maintransformer.py +150 -45
  74. data/vendor/local/lib/gobject-introspection/giscanner/maintransformer.pyc +0 -0
  75. data/vendor/local/lib/gobject-introspection/giscanner/maintransformer.pyo +0 -0
  76. data/vendor/local/lib/gobject-introspection/giscanner/message.py +56 -19
  77. data/vendor/local/lib/gobject-introspection/giscanner/message.pyc +0 -0
  78. data/vendor/local/lib/gobject-introspection/giscanner/message.pyo +0 -0
  79. data/vendor/local/lib/gobject-introspection/giscanner/msvccompiler.py +101 -0
  80. data/vendor/local/lib/gobject-introspection/giscanner/msvccompiler.pyc +0 -0
  81. data/vendor/local/lib/gobject-introspection/giscanner/msvccompiler.pyo +0 -0
  82. data/vendor/local/lib/gobject-introspection/giscanner/scannermain.py +41 -22
  83. data/vendor/local/lib/gobject-introspection/giscanner/scannermain.pyc +0 -0
  84. data/vendor/local/lib/gobject-introspection/giscanner/scannermain.pyo +0 -0
  85. data/vendor/local/lib/gobject-introspection/giscanner/sectionparser.py +6 -1
  86. data/vendor/local/lib/gobject-introspection/giscanner/sectionparser.pyc +0 -0
  87. data/vendor/local/lib/gobject-introspection/giscanner/sectionparser.pyo +0 -0
  88. data/vendor/local/lib/gobject-introspection/giscanner/shlibs.py +8 -2
  89. data/vendor/local/lib/gobject-introspection/giscanner/shlibs.pyc +0 -0
  90. data/vendor/local/lib/gobject-introspection/giscanner/shlibs.pyo +0 -0
  91. data/vendor/local/lib/gobject-introspection/giscanner/sourcescanner.py +42 -56
  92. data/vendor/local/lib/gobject-introspection/giscanner/sourcescanner.pyc +0 -0
  93. data/vendor/local/lib/gobject-introspection/giscanner/sourcescanner.pyo +0 -0
  94. data/vendor/local/lib/gobject-introspection/giscanner/testcodegen.py +19 -5
  95. data/vendor/local/lib/gobject-introspection/giscanner/testcodegen.pyc +0 -0
  96. data/vendor/local/lib/gobject-introspection/giscanner/testcodegen.pyo +0 -0
  97. data/vendor/local/lib/gobject-introspection/giscanner/transformer.py +73 -37
  98. data/vendor/local/lib/gobject-introspection/giscanner/transformer.pyc +0 -0
  99. data/vendor/local/lib/gobject-introspection/giscanner/transformer.pyo +0 -0
  100. data/vendor/local/lib/gobject-introspection/giscanner/utils.py +92 -14
  101. data/vendor/local/lib/gobject-introspection/giscanner/utils.pyc +0 -0
  102. data/vendor/local/lib/gobject-introspection/giscanner/utils.pyo +0 -0
  103. data/vendor/local/lib/gobject-introspection/giscanner/xmlwriter.py +30 -11
  104. data/vendor/local/lib/gobject-introspection/giscanner/xmlwriter.pyc +0 -0
  105. data/vendor/local/lib/gobject-introspection/giscanner/xmlwriter.pyo +0 -0
  106. data/vendor/local/lib/libgirepository-1.0.a +0 -0
  107. data/vendor/local/lib/libgirepository-1.0.dll.a +0 -0
  108. data/vendor/local/lib/libgirepository-1.0.la +1 -1
  109. data/vendor/local/lib/pkgconfig/gobject-introspection-1.0.pc +1 -1
  110. data/vendor/local/lib/pkgconfig/gobject-introspection-no-export-1.0.pc +1 -1
  111. data/vendor/local/share/gir-1.0/GIRepository-2.0.gir +57 -13
  112. data/vendor/local/share/gir-1.0/GLib-2.0.gir +2018 -894
  113. data/vendor/local/share/gir-1.0/GModule-2.0.gir +2 -1
  114. data/vendor/local/share/gir-1.0/GObject-2.0.gir +1107 -674
  115. data/vendor/local/share/gir-1.0/Gio-2.0.gir +5589 -1287
  116. data/vendor/local/share/gobject-introspection-1.0/Makefile.introspection +4 -2
  117. data/vendor/local/share/gobject-introspection-1.0/gdump.c +8 -0
  118. data/vendor/local/share/gobject-introspection-1.0/tests/everything.c +273 -323
  119. data/vendor/local/share/gobject-introspection-1.0/tests/everything.h +58 -38
  120. data/vendor/local/share/gobject-introspection-1.0/tests/gimarshallingtests.c +1 -1
  121. data/vendor/local/share/gobject-introspection-1.0/tests/regress.c +177 -23
  122. data/vendor/local/share/gobject-introspection-1.0/tests/regress.h +40 -0
  123. data/vendor/local/share/man/man1/g-ir-compiler.1 +7 -7
  124. metadata +9 -7
  125. data/lib/2.0/gobject_introspection.so +0 -0
  126. data/lib/2.1/gobject_introspection.so +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: e7eebac8f0c564f9f80421a865442b3dd9f206ab
4
- data.tar.gz: daddbde7e799310af06ae04f49bd723f104e27c0
3
+ metadata.gz: 87a2a6696bfb8359349560011842d8ceeb5fb2dc
4
+ data.tar.gz: 4bae718ad6d24f29c53c8cb29f0ea331529b459a
5
5
  SHA512:
6
- metadata.gz: ea60b578c6955ee6a6e6f7401ee6a2f361a16c16ebf6913424a0ddaae3f6b19c7b0cc18fe6e1af4390fcc8b782b9870270f846037d81bab8fd1c6662e21944b8
7
- data.tar.gz: b2044102afecbcbc78f2a41bacbf84016ba177b183806317fe0e10e0178a44fd144c41786ceeebc2c05a0f5b5a28a167fb5f7a5a5f7c7a7344644ee1d50e0666
6
+ metadata.gz: f67f6f0e6524acce4db762190a6a74a31ac9c42951dd025aab059626b4bff4f8affc60eab4b23daf92d8c483cad59e95ad440a02a1de8bf6be0273d81ddd1250
7
+ data.tar.gz: f0786e74f7906a734da66310f0710e0a0e675c5245848676026c7b55f54b2f90a61644565024c08ea66a8a87eb2b8cf839292508d4f31fdf54f807553cb05abe
data/Rakefile CHANGED
@@ -32,7 +32,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
32
32
  :name => "glib",
33
33
  :download_site => :gnome,
34
34
  :label => "GLib",
35
- :version => "2.44.1",
35
+ :version => "2.48.0",
36
36
  :compression_method => "xz",
37
37
  :windows => {
38
38
  :build => false,
@@ -47,7 +47,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
47
47
  :name => "gobject-introspection",
48
48
  :download_site => :gnome,
49
49
  :label => "gobject-introspection",
50
- :version => "1.44.0",
50
+ :version => "1.48.0",
51
51
  :compression_method => "xz",
52
52
  :windows => {
53
53
  :configure_args => [
@@ -57,6 +57,7 @@ end
57
57
  setup_windows(module_name, base_dir)
58
58
 
59
59
  unless required_pkg_config_package(package_id,
60
+ :altlinux => "gobject-introspection-devel",
60
61
  :debian => "libgirepository1.0-dev",
61
62
  :redhat => "gobject-introspection-devel",
62
63
  :homebrew => "gobject-introspection",
@@ -559,9 +559,9 @@ interface_variant_to_ruby(GVariant *variant)
559
559
  }
560
560
 
561
561
  static VALUE
562
- interface_to_ruby(GIArgument *argument,
563
- gboolean duplicate,
564
- GITypeInfo *type_info)
562
+ rb_gi_argument_to_ruby_interface(GIArgument *argument,
563
+ gboolean duplicate,
564
+ GITypeInfo *type_info)
565
565
  {
566
566
  VALUE rb_interface;
567
567
  GIBaseInfo *interface_info;
@@ -1098,7 +1098,9 @@ rb_gi_argument_to_ruby(GIArgument *argument,
1098
1098
  args_metadata);
1099
1099
  break;
1100
1100
  case GI_TYPE_TAG_INTERFACE:
1101
- rb_argument = interface_to_ruby(argument, duplicate, type_info);
1101
+ rb_argument = rb_gi_argument_to_ruby_interface(argument,
1102
+ duplicate,
1103
+ type_info);
1102
1104
  break;
1103
1105
  case GI_TYPE_TAG_GLIST:
1104
1106
  rb_argument = rb_gi_argument_to_ruby_glist(argument, type_info);
@@ -1298,16 +1300,20 @@ rb_gi_out_argument_init_array(GIArgument *argument, GIArgInfo *arg_info,
1298
1300
  }
1299
1301
 
1300
1302
  static void
1301
- rb_gi_out_argument_init_interface(GIArgument *argument, GIArgInfo *arg_info,
1303
+ rb_gi_out_argument_init_interface(GIArgument *argument,
1304
+ G_GNUC_UNUSED GIArgInfo *arg_info,
1302
1305
  GITypeInfo *type_info)
1303
1306
  {
1304
1307
  GIBaseInfo *interface_info;
1305
1308
  GIInfoType interface_type;
1306
1309
 
1310
+ /* TODO: Can we use the following code? */
1311
+ /*
1307
1312
  if (!g_arg_info_is_caller_allocates(arg_info)) {
1308
1313
  argument->v_pointer = ALLOC(gpointer);
1309
1314
  return;
1310
1315
  }
1316
+ */
1311
1317
 
1312
1318
  interface_info = g_type_info_get_interface(type_info);
1313
1319
  interface_type = g_base_info_get_type(interface_info);
@@ -1330,10 +1336,32 @@ rb_gi_out_argument_init_interface(GIArgument *argument, GIArgInfo *arg_info,
1330
1336
  }
1331
1337
  break;
1332
1338
  case GI_INFO_TYPE_BOXED:
1339
+ rb_raise(rb_eNotImpError,
1340
+ "TODO: allocates GIArgument(interface)[%s] for output",
1341
+ g_info_type_to_string(interface_type));
1342
+ break;
1333
1343
  case GI_INFO_TYPE_ENUM:
1344
+ {
1345
+ gint *pointer = ALLOC(gint);
1346
+ *pointer = 0;
1347
+ argument->v_pointer = pointer;
1348
+ }
1349
+ break;
1334
1350
  case GI_INFO_TYPE_FLAGS:
1351
+ {
1352
+ guint *pointer = ALLOC(guint);
1353
+ *pointer = 0;
1354
+ argument->v_pointer = pointer;
1355
+ }
1356
+ break;
1335
1357
  case GI_INFO_TYPE_OBJECT:
1336
1358
  case GI_INFO_TYPE_INTERFACE:
1359
+ {
1360
+ gpointer *pointer = ALLOC(gpointer);
1361
+ *pointer = NULL;
1362
+ argument->v_pointer = pointer;
1363
+ }
1364
+ break;
1337
1365
  case GI_INFO_TYPE_CONSTANT:
1338
1366
  case GI_INFO_TYPE_INVALID_0:
1339
1367
  case GI_INFO_TYPE_UNION:
@@ -1370,48 +1398,102 @@ rb_gi_out_argument_init(GIArgument *argument, GIArgInfo *arg_info)
1370
1398
  switch (type_tag) {
1371
1399
  case GI_TYPE_TAG_VOID:
1372
1400
  if (g_type_info_is_pointer(&type_info)) {
1373
- argument->v_pointer = ALLOC(gpointer);
1401
+ gpointer *pointer = ALLOC(gpointer);
1402
+ *pointer = NULL;
1403
+ argument->v_pointer = pointer;
1374
1404
  }
1375
1405
  break;
1376
1406
  case GI_TYPE_TAG_BOOLEAN:
1377
- argument->v_pointer = ALLOC(gboolean);
1407
+ {
1408
+ gboolean *pointer = ALLOC(gboolean);
1409
+ *pointer = FALSE;
1410
+ argument->v_pointer = pointer;
1411
+ }
1378
1412
  break;
1379
1413
  case GI_TYPE_TAG_INT8:
1380
- argument->v_pointer = ALLOC(gint8);
1414
+ {
1415
+ gint8 *pointer = ALLOC(gint8);
1416
+ *pointer = 0;
1417
+ argument->v_pointer = pointer;
1418
+ }
1381
1419
  break;
1382
1420
  case GI_TYPE_TAG_UINT8:
1383
- argument->v_pointer = ALLOC(guint8);
1421
+ {
1422
+ guint8 *pointer = ALLOC(guint8);
1423
+ *pointer = 0;
1424
+ argument->v_pointer = pointer;
1425
+ }
1384
1426
  break;
1385
1427
  case GI_TYPE_TAG_INT16:
1386
- argument->v_pointer = ALLOC(gint16);
1428
+ {
1429
+ gint16 *pointer = ALLOC(gint16);
1430
+ *pointer = 0;
1431
+ argument->v_pointer = pointer;
1432
+ }
1387
1433
  break;
1388
1434
  case GI_TYPE_TAG_UINT16:
1389
- argument->v_pointer = ALLOC(guint16);
1435
+ {
1436
+ guint16 *pointer = ALLOC(guint16);
1437
+ *pointer = 0;
1438
+ argument->v_pointer = pointer;
1439
+ }
1390
1440
  break;
1391
1441
  case GI_TYPE_TAG_INT32:
1392
- argument->v_pointer = ALLOC(gint32);
1442
+ {
1443
+ gint32 *pointer = ALLOC(gint32);
1444
+ *pointer = 0;
1445
+ argument->v_pointer = pointer;
1446
+ }
1393
1447
  break;
1394
1448
  case GI_TYPE_TAG_UINT32:
1395
- argument->v_pointer = ALLOC(guint32);
1449
+ {
1450
+ guint32 *pointer = ALLOC(guint32);
1451
+ *pointer = 0;
1452
+ argument->v_pointer = pointer;
1453
+ }
1396
1454
  break;
1397
1455
  case GI_TYPE_TAG_INT64:
1398
- argument->v_pointer = ALLOC(gint64);
1456
+ {
1457
+ gint64 *pointer = ALLOC(gint64);
1458
+ *pointer = 0;
1459
+ argument->v_pointer = pointer;
1460
+ }
1399
1461
  break;
1400
1462
  case GI_TYPE_TAG_UINT64:
1401
- argument->v_pointer = ALLOC(guint64);
1463
+ {
1464
+ guint64 *pointer = ALLOC(guint64);
1465
+ *pointer = 0;
1466
+ argument->v_pointer = pointer;
1467
+ }
1402
1468
  break;
1403
1469
  case GI_TYPE_TAG_FLOAT:
1404
- argument->v_pointer = ALLOC(gfloat);
1470
+ {
1471
+ gfloat *pointer = ALLOC(gfloat);
1472
+ *pointer = 0.0;
1473
+ argument->v_pointer = pointer;
1474
+ }
1405
1475
  break;
1406
1476
  case GI_TYPE_TAG_DOUBLE:
1407
- argument->v_pointer = ALLOC(gdouble);
1477
+ {
1478
+ gdouble *pointer = ALLOC(gdouble);
1479
+ *pointer = 0.0;
1480
+ argument->v_pointer = pointer;
1481
+ }
1408
1482
  break;
1409
1483
  case GI_TYPE_TAG_GTYPE:
1410
- argument->v_pointer = ALLOC(GType);
1484
+ {
1485
+ GType *pointer = ALLOC(GType);
1486
+ *pointer = G_TYPE_INVALID;
1487
+ argument->v_pointer = pointer;
1488
+ }
1411
1489
  break;
1412
1490
  case GI_TYPE_TAG_UTF8:
1413
1491
  case GI_TYPE_TAG_FILENAME:
1414
- argument->v_pointer = ALLOC(gchar *);
1492
+ {
1493
+ gchar **pointer = ALLOC(gchar *);
1494
+ *pointer = NULL;
1495
+ argument->v_pointer = pointer;
1496
+ }
1415
1497
  break;
1416
1498
  case GI_TYPE_TAG_ARRAY:
1417
1499
  rb_gi_out_argument_init_array(argument, arg_info, &type_info);
@@ -1422,14 +1504,25 @@ rb_gi_out_argument_init(GIArgument *argument, GIArgInfo *arg_info)
1422
1504
  case GI_TYPE_TAG_GLIST:
1423
1505
  case GI_TYPE_TAG_GSLIST:
1424
1506
  case GI_TYPE_TAG_GHASH:
1425
- argument->v_pointer = ALLOC(gpointer);
1507
+ {
1508
+ gpointer *pointer = ALLOC(gpointer);
1509
+ *pointer = NULL;
1510
+ argument->v_pointer = pointer;
1511
+ }
1426
1512
  break;
1427
1513
  case GI_TYPE_TAG_ERROR:
1428
- argument->v_pointer = ALLOC(GError *);
1429
- memset(argument->v_pointer, 0, sizeof(GError *));
1514
+ {
1515
+ GError **pointer = ALLOC(GError *);
1516
+ *pointer = NULL;
1517
+ argument->v_pointer = pointer;
1518
+ }
1430
1519
  break;
1431
1520
  case GI_TYPE_TAG_UNICHAR:
1432
- argument->v_pointer = ALLOC(gunichar);
1521
+ {
1522
+ gunichar *pointer = ALLOC(gunichar);
1523
+ *pointer = 0;
1524
+ argument->v_pointer = pointer;
1525
+ }
1433
1526
  break;
1434
1527
  default:
1435
1528
  g_assert_not_reached();
@@ -1824,9 +1917,13 @@ rb_gi_return_argument_free_everything_interface(GIArgument *argument,
1824
1917
  g_assert_not_reached();
1825
1918
  break;
1826
1919
  case GI_INFO_TYPE_UNION:
1827
- rb_raise(rb_eNotImpError,
1828
- "TODO: free GIArgument(interface)[union] everything");
1829
- break;
1920
+ if (gtype == G_TYPE_NONE) {
1921
+ rb_raise(rb_eNotImpError,
1922
+ "TODO: free GIArgument(interface)[union] everything");
1923
+ } else {
1924
+ g_boxed_free(gtype, argument->v_pointer);
1925
+ }
1926
+ break;
1830
1927
  case GI_INFO_TYPE_VALUE:
1831
1928
  rb_raise(rb_eNotImpError,
1832
1929
  "TODO: free GIArgument(interface)[value] everything");
@@ -1,6 +1,6 @@
1
1
  /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
2
  /*
3
- * Copyright (C) 2012-2015 Ruby-GNOME2 Project Team
3
+ * Copyright (C) 2012-2016 Ruby-GNOME2 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
@@ -34,6 +34,14 @@
34
34
  #define RG_TARGET_NAMESPACE rb_cGIFunctionInfo
35
35
  #define SELF(self) RVAL2GI_FUNCTION_INFO(self)
36
36
 
37
+ typedef struct _RBGICallback {
38
+ GIArgInfo *arg_info;
39
+ GITypeInfo *type_info;
40
+ GICallbackInfo *callback_info;
41
+ ffi_cif cif;
42
+ ffi_closure *closure;
43
+ } RBGICallback;
44
+
37
45
  static VALUE RG_TARGET_NAMESPACE;
38
46
  static VALUE rb_cGLibError;
39
47
  static const char *callbacks_key = "gi_callbacks";
@@ -148,9 +156,6 @@ fill_metadata_callback(GPtrArray *args_metadata)
148
156
  gint destroy_index;
149
157
 
150
158
  metadata = g_ptr_array_index(args_metadata, i);
151
- if (!metadata->callback_p) {
152
- continue;
153
- }
154
159
 
155
160
  arg_info = &(metadata->arg_info);
156
161
  closure_index = g_arg_info_get_closure(arg_info);
@@ -274,9 +279,22 @@ callback_data_unguard_from_gc(RBGICallbackData *callback_data)
274
279
  rb_hash_delete(rb_callbacks, callback_data->rb_gc_guard_key);
275
280
  }
276
281
 
282
+ static void
283
+ rb_gi_callback_free(RBGICallback *callback)
284
+ {
285
+ g_callable_info_free_closure(callback->callback_info,
286
+ callback->closure);
287
+ g_base_info_unref(callback->callback_info);
288
+ g_base_info_unref(callback->type_info);
289
+ xfree(callback);
290
+ }
291
+
277
292
  void
278
293
  rb_gi_callback_data_free(RBGICallbackData *callback_data)
279
294
  {
295
+ if (callback_data->callback) {
296
+ rb_gi_callback_free(callback_data->callback);
297
+ }
280
298
  callback_data_unguard_from_gc(callback_data);
281
299
  xfree(callback_data->metadata);
282
300
  xfree(callback_data);
@@ -380,14 +398,535 @@ source_func_callback_finder(GIArgInfo *arg_info)
380
398
  return source_func_callback;
381
399
  }
382
400
 
401
+ static void arguments_init(GArray **in_args,
402
+ GArray **out_args,
403
+ GPtrArray **args_metadata);
404
+ static void arguments_free(VALUE rb_arguments,
405
+ GArray *in_args,
406
+ GArray *out_args,
407
+ GPtrArray *args_metadata);
408
+
409
+ static void
410
+ argument_from_raw_data_interface(GICallableInfo *callable_info,
411
+ void *raw_arg,
412
+ GIArgument *argument,
413
+ GITypeInfo *type_info)
414
+ {
415
+ GIBaseInfo *interface_info;
416
+ GIInfoType interface_type;
417
+
418
+ interface_info = g_type_info_get_interface(type_info);
419
+ interface_type = g_base_info_get_type(interface_info);
420
+
421
+ switch (interface_type) {
422
+ case GI_INFO_TYPE_INVALID:
423
+ case GI_INFO_TYPE_FUNCTION:
424
+ case GI_INFO_TYPE_CALLBACK:
425
+ rb_raise(rb_eNotImpError,
426
+ "TODO: %s::%s: raw data -> GIArgument(interface)[%s]: <%s>",
427
+ g_base_info_get_namespace(callable_info),
428
+ g_base_info_get_name(callable_info),
429
+ g_info_type_to_string(interface_type),
430
+ g_base_info_get_name(interface_info));
431
+ break;
432
+ case GI_INFO_TYPE_STRUCT:
433
+ argument->v_pointer = *((gpointer *)(raw_arg));
434
+ break;
435
+ case GI_INFO_TYPE_BOXED:
436
+ case GI_INFO_TYPE_ENUM:
437
+ rb_raise(rb_eNotImpError,
438
+ "TODO: %s::%s: raw data -> GIArgument(interface)[%s]: <%s>",
439
+ g_base_info_get_namespace(callable_info),
440
+ g_base_info_get_name(callable_info),
441
+ g_info_type_to_string(interface_type),
442
+ g_base_info_get_name(interface_info));
443
+ break;
444
+ case GI_INFO_TYPE_FLAGS:
445
+ argument->v_int32= *((gint32 *)(raw_arg));
446
+ break;
447
+ case GI_INFO_TYPE_OBJECT:
448
+ case GI_INFO_TYPE_INTERFACE:
449
+ argument->v_pointer = *((gpointer *)(raw_arg));
450
+ break;
451
+ case GI_INFO_TYPE_CONSTANT:
452
+ rb_raise(rb_eNotImpError,
453
+ "TODO: %s::%s: raw data -> GIArgument(interface)[%s]: <%s>",
454
+ g_base_info_get_namespace(callable_info),
455
+ g_base_info_get_name(callable_info),
456
+ g_info_type_to_string(interface_type),
457
+ g_base_info_get_name(interface_info));
458
+ break;
459
+ case GI_INFO_TYPE_INVALID_0:
460
+ g_assert_not_reached();
461
+ break;
462
+ case GI_INFO_TYPE_UNION:
463
+ case GI_INFO_TYPE_VALUE:
464
+ case GI_INFO_TYPE_SIGNAL:
465
+ case GI_INFO_TYPE_VFUNC:
466
+ case GI_INFO_TYPE_PROPERTY:
467
+ case GI_INFO_TYPE_FIELD:
468
+ case GI_INFO_TYPE_ARG:
469
+ case GI_INFO_TYPE_TYPE:
470
+ case GI_INFO_TYPE_UNRESOLVED:
471
+ default:
472
+ rb_raise(rb_eNotImpError,
473
+ "TODO: %s::%s: raw data -> GIArgument(interface)[%s]: <%s>",
474
+ g_base_info_get_namespace(callable_info),
475
+ g_base_info_get_name(callable_info),
476
+ g_info_type_to_string(interface_type),
477
+ g_base_info_get_name(interface_info));
478
+ break;
479
+ }
480
+
481
+ g_base_info_unref(interface_info);
482
+ }
483
+
484
+ static void
485
+ argument_from_raw_data(GICallableInfo *callable_info,
486
+ void **raw_args,
487
+ GArray *in_args,
488
+ GArray *out_args,
489
+ GPtrArray *args_metadata,
490
+ guint i)
491
+ {
492
+ RBGIArgMetadata *metadata;
493
+ GIArgument *argument;
494
+ GITypeInfo *type_info;
495
+ GITypeTag type_tag;
496
+
497
+ metadata = g_ptr_array_index(args_metadata, i);
498
+
499
+ if (metadata->direction == GI_DIRECTION_INOUT) {
500
+ argument = &g_array_index(in_args, GIArgument, metadata->in_arg_index);
501
+ argument->v_pointer = *((gpointer *)(raw_args[i]));
502
+ return;
503
+ } else if (metadata->direction == GI_DIRECTION_OUT) {
504
+ argument = &g_array_index(out_args, GIArgument, metadata->out_arg_index);
505
+ argument->v_pointer = *((gpointer *)(raw_args[i]));
506
+ return;
507
+ }
508
+
509
+ argument = &g_array_index(in_args, GIArgument, metadata->in_arg_index);
510
+ type_info = g_arg_info_get_type(&(metadata->arg_info));
511
+ type_tag = g_type_info_get_tag(type_info);
512
+
513
+ switch (type_tag) {
514
+ case GI_TYPE_TAG_VOID:
515
+ argument->v_pointer = *((gpointer *)(raw_args[i]));
516
+ break;
517
+ case GI_TYPE_TAG_BOOLEAN:
518
+ argument->v_boolean = *((gboolean *)(raw_args[i]));
519
+ break;
520
+ case GI_TYPE_TAG_INT8:
521
+ argument->v_int8 = *((gint8 *)(raw_args[i]));
522
+ break;
523
+ case GI_TYPE_TAG_UINT8:
524
+ argument->v_uint8 = *((guint8 *)(raw_args[i]));
525
+ break;
526
+ case GI_TYPE_TAG_INT16:
527
+ argument->v_int16 = *((gint16 *)(raw_args[i]));
528
+ break;
529
+ case GI_TYPE_TAG_UINT16:
530
+ argument->v_uint16 = *((guint16 *)(raw_args[i]));
531
+ break;
532
+ case GI_TYPE_TAG_INT32:
533
+ argument->v_int32 = *((gint32 *)(raw_args[i]));
534
+ break;
535
+ case GI_TYPE_TAG_UINT32:
536
+ argument->v_uint32 = *((guint32 *)(raw_args[i]));
537
+ break;
538
+ case GI_TYPE_TAG_INT64:
539
+ argument->v_int64 = *((gint64 *)(raw_args[i]));
540
+ break;
541
+ case GI_TYPE_TAG_UINT64:
542
+ argument->v_uint64 = *((guint64 *)(raw_args[i]));
543
+ break;
544
+ case GI_TYPE_TAG_FLOAT:
545
+ argument->v_float = *((gfloat *)(raw_args[i]));
546
+ break;
547
+ case GI_TYPE_TAG_DOUBLE:
548
+ argument->v_double = *((gdouble *)(raw_args[i]));
549
+ break;
550
+ case GI_TYPE_TAG_GTYPE:
551
+ argument->v_size = *((gsize *)(raw_args[i]));
552
+ break;
553
+ case GI_TYPE_TAG_UTF8:
554
+ case GI_TYPE_TAG_FILENAME:
555
+ argument->v_string = *((gchar **)(raw_args[i]));
556
+ break;
557
+ case GI_TYPE_TAG_ARRAY:
558
+ argument->v_pointer = *((gpointer *)(raw_args[i]));
559
+ break;
560
+ case GI_TYPE_TAG_INTERFACE:
561
+ argument_from_raw_data_interface(callable_info,
562
+ raw_args[i],
563
+ argument,
564
+ type_info);
565
+ break;
566
+ case GI_TYPE_TAG_GLIST:
567
+ case GI_TYPE_TAG_GSLIST:
568
+ case GI_TYPE_TAG_GHASH:
569
+ argument->v_pointer = *((gpointer *)(raw_args[i]));
570
+ break;
571
+ case GI_TYPE_TAG_ERROR:
572
+ argument->v_pointer = *((GError **)(raw_args[i]));
573
+ break;
574
+ case GI_TYPE_TAG_UNICHAR:
575
+ argument->v_uint32 = *((gunichar *)(raw_args[i]));
576
+ break;
577
+ default:
578
+ g_assert_not_reached();
579
+ break;
580
+ }
581
+
582
+ g_base_info_unref(type_info);
583
+ }
584
+
585
+ static void
586
+ arguments_from_raw_data(GICallableInfo *callable_info,
587
+ void **args,
588
+ GArray *in_args,
589
+ GArray *out_args,
590
+ GPtrArray *args_metadata)
591
+ {
592
+ guint i;
593
+
594
+ for (i = 0; i < args_metadata->len; i++) {
595
+ argument_from_raw_data(callable_info,
596
+ args,
597
+ in_args,
598
+ out_args,
599
+ args_metadata,
600
+ i);
601
+ }
602
+ }
603
+
604
+ static void
605
+ in_arguments_to_ruby(GArray *in_args,
606
+ GArray *out_args,
607
+ GPtrArray *args_metadata,
608
+ GArray *rb_args)
609
+ {
610
+ guint i;
611
+
612
+ for (i = 0; i < args_metadata->len; i++) {
613
+ RBGIArgMetadata *metadata;
614
+ GIArgument *argument;
615
+ GITypeInfo *type_info;
616
+ VALUE rb_arg;
617
+
618
+ metadata = g_ptr_array_index(args_metadata, i);
619
+
620
+ if (metadata->direction == GI_DIRECTION_OUT) {
621
+ continue;
622
+ }
623
+ if (metadata->closure_p) {
624
+ continue;
625
+ }
626
+
627
+ argument = &g_array_index(in_args, GIArgument, metadata->in_arg_index);
628
+ type_info = g_arg_info_get_type(&(metadata->arg_info));
629
+ rb_arg = GI_ARGUMENT2RVAL(argument,
630
+ FALSE,
631
+ type_info,
632
+ in_args,
633
+ out_args,
634
+ args_metadata);
635
+ g_array_append_val(rb_args, rb_arg);
636
+ }
637
+ }
638
+
639
+ static void
640
+ out_argument_to_raw_data_interface(GICallableInfo *callable_info,
641
+ GIArgument *argument,
642
+ gpointer result,
643
+ GITypeInfo *type_info,
644
+ G_GNUC_UNUSED GITransfer transfer /* TODO */)
645
+ {
646
+ GIBaseInfo *interface_info;
647
+ GIInfoType interface_type;
648
+
649
+ interface_info = g_type_info_get_interface(type_info);
650
+ interface_type = g_base_info_get_type(interface_info);
651
+
652
+ switch (interface_type) {
653
+ case GI_INFO_TYPE_INVALID:
654
+ case GI_INFO_TYPE_FUNCTION:
655
+ case GI_INFO_TYPE_CALLBACK:
656
+ case GI_INFO_TYPE_STRUCT:
657
+ case GI_INFO_TYPE_BOXED:
658
+ rb_raise(rb_eNotImpError,
659
+ "TODO: %s::%s: out raw data(interface)[%s]: <%s>",
660
+ g_base_info_get_namespace(callable_info),
661
+ g_base_info_get_name(callable_info),
662
+ g_info_type_to_string(interface_type),
663
+ g_base_info_get_name(interface_info));
664
+ break;
665
+ case GI_INFO_TYPE_ENUM:
666
+ *((gint *)result) = argument->v_int;
667
+ break;
668
+ case GI_INFO_TYPE_FLAGS:
669
+ case GI_INFO_TYPE_OBJECT:
670
+ case GI_INFO_TYPE_INTERFACE:
671
+ case GI_INFO_TYPE_CONSTANT:
672
+ rb_raise(rb_eNotImpError,
673
+ "TODO: %s::%s: out raw data(interface)[%s]: <%s>",
674
+ g_base_info_get_namespace(callable_info),
675
+ g_base_info_get_name(callable_info),
676
+ g_info_type_to_string(interface_type),
677
+ g_base_info_get_name(interface_info));
678
+ break;
679
+ case GI_INFO_TYPE_INVALID_0:
680
+ g_assert_not_reached();
681
+ break;
682
+ case GI_INFO_TYPE_UNION:
683
+ case GI_INFO_TYPE_VALUE:
684
+ case GI_INFO_TYPE_SIGNAL:
685
+ case GI_INFO_TYPE_VFUNC:
686
+ case GI_INFO_TYPE_PROPERTY:
687
+ case GI_INFO_TYPE_FIELD:
688
+ case GI_INFO_TYPE_ARG:
689
+ case GI_INFO_TYPE_TYPE:
690
+ case GI_INFO_TYPE_UNRESOLVED:
691
+ default:
692
+ rb_raise(rb_eNotImpError,
693
+ "TODO: %s::%s: out raw data(interface)[%s]: <%s>",
694
+ g_base_info_get_namespace(callable_info),
695
+ g_base_info_get_name(callable_info),
696
+ g_info_type_to_string(interface_type),
697
+ g_base_info_get_name(interface_info));
698
+ break;
699
+ }
700
+
701
+ g_base_info_unref(interface_info);
702
+ }
703
+
704
+ static void
705
+ out_argument_to_raw_data(GICallableInfo *callable_info,
706
+ VALUE rb_result,
707
+ gpointer result,
708
+ GITypeInfo *type_info,
709
+ GITransfer transfer)
710
+ {
711
+ GIArgument argument;
712
+ GITypeTag type_tag;
713
+
714
+ rb_gi_value_argument_from_ruby(&argument,
715
+ type_info,
716
+ rb_result,
717
+ rb_result);
718
+ type_tag = g_type_info_get_tag(type_info);
719
+ switch (type_tag) {
720
+ case GI_TYPE_TAG_VOID:
721
+ g_assert_not_reached();
722
+ break;
723
+ case GI_TYPE_TAG_BOOLEAN:
724
+ *((gboolean *)result) = argument.v_boolean;
725
+ break;
726
+ case GI_TYPE_TAG_INT8:
727
+ *((gint8 *)result) = argument.v_int8;
728
+ break;
729
+ case GI_TYPE_TAG_UINT8:
730
+ *((guint8 *)result) = argument.v_uint8;
731
+ break;
732
+ case GI_TYPE_TAG_INT16:
733
+ *((gint16 *)result) = argument.v_int16;
734
+ break;
735
+ case GI_TYPE_TAG_UINT16:
736
+ *((guint16 *)result) = argument.v_uint16;
737
+ break;
738
+ case GI_TYPE_TAG_INT32:
739
+ *((gint32 *)result) = argument.v_int32;
740
+ break;
741
+ case GI_TYPE_TAG_UINT32:
742
+ *((guint32 *)result) = argument.v_uint32;
743
+ break;
744
+ case GI_TYPE_TAG_INT64:
745
+ *((gint64 *)result) = argument.v_int64;
746
+ break;
747
+ case GI_TYPE_TAG_UINT64:
748
+ *((guint64 *)result) = argument.v_uint64;
749
+ break;
750
+ case GI_TYPE_TAG_FLOAT:
751
+ *((gfloat *)result) = argument.v_float;
752
+ break;
753
+ case GI_TYPE_TAG_DOUBLE:
754
+ *((gdouble *)result) = argument.v_double;
755
+ break;
756
+ case GI_TYPE_TAG_GTYPE:
757
+ *((gsize *)result) = argument.v_size;
758
+ break;
759
+ case GI_TYPE_TAG_UTF8:
760
+ case GI_TYPE_TAG_FILENAME:
761
+ *((gchar **)result) = argument.v_string;
762
+ break;
763
+ case GI_TYPE_TAG_ARRAY:
764
+ *((gpointer *)result) = argument.v_pointer;
765
+ break;
766
+ case GI_TYPE_TAG_INTERFACE:
767
+ out_argument_to_raw_data_interface(callable_info,
768
+ &argument,
769
+ result,
770
+ type_info,
771
+ transfer);
772
+ break;
773
+ case GI_TYPE_TAG_GLIST:
774
+ case GI_TYPE_TAG_GSLIST:
775
+ case GI_TYPE_TAG_GHASH:
776
+ *((gpointer *)result) = argument.v_pointer;
777
+ break;
778
+ case GI_TYPE_TAG_ERROR:
779
+ *((GError **)result) = argument.v_pointer;
780
+ break;
781
+ case GI_TYPE_TAG_UNICHAR:
782
+ *((gunichar *)result) = argument.v_uint32;
783
+ break;
784
+ default:
785
+ g_assert_not_reached();
786
+ break;
787
+ }
788
+ }
789
+
790
+ static void
791
+ out_arguments_to_raw_data(GICallableInfo *callable_info,
792
+ VALUE rb_results,
793
+ void *result,
794
+ GArray *out_args,
795
+ GPtrArray *args_metadata)
796
+ {
797
+ int i_rb_result = 0;
798
+ guint i;
799
+ GITypeInfo *return_type_info;
800
+ GITypeTag return_type_tag;
801
+
802
+ return_type_info = g_callable_info_get_return_type(callable_info);
803
+ return_type_tag = g_type_info_get_tag(return_type_info);
804
+ if (return_type_tag != GI_TYPE_TAG_VOID) {
805
+ GITransfer transfer;
806
+ transfer = g_callable_info_get_caller_owns(callable_info);
807
+ if (out_args->len == 0) {
808
+ VALUE rb_return_value = rb_results;
809
+ out_argument_to_raw_data(callable_info,
810
+ rb_return_value,
811
+ result,
812
+ return_type_info,
813
+ transfer);
814
+ } else {
815
+ out_argument_to_raw_data(callable_info,
816
+ RARRAY_AREF(rb_results, i_rb_result),
817
+ result,
818
+ return_type_info,
819
+ transfer);
820
+ i_rb_result++;
821
+ }
822
+ }
823
+ g_base_info_unref(return_type_info);
824
+
825
+ for (i = 0; i < args_metadata->len; i++) {
826
+ RBGIArgMetadata *metadata;
827
+ GIArgument *argument;
828
+ GITypeInfo *type_info;
829
+ GITransfer transfer;
830
+
831
+ metadata = g_ptr_array_index(args_metadata, i);
832
+
833
+ /* TODO: support GI_DIRECTION_INOUT */
834
+ if (metadata->direction != GI_DIRECTION_OUT) {
835
+ continue;
836
+ }
837
+
838
+ argument = &g_array_index(out_args, GIArgument, metadata->out_arg_index);
839
+ type_info = g_arg_info_get_type(&(metadata->arg_info));
840
+ transfer = g_arg_info_get_ownership_transfer(&(metadata->arg_info));
841
+ out_argument_to_raw_data(callable_info,
842
+ RARRAY_AREF(rb_results, i_rb_result),
843
+ argument->v_pointer,
844
+ type_info,
845
+ transfer);
846
+ i_rb_result++;
847
+ g_base_info_unref(type_info);
848
+ }
849
+ }
850
+
851
+ static void
852
+ ffi_closure_callback(G_GNUC_UNUSED ffi_cif *cif,
853
+ void *result,
854
+ void **raw_args,
855
+ void *data)
856
+ {
857
+ RBGICallback *callback = data;
858
+ RBGICallbackData *callback_data = NULL;
859
+ GArray *in_args;
860
+ GArray *out_args;
861
+ GPtrArray *args_metadata;
862
+ VALUE rb_results;
863
+
864
+ arguments_init(&in_args, &out_args, &args_metadata);
865
+ allocate_arguments(callback->callback_info,
866
+ in_args,
867
+ out_args,
868
+ args_metadata);
869
+ fill_metadata(args_metadata);
870
+ arguments_from_raw_data(callback->callback_info,
871
+ raw_args,
872
+ in_args,
873
+ out_args,
874
+ args_metadata);
875
+
876
+ {
877
+ guint i;
878
+
879
+ for (i = 0; i < args_metadata->len; i++) {
880
+ RBGIArgMetadata *metadata;
881
+
882
+ metadata = g_ptr_array_index(args_metadata, i);
883
+ if (!metadata->closure_p) {
884
+ continue;
885
+ }
886
+
887
+ callback_data = *((RBGICallbackData **)(raw_args[i]));
888
+ break;
889
+ }
890
+ }
891
+
892
+ {
893
+ ID id_call;
894
+ GArray *rb_args;
895
+
896
+ rb_args = g_array_new(FALSE, FALSE, sizeof(VALUE));
897
+ in_arguments_to_ruby(in_args,
898
+ out_args,
899
+ args_metadata,
900
+ rb_args);
901
+ CONST_ID(id_call, "call");
902
+ /* TODO: use rb_protect() */
903
+ rb_results = rb_funcallv(callback_data->rb_callback,
904
+ id_call,
905
+ rb_args->len,
906
+ (VALUE *)(rb_args->data));
907
+ g_array_free(rb_args, TRUE);
908
+ }
909
+
910
+ out_arguments_to_raw_data(callback->callback_info,
911
+ rb_results,
912
+ result,
913
+ out_args,
914
+ args_metadata);
915
+
916
+ if (callback_data->metadata->scope_type == GI_SCOPE_TYPE_ASYNC) {
917
+ rb_gi_callback_data_free(callback_data);
918
+ }
919
+ }
920
+
383
921
  static void
384
922
  in_callback_argument_from_ruby(RBGIArgMetadata *metadata, GArray *in_args)
385
923
  {
386
- gpointer callback;
924
+ gpointer callback_function;
387
925
  GIArgInfo *arg_info;
388
926
  GIArgument *callback_argument;
389
927
  GIArgument *closure_argument = NULL;
390
928
  GIArgument *destroy_argument = NULL;
929
+ RBGICallback *callback = NULL;
391
930
 
392
931
  arg_info = &(metadata->arg_info);
393
932
 
@@ -416,26 +955,26 @@ in_callback_argument_from_ruby(RBGIArgMetadata *metadata, GArray *in_args)
416
955
  return;
417
956
  }
418
957
 
419
- callback = find_callback_function(arg_info);
420
- if (!callback) {
421
- GITypeInfo type_info;
422
- GIBaseInfo *interface_info;
423
- VALUE rb_type_name;
424
- g_arg_info_load_type(arg_info, &type_info);
425
- interface_info = g_type_info_get_interface(&type_info);
426
- rb_type_name = CSTR2RVAL(g_base_info_get_name(interface_info));
427
- g_base_info_unref(interface_info);
428
- rb_raise(rb_eNotImpError,
429
- "TODO: <%s>(%s) callback is not supported yet.",
430
- RVAL2CSTR(rb_type_name),
431
- g_base_info_get_name(arg_info));
958
+ callback_function = find_callback_function(arg_info);
959
+ if (callback_function) {
960
+ callback_argument->v_pointer = callback_function;
961
+ } else {
962
+ callback = RB_ZALLOC(RBGICallback);
963
+ callback->type_info = g_arg_info_get_type(arg_info);
964
+ callback->callback_info = g_type_info_get_interface(callback->type_info);
965
+ callback->closure =
966
+ g_callable_info_prepare_closure(callback->callback_info,
967
+ &(callback->cif),
968
+ ffi_closure_callback,
969
+ callback);
970
+ callback_argument->v_pointer = callback->closure;
432
971
  }
433
- callback_argument->v_pointer = callback;
434
972
 
435
973
  if (closure_argument) {
436
974
  RBGICallbackData *callback_data;
437
975
 
438
976
  callback_data = ALLOC(RBGICallbackData);
977
+ callback_data->callback = callback;
439
978
  callback_data->metadata = metadata;
440
979
  callback_data->rb_callback = rb_block_proc();
441
980
  callback_data_guard_from_gc(callback_data);