gobject-introspection 3.3.0 → 3.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +1 -73
- data/ext/gobject-introspection/rb-gi-argument.c +264 -85
- data/ext/gobject-introspection/rb-gi-function-info.c +32 -19
- data/lib/gobject-introspection.rb +1 -13
- data/lib/gobject-introspection/loader.rb +54 -19
- metadata +5 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4c6caefd72069125350637fc2a07a444c90ae74ba5175b1e5031e84e5a4349ae
|
4
|
+
data.tar.gz: 9f1ed91b438bd00f424f283c797af9834c85f2ddc88441019b1781ab40145c6e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3f4bb16322d279941ac6ed04b236291d457b1e086dfbefdb0e9fdd343441eaa9df553cc497c771d377231ad8dda2ea80bea1709c46f4e101d7636761f7de0239
|
7
|
+
data.tar.gz: c710f5412c54f621502f45fcc70f6ea4a9ad7d901bc5b1acebd72aee45aae2d7a31e7319e8c660297db1e8f2bb01afb83bbc082a8f57a62d6d0ad0cbd174953d
|
data/Rakefile
CHANGED
@@ -22,77 +22,5 @@ require "gnome2/rake/package-task"
|
|
22
22
|
package_name = File.basename(__dir__)
|
23
23
|
spec = Gem::Specification.load("#{package_name}.gemspec")
|
24
24
|
|
25
|
-
|
26
|
-
package.windows.packages = []
|
27
|
-
package.windows.dependencies = []
|
28
|
-
package.windows.build_dependencies = ["glib2"]
|
29
|
-
package.external_packages = [
|
30
|
-
{
|
31
|
-
:name => "glib",
|
32
|
-
:download_site => :gnome,
|
33
|
-
:label => "GLib",
|
34
|
-
:version => "2.58.1",
|
35
|
-
:compression_method => "xz",
|
36
|
-
:windows => {
|
37
|
-
:build => false,
|
38
|
-
},
|
39
|
-
:native => {
|
40
|
-
:build => true,
|
41
|
-
:need_autoreconf => true,
|
42
|
-
:built_file => "lib/libglib-2.0.so",
|
43
|
-
},
|
44
|
-
},
|
45
|
-
{
|
46
|
-
:name => "gobject-introspection",
|
47
|
-
:download_site => :gnome,
|
48
|
-
:label => "gobject-introspection",
|
49
|
-
:version => "1.58.0",
|
50
|
-
:compression_method => "xz",
|
51
|
-
:windows => {
|
52
|
-
:configure_args => [
|
53
|
-
"--with-g-ir-scanner=#{package.native.absolute_binary_dir}/bin/g-ir-scanner",
|
54
|
-
"--disable-tests",
|
55
|
-
],
|
56
|
-
:patches => [
|
57
|
-
"support-external-g-ir-scanner.diff",
|
58
|
-
],
|
59
|
-
:need_autoreconf => true,
|
60
|
-
:build_concurrently => false,
|
61
|
-
:built_file => "bin/libgirepository-1.0-1.dll",
|
62
|
-
},
|
63
|
-
:native => {
|
64
|
-
:build => true,
|
65
|
-
:patches => [
|
66
|
-
],
|
67
|
-
:built_file => "bin/g-ir-scanner",
|
68
|
-
}
|
69
|
-
},
|
70
|
-
]
|
71
|
-
end
|
72
|
-
package_task.define
|
73
|
-
|
74
|
-
namespace :native do
|
75
|
-
namespace :"gobject-introspection" do
|
76
|
-
patched_paths = []
|
77
|
-
|
78
|
-
g_ir_scanner_dir = package_task.native.absolute_binary_dir
|
79
|
-
g_ir_scanner_dir += "lib/gobject-introspection/giscanner"
|
80
|
-
g_ir_scanner_patched_path = g_ir_scanner_dir + "patched"
|
81
|
-
patched_paths << g_ir_scanner_patched_path
|
82
|
-
file g_ir_scanner_patched_path.to_s do
|
83
|
-
Dir.chdir(g_ir_scanner_dir.to_s) do
|
84
|
-
patch = "#{package_task.package.patches_dir}/cross-g-ir-scanner.diff"
|
85
|
-
sh("patch -p2 < #{patch}")
|
86
|
-
rm_f(Dir.glob("*.{pyc,pyo}"))
|
87
|
-
end
|
88
|
-
touch(g_ir_scanner_patched_path)
|
89
|
-
end
|
90
|
-
|
91
|
-
desc "Make g-ir-scanner workable for Windows on non Windows"
|
92
|
-
task :cross => patched_paths
|
93
|
-
end
|
94
|
-
|
95
|
-
namespace :builder do
|
96
|
-
task :after => "native:gobject-introspection:cross"
|
97
|
-
end
|
25
|
+
GNOME2::Rake::PackageTask.define(spec, __dir__) do |package|
|
98
26
|
end
|
@@ -1128,47 +1128,25 @@ rb_gi_argument_to_ruby_gslist(GIArgument *argument, GITypeInfo *type_info)
|
|
1128
1128
|
return rb_argument;
|
1129
1129
|
}
|
1130
1130
|
|
1131
|
-
|
1132
|
-
|
1133
|
-
gpointer value,
|
1134
|
-
gpointer user_data)
|
1135
|
-
{
|
1136
|
-
VALUE rb_table = (VALUE)user_data;
|
1137
|
-
VALUE rb_key;
|
1138
|
-
VALUE rb_value;
|
1139
|
-
|
1140
|
-
rb_key = CSTR2RVAL(key);
|
1141
|
-
rb_value = CSTR2RVAL(value);
|
1142
|
-
rb_hash_aset(rb_table, rb_key, rb_value);
|
1143
|
-
}
|
1144
|
-
|
1145
|
-
static VALUE
|
1146
|
-
rb_gi_argument_to_ruby_ghash_utf8_utf8(GHashTable *table)
|
1147
|
-
{
|
1131
|
+
typedef struct {
|
1132
|
+
GIArgument *argument;
|
1148
1133
|
VALUE rb_table;
|
1149
|
-
|
1150
|
-
rb_table = rb_hash_new();
|
1151
|
-
g_hash_table_foreach(table,
|
1152
|
-
rb_gi_argument_to_ruby_ghash_utf8_utf8_body,
|
1153
|
-
(gpointer)(rb_table));
|
1154
|
-
return rb_table;
|
1155
|
-
}
|
1156
|
-
|
1157
|
-
static VALUE
|
1158
|
-
rb_gi_argument_to_ruby_ghash(GIArgument *argument, GITypeInfo *type_info)
|
1159
|
-
{
|
1160
|
-
VALUE rb_argument;
|
1161
1134
|
GITypeInfo *key_type_info;
|
1162
1135
|
GITypeTag key_type_tag;
|
1163
1136
|
GITypeInfo *value_type_info;
|
1164
1137
|
GITypeTag value_type_tag;
|
1138
|
+
} GHashToRubyData;
|
1165
1139
|
|
1166
|
-
|
1167
|
-
|
1168
|
-
|
1169
|
-
|
1140
|
+
static void
|
1141
|
+
rb_gi_argument_to_ruby_ghash_foreach_body(gpointer key,
|
1142
|
+
gpointer value,
|
1143
|
+
gpointer user_data)
|
1144
|
+
{
|
1145
|
+
GHashToRubyData *data = user_data;
|
1146
|
+
VALUE rb_key;
|
1147
|
+
VALUE rb_value;
|
1170
1148
|
|
1171
|
-
switch (key_type_tag) {
|
1149
|
+
switch (data->key_type_tag) {
|
1172
1150
|
case GI_TYPE_TAG_VOID:
|
1173
1151
|
case GI_TYPE_TAG_BOOLEAN:
|
1174
1152
|
case GI_TYPE_TAG_INT8:
|
@@ -1182,51 +1160,140 @@ rb_gi_argument_to_ruby_ghash(GIArgument *argument, GITypeInfo *type_info)
|
|
1182
1160
|
case GI_TYPE_TAG_FLOAT:
|
1183
1161
|
case GI_TYPE_TAG_DOUBLE:
|
1184
1162
|
case GI_TYPE_TAG_GTYPE:
|
1185
|
-
g_base_info_unref(key_type_info);
|
1186
|
-
g_base_info_unref(value_type_info);
|
1187
1163
|
rb_raise(rb_eNotImpError,
|
1188
1164
|
"TODO: GIArgument(GHash)[%s][%s] -> Ruby",
|
1189
|
-
g_type_tag_to_string(key_type_tag),
|
1190
|
-
g_type_tag_to_string(value_type_tag));
|
1165
|
+
g_type_tag_to_string(data->key_type_tag),
|
1166
|
+
g_type_tag_to_string(data->value_type_tag));
|
1191
1167
|
break;
|
1192
1168
|
case GI_TYPE_TAG_UTF8:
|
1193
|
-
|
1194
|
-
|
1195
|
-
|
1196
|
-
|
1197
|
-
|
1198
|
-
|
1199
|
-
|
1200
|
-
|
1201
|
-
|
1202
|
-
|
1203
|
-
|
1204
|
-
|
1169
|
+
rb_key = CSTR2RVAL(key);
|
1170
|
+
break;
|
1171
|
+
case GI_TYPE_TAG_FILENAME:
|
1172
|
+
case GI_TYPE_TAG_ARRAY:
|
1173
|
+
rb_raise(rb_eNotImpError,
|
1174
|
+
"TODO: GIArgument(GHash)[%s][%s] -> Ruby",
|
1175
|
+
g_type_tag_to_string(data->key_type_tag),
|
1176
|
+
g_type_tag_to_string(data->value_type_tag));
|
1177
|
+
break;
|
1178
|
+
case GI_TYPE_TAG_INTERFACE:
|
1179
|
+
{
|
1180
|
+
GIArgument key_argument;
|
1181
|
+
key_argument.v_pointer = key;
|
1182
|
+
rb_key = rb_gi_argument_to_ruby_interface(&key_argument,
|
1183
|
+
FALSE,
|
1184
|
+
data->key_type_info);
|
1205
1185
|
}
|
1206
1186
|
break;
|
1187
|
+
case GI_TYPE_TAG_GLIST:
|
1188
|
+
case GI_TYPE_TAG_GSLIST:
|
1189
|
+
case GI_TYPE_TAG_GHASH:
|
1190
|
+
case GI_TYPE_TAG_ERROR:
|
1191
|
+
case GI_TYPE_TAG_UNICHAR:
|
1192
|
+
rb_raise(rb_eNotImpError,
|
1193
|
+
"TODO: GIArgument(GHash)[%s][%s] -> Ruby",
|
1194
|
+
g_type_tag_to_string(data->key_type_tag),
|
1195
|
+
g_type_tag_to_string(data->value_type_tag));
|
1196
|
+
break;
|
1197
|
+
default:
|
1198
|
+
g_assert_not_reached();
|
1199
|
+
break;
|
1200
|
+
}
|
1201
|
+
|
1202
|
+
switch (data->value_type_tag) {
|
1203
|
+
case GI_TYPE_TAG_VOID:
|
1204
|
+
case GI_TYPE_TAG_BOOLEAN:
|
1205
|
+
case GI_TYPE_TAG_INT8:
|
1206
|
+
case GI_TYPE_TAG_UINT8:
|
1207
|
+
case GI_TYPE_TAG_INT16:
|
1208
|
+
case GI_TYPE_TAG_UINT16:
|
1209
|
+
case GI_TYPE_TAG_INT32:
|
1210
|
+
case GI_TYPE_TAG_UINT32:
|
1211
|
+
case GI_TYPE_TAG_INT64:
|
1212
|
+
case GI_TYPE_TAG_UINT64:
|
1213
|
+
case GI_TYPE_TAG_FLOAT:
|
1214
|
+
case GI_TYPE_TAG_DOUBLE:
|
1215
|
+
case GI_TYPE_TAG_GTYPE:
|
1216
|
+
rb_raise(rb_eNotImpError,
|
1217
|
+
"TODO: GIArgument(GHash)[%s][%s] -> Ruby",
|
1218
|
+
g_type_tag_to_string(data->key_type_tag),
|
1219
|
+
g_type_tag_to_string(data->value_type_tag));
|
1220
|
+
break;
|
1221
|
+
case GI_TYPE_TAG_UTF8:
|
1222
|
+
rb_value = CSTR2RVAL(value);
|
1223
|
+
break;
|
1207
1224
|
case GI_TYPE_TAG_FILENAME:
|
1208
1225
|
case GI_TYPE_TAG_ARRAY:
|
1226
|
+
rb_raise(rb_eNotImpError,
|
1227
|
+
"TODO: GIArgument(GHash)[%s][%s] -> Ruby",
|
1228
|
+
g_type_tag_to_string(data->key_type_tag),
|
1229
|
+
g_type_tag_to_string(data->value_type_tag));
|
1230
|
+
break;
|
1209
1231
|
case GI_TYPE_TAG_INTERFACE:
|
1232
|
+
{
|
1233
|
+
GIArgument value_argument;
|
1234
|
+
value_argument.v_pointer = value;
|
1235
|
+
rb_value = rb_gi_argument_to_ruby_interface(&value_argument,
|
1236
|
+
FALSE,
|
1237
|
+
data->value_type_info);
|
1238
|
+
}
|
1239
|
+
break;
|
1210
1240
|
case GI_TYPE_TAG_GLIST:
|
1211
1241
|
case GI_TYPE_TAG_GSLIST:
|
1212
1242
|
case GI_TYPE_TAG_GHASH:
|
1213
1243
|
case GI_TYPE_TAG_ERROR:
|
1214
1244
|
case GI_TYPE_TAG_UNICHAR:
|
1215
|
-
g_base_info_unref(key_type_info);
|
1216
|
-
g_base_info_unref(value_type_info);
|
1217
1245
|
rb_raise(rb_eNotImpError,
|
1218
1246
|
"TODO: GIArgument(GHash)[%s][%s] -> Ruby",
|
1219
|
-
g_type_tag_to_string(key_type_tag),
|
1220
|
-
g_type_tag_to_string(value_type_tag));
|
1247
|
+
g_type_tag_to_string(data->key_type_tag),
|
1248
|
+
g_type_tag_to_string(data->value_type_tag));
|
1221
1249
|
break;
|
1222
1250
|
default:
|
1223
|
-
g_base_info_unref(key_type_info);
|
1224
|
-
g_base_info_unref(value_type_info);
|
1225
1251
|
g_assert_not_reached();
|
1226
1252
|
break;
|
1227
1253
|
}
|
1228
1254
|
|
1229
|
-
|
1255
|
+
rb_hash_aset(data->rb_table, rb_key, rb_value);
|
1256
|
+
}
|
1257
|
+
|
1258
|
+
static VALUE
|
1259
|
+
rb_gi_argument_to_ruby_ghash_body(VALUE user_data)
|
1260
|
+
{
|
1261
|
+
GHashToRubyData *data = (GHashToRubyData *)user_data;
|
1262
|
+
|
1263
|
+
g_hash_table_foreach(data->argument->v_pointer,
|
1264
|
+
rb_gi_argument_to_ruby_ghash_foreach_body,
|
1265
|
+
data);
|
1266
|
+
|
1267
|
+
return data->rb_table;
|
1268
|
+
}
|
1269
|
+
|
1270
|
+
static VALUE
|
1271
|
+
rb_gi_argument_to_ruby_ghash_ensure(VALUE user_data)
|
1272
|
+
{
|
1273
|
+
GHashToRubyData *data = (GHashToRubyData *)user_data;
|
1274
|
+
|
1275
|
+
g_base_info_unref(data->key_type_info);
|
1276
|
+
g_base_info_unref(data->value_type_info);
|
1277
|
+
|
1278
|
+
return Qnil;
|
1279
|
+
}
|
1280
|
+
|
1281
|
+
static VALUE
|
1282
|
+
rb_gi_argument_to_ruby_ghash(GIArgument *argument, GITypeInfo *type_info)
|
1283
|
+
{
|
1284
|
+
GHashToRubyData data;
|
1285
|
+
|
1286
|
+
data.argument = argument;
|
1287
|
+
data.rb_table = rb_hash_new();
|
1288
|
+
|
1289
|
+
data.key_type_info = g_type_info_get_param_type(type_info, 0);
|
1290
|
+
data.key_type_tag = g_type_info_get_tag(data.key_type_info);
|
1291
|
+
|
1292
|
+
data.value_type_info = g_type_info_get_param_type(type_info, 1);
|
1293
|
+
data.value_type_tag = g_type_info_get_tag(data.value_type_info);
|
1294
|
+
|
1295
|
+
return rb_ensure(rb_gi_argument_to_ruby_ghash_body, (VALUE)&data,
|
1296
|
+
rb_gi_argument_to_ruby_ghash_ensure, (VALUE)&data);
|
1230
1297
|
}
|
1231
1298
|
|
1232
1299
|
static VALUE
|
@@ -2293,15 +2360,13 @@ rb_gi_return_argument_free_everything_array_c(GIArgument *argument,
|
|
2293
2360
|
|
2294
2361
|
switch (element_type_tag) {
|
2295
2362
|
case GI_TYPE_TAG_VOID:
|
2296
|
-
case GI_TYPE_TAG_BOOLEAN:
|
2297
|
-
case GI_TYPE_TAG_INT8:
|
2298
2363
|
rb_raise(rb_eNotImpError,
|
2299
2364
|
"TODO: free GIArgument(array)[c][%s] everything",
|
2300
2365
|
g_type_tag_to_string(element_type_tag));
|
2301
2366
|
break;
|
2367
|
+
case GI_TYPE_TAG_BOOLEAN:
|
2368
|
+
case GI_TYPE_TAG_INT8:
|
2302
2369
|
case GI_TYPE_TAG_UINT8:
|
2303
|
-
g_free(argument->v_pointer);
|
2304
|
-
break;
|
2305
2370
|
case GI_TYPE_TAG_INT16:
|
2306
2371
|
case GI_TYPE_TAG_UINT16:
|
2307
2372
|
case GI_TYPE_TAG_INT32:
|
@@ -2310,6 +2375,8 @@ rb_gi_return_argument_free_everything_array_c(GIArgument *argument,
|
|
2310
2375
|
case GI_TYPE_TAG_UINT64:
|
2311
2376
|
case GI_TYPE_TAG_FLOAT:
|
2312
2377
|
case GI_TYPE_TAG_DOUBLE:
|
2378
|
+
g_free(argument->v_pointer);
|
2379
|
+
break;
|
2313
2380
|
case GI_TYPE_TAG_GTYPE:
|
2314
2381
|
rb_raise(rb_eNotImpError,
|
2315
2382
|
"TODO: free GIArgument(array)[c][%s] everything",
|
@@ -2788,50 +2855,52 @@ rb_gi_return_argument_free_everything(GIArgument *argument,
|
|
2788
2855
|
|
2789
2856
|
type_tag = g_type_info_get_tag(type_info);
|
2790
2857
|
switch (type_tag) {
|
2791
|
-
|
2858
|
+
case GI_TYPE_TAG_VOID:
|
2792
2859
|
break;
|
2793
|
-
|
2794
|
-
|
2795
|
-
|
2796
|
-
|
2797
|
-
|
2798
|
-
|
2799
|
-
|
2800
|
-
|
2801
|
-
|
2802
|
-
|
2803
|
-
|
2804
|
-
|
2860
|
+
case GI_TYPE_TAG_BOOLEAN:
|
2861
|
+
case GI_TYPE_TAG_INT8:
|
2862
|
+
case GI_TYPE_TAG_UINT8:
|
2863
|
+
case GI_TYPE_TAG_INT16:
|
2864
|
+
case GI_TYPE_TAG_UINT16:
|
2865
|
+
case GI_TYPE_TAG_INT32:
|
2866
|
+
case GI_TYPE_TAG_UINT32:
|
2867
|
+
case GI_TYPE_TAG_INT64:
|
2868
|
+
case GI_TYPE_TAG_UINT64:
|
2869
|
+
case GI_TYPE_TAG_FLOAT:
|
2870
|
+
case GI_TYPE_TAG_DOUBLE:
|
2871
|
+
case GI_TYPE_TAG_GTYPE:
|
2805
2872
|
rb_raise(rb_eNotImpError,
|
2806
2873
|
"TODO: free GIArgument(%s) everything",
|
2807
2874
|
g_type_tag_to_string(type_tag));
|
2808
2875
|
break;
|
2809
|
-
|
2876
|
+
case GI_TYPE_TAG_UTF8:
|
2810
2877
|
g_free(argument->v_string);
|
2811
2878
|
break;
|
2812
|
-
|
2879
|
+
case GI_TYPE_TAG_FILENAME:
|
2813
2880
|
g_free(argument->v_string);
|
2814
2881
|
break;
|
2815
|
-
|
2882
|
+
case GI_TYPE_TAG_ARRAY:
|
2816
2883
|
rb_gi_return_argument_free_everything_array(argument, type_info);
|
2817
2884
|
break;
|
2818
|
-
|
2885
|
+
case GI_TYPE_TAG_INTERFACE:
|
2819
2886
|
rb_gi_return_argument_free_everything_interface(argument, type_info);
|
2820
2887
|
break;
|
2821
|
-
|
2888
|
+
case GI_TYPE_TAG_GLIST:
|
2822
2889
|
rb_gi_return_argument_free_everything_glist(argument, type_info);
|
2823
2890
|
break;
|
2824
|
-
|
2891
|
+
case GI_TYPE_TAG_GSLIST:
|
2825
2892
|
rb_gi_return_argument_free_everything_gslist(argument, type_info);
|
2826
2893
|
break;
|
2827
|
-
|
2828
|
-
|
2829
|
-
|
2894
|
+
case GI_TYPE_TAG_GHASH:
|
2895
|
+
g_hash_table_unref(argument->v_pointer);
|
2896
|
+
break;
|
2897
|
+
case GI_TYPE_TAG_ERROR:
|
2898
|
+
case GI_TYPE_TAG_UNICHAR:
|
2830
2899
|
rb_raise(rb_eNotImpError,
|
2831
2900
|
"TODO: free GIArgument(%s) everything",
|
2832
2901
|
g_type_tag_to_string(type_tag));
|
2833
2902
|
break;
|
2834
|
-
|
2903
|
+
default:
|
2835
2904
|
g_assert_not_reached();
|
2836
2905
|
break;
|
2837
2906
|
}
|
@@ -2957,7 +3026,16 @@ rb_gi_value_argument_from_ruby_interface(GIArgument *argument,
|
|
2957
3026
|
break;
|
2958
3027
|
case GI_INFO_TYPE_OBJECT:
|
2959
3028
|
case GI_INFO_TYPE_INTERFACE:
|
3029
|
+
gtype = g_registered_type_info_get_g_type(interface_info);
|
2960
3030
|
argument->v_pointer = RVAL2GOBJ(rb_argument);
|
3031
|
+
if (argument->v_pointer &&
|
3032
|
+
gtype != G_TYPE_NONE &&
|
3033
|
+
!G_TYPE_CHECK_INSTANCE_TYPE(argument->v_pointer, gtype)) {
|
3034
|
+
rb_raise(rb_eArgError,
|
3035
|
+
"must be <%s> object: <%" PRIsVALUE ">",
|
3036
|
+
g_type_name(gtype),
|
3037
|
+
rb_argument);
|
3038
|
+
}
|
2961
3039
|
break;
|
2962
3040
|
case GI_INFO_TYPE_CONSTANT:
|
2963
3041
|
rb_raise(rb_eNotImpError,
|
@@ -3007,9 +3085,16 @@ rb_gi_value_argument_from_ruby_glist(GIArgument *argument,
|
|
3007
3085
|
{
|
3008
3086
|
GITypeInfo *element_type_info;
|
3009
3087
|
GITypeTag element_type_tag;
|
3088
|
+
GType gtype = G_TYPE_NONE;
|
3010
3089
|
|
3011
3090
|
element_type_info = g_type_info_get_param_type(type_info, 0);
|
3012
3091
|
element_type_tag = g_type_info_get_tag(element_type_info);
|
3092
|
+
if (element_type_tag == GI_TYPE_TAG_INTERFACE) {
|
3093
|
+
GIBaseInfo *interface_info;
|
3094
|
+
interface_info = g_type_info_get_interface(element_type_info);
|
3095
|
+
gtype = g_registered_type_info_get_g_type(interface_info);
|
3096
|
+
g_base_info_unref(interface_info);
|
3097
|
+
}
|
3013
3098
|
g_base_info_unref(element_type_info);
|
3014
3099
|
|
3015
3100
|
switch (element_type_tag) {
|
@@ -3035,6 +3120,19 @@ rb_gi_value_argument_from_ruby_glist(GIArgument *argument,
|
|
3035
3120
|
break;
|
3036
3121
|
case GI_TYPE_TAG_INTERFACE:
|
3037
3122
|
argument->v_pointer = RVAL2GOBJGLIST(rb_argument);
|
3123
|
+
if (gtype != G_TYPE_NONE) {
|
3124
|
+
GList *node;
|
3125
|
+
for (node = argument->v_pointer; node; node = g_list_next(node)) {
|
3126
|
+
GObject *object = node->data;
|
3127
|
+
if (!G_TYPE_CHECK_INSTANCE_TYPE(object, gtype)) {
|
3128
|
+
g_list_free(argument->v_pointer);
|
3129
|
+
rb_raise(rb_eArgError,
|
3130
|
+
"must be <%s> objects: <%" PRIsVALUE ">",
|
3131
|
+
g_type_name(gtype),
|
3132
|
+
rb_argument);
|
3133
|
+
}
|
3134
|
+
}
|
3135
|
+
}
|
3038
3136
|
break;
|
3039
3137
|
case GI_TYPE_TAG_GLIST:
|
3040
3138
|
case GI_TYPE_TAG_GSLIST:
|
@@ -3059,9 +3157,16 @@ rb_gi_value_argument_from_ruby_gslist(GIArgument *argument,
|
|
3059
3157
|
{
|
3060
3158
|
GITypeInfo *element_type_info;
|
3061
3159
|
GITypeTag element_type_tag;
|
3160
|
+
GType gtype = G_TYPE_NONE;
|
3062
3161
|
|
3063
3162
|
element_type_info = g_type_info_get_param_type(type_info, 0);
|
3064
3163
|
element_type_tag = g_type_info_get_tag(element_type_info);
|
3164
|
+
if (element_type_tag == GI_TYPE_TAG_INTERFACE) {
|
3165
|
+
GIBaseInfo *interface_info;
|
3166
|
+
interface_info = g_type_info_get_interface(element_type_info);
|
3167
|
+
gtype = g_registered_type_info_get_g_type(interface_info);
|
3168
|
+
g_base_info_unref(interface_info);
|
3169
|
+
}
|
3065
3170
|
g_base_info_unref(element_type_info);
|
3066
3171
|
|
3067
3172
|
switch (element_type_tag) {
|
@@ -3087,6 +3192,19 @@ rb_gi_value_argument_from_ruby_gslist(GIArgument *argument,
|
|
3087
3192
|
break;
|
3088
3193
|
case GI_TYPE_TAG_INTERFACE:
|
3089
3194
|
argument->v_pointer = RVAL2GOBJGSLIST(rb_argument);
|
3195
|
+
if (gtype != G_TYPE_NONE) {
|
3196
|
+
GSList *node;
|
3197
|
+
for (node = argument->v_pointer; node; node = g_slist_next(node)) {
|
3198
|
+
GObject *object = node->data;
|
3199
|
+
if (!G_TYPE_CHECK_INSTANCE_TYPE(object, gtype)) {
|
3200
|
+
g_slist_free(argument->v_pointer);
|
3201
|
+
rb_raise(rb_eArgError,
|
3202
|
+
"must be <%s> objects: <%" PRIsVALUE ">",
|
3203
|
+
g_type_name(gtype),
|
3204
|
+
rb_argument);
|
3205
|
+
}
|
3206
|
+
}
|
3207
|
+
}
|
3090
3208
|
break;
|
3091
3209
|
case GI_TYPE_TAG_GLIST:
|
3092
3210
|
case GI_TYPE_TAG_GSLIST:
|
@@ -3766,7 +3884,6 @@ set_in_array_gtype_arguments_from_ruby(GIArgument *array_argument,
|
|
3766
3884
|
}
|
3767
3885
|
|
3768
3886
|
typedef struct {
|
3769
|
-
GType element_gtype;
|
3770
3887
|
GIStructInfo *struct_info;
|
3771
3888
|
VALUE rb_argument;
|
3772
3889
|
gint n_args;
|
@@ -3828,6 +3945,58 @@ set_in_array_interface_struct_arguments_from_ruby(GIArgument *array_argument,
|
|
3828
3945
|
array_argument->v_pointer = data.values;
|
3829
3946
|
}
|
3830
3947
|
|
3948
|
+
typedef struct {
|
3949
|
+
VALUE rb_argument;
|
3950
|
+
gint n_args;
|
3951
|
+
gpointer *values;
|
3952
|
+
} ArrayInterfaceObjectFromRubyData;
|
3953
|
+
|
3954
|
+
static VALUE
|
3955
|
+
set_in_array_interface_object_arguments_from_ruby_body(VALUE value)
|
3956
|
+
{
|
3957
|
+
ArrayInterfaceObjectFromRubyData *data;
|
3958
|
+
gint i;
|
3959
|
+
|
3960
|
+
data = (ArrayInterfaceObjectFromRubyData *)value;
|
3961
|
+
data->values = xmalloc(sizeof(gpointer) * data->n_args);
|
3962
|
+
|
3963
|
+
for (i = 0; i < data->n_args; i++) {
|
3964
|
+
VALUE rb_element;
|
3965
|
+
|
3966
|
+
rb_element = RARRAY_AREF(data->rb_argument, i);
|
3967
|
+
data->values[i] = RVAL2GOBJ(rb_element);
|
3968
|
+
}
|
3969
|
+
|
3970
|
+
return Qnil;
|
3971
|
+
}
|
3972
|
+
|
3973
|
+
static G_GNUC_NORETURN VALUE
|
3974
|
+
set_in_array_interface_object_arguments_from_ruby_rescue(VALUE value)
|
3975
|
+
{
|
3976
|
+
ArrayInterfaceObjectFromRubyData *data;
|
3977
|
+
|
3978
|
+
data = (ArrayInterfaceObjectFromRubyData *)value;
|
3979
|
+
xfree(data->values);
|
3980
|
+
|
3981
|
+
rb_exc_raise(rb_errinfo());
|
3982
|
+
}
|
3983
|
+
|
3984
|
+
static void
|
3985
|
+
set_in_array_interface_object_arguments_from_ruby(GIArgument *array_argument,
|
3986
|
+
VALUE rb_argument)
|
3987
|
+
{
|
3988
|
+
ArrayInterfaceObjectFromRubyData data;
|
3989
|
+
|
3990
|
+
data.rb_argument = rb_argument;
|
3991
|
+
data.n_args = RARRAY_LEN(rb_argument);
|
3992
|
+
data.values = NULL;
|
3993
|
+
rb_rescue(set_in_array_interface_object_arguments_from_ruby_body,
|
3994
|
+
(VALUE)&data,
|
3995
|
+
set_in_array_interface_object_arguments_from_ruby_rescue,
|
3996
|
+
(VALUE)&data);
|
3997
|
+
array_argument->v_pointer = data.values;
|
3998
|
+
}
|
3999
|
+
|
3831
4000
|
static void
|
3832
4001
|
set_in_array_interface_arguments_from_ruby(GIArgument *array_argument,
|
3833
4002
|
GITypeInfo *element_type_info,
|
@@ -3864,7 +4033,17 @@ set_in_array_interface_arguments_from_ruby(GIArgument *array_argument,
|
|
3864
4033
|
case GI_INFO_TYPE_BOXED:
|
3865
4034
|
case GI_INFO_TYPE_ENUM:
|
3866
4035
|
case GI_INFO_TYPE_FLAGS:
|
4036
|
+
interface_name = g_info_type_to_string(interface_type);
|
4037
|
+
g_base_info_unref(interface_info);
|
4038
|
+
rb_raise(rb_eNotImpError,
|
4039
|
+
"TODO: Ruby -> GIArgument(array)[interface(%s)](%s)",
|
4040
|
+
interface_name,
|
4041
|
+
g_type_name(gtype));
|
4042
|
+
break;
|
3867
4043
|
case GI_INFO_TYPE_OBJECT:
|
4044
|
+
set_in_array_interface_object_arguments_from_ruby(array_argument,
|
4045
|
+
rb_argument);
|
4046
|
+
break;
|
3868
4047
|
case GI_INFO_TYPE_INTERFACE:
|
3869
4048
|
case GI_INFO_TYPE_CONSTANT:
|
3870
4049
|
case GI_INFO_TYPE_INVALID_0:
|
@@ -47,6 +47,7 @@ struct RBGICallbackData_ {
|
|
47
47
|
RBGIArgMetadata *metadata;
|
48
48
|
VALUE rb_callback;
|
49
49
|
GObject *owner;
|
50
|
+
VALUE rb_owner;
|
50
51
|
};
|
51
52
|
|
52
53
|
static VALUE RG_TARGET_NAMESPACE;
|
@@ -338,6 +339,11 @@ rb_gi_callback_data_free(RBGICallbackData *callback_data)
|
|
338
339
|
rbgobj_object_remove_relative(rb_owner, callback_data->rb_callback);
|
339
340
|
}
|
340
341
|
}
|
342
|
+
if (callback_data->rb_owner) {
|
343
|
+
rbgobj_remove_relative(callback_data->rb_owner,
|
344
|
+
(ID)0,
|
345
|
+
callback_data->rb_callback);
|
346
|
+
}
|
341
347
|
xfree(callback_data->metadata);
|
342
348
|
xfree(callback_data);
|
343
349
|
}
|
@@ -1149,35 +1155,42 @@ in_callback_argument_from_ruby(RBGIArgMetadata *metadata,
|
|
1149
1155
|
|
1150
1156
|
if (closure_argument) {
|
1151
1157
|
RBGICallbackData *callback_data;
|
1152
|
-
VALUE rb_owner;
|
1158
|
+
VALUE rb_owner = self;
|
1159
|
+
static VALUE mGLibObject = Qnil;
|
1153
1160
|
|
1154
1161
|
callback_data = ALLOC(RBGICallbackData);
|
1155
1162
|
callback_data->callback = callback;
|
1156
1163
|
callback_data->metadata = metadata;
|
1157
1164
|
callback_data->rb_callback = rb_block_proc();
|
1158
|
-
if (NIL_P(
|
1159
|
-
|
1160
|
-
} else {
|
1161
|
-
rb_owner = self;
|
1165
|
+
if (NIL_P(mGLibObject)) {
|
1166
|
+
mGLibObject = rb_const_get(mGLib, rb_intern("Object"));
|
1162
1167
|
}
|
1163
|
-
{
|
1164
|
-
|
1165
|
-
|
1166
|
-
|
1167
|
-
|
1168
|
-
|
1169
|
-
|
1170
|
-
|
1171
|
-
|
1172
|
-
|
1173
|
-
|
1168
|
+
if (rb_obj_is_kind_of(rb_owner, mGLibObject)) {
|
1169
|
+
rbgobj_object_add_relative(rb_owner, callback_data->rb_callback);
|
1170
|
+
callback_data->owner = RVAL2GOBJ(rb_owner);
|
1171
|
+
g_object_weak_ref(callback_data->owner,
|
1172
|
+
rb_gi_callback_data_weak_notify,
|
1173
|
+
callback_data);
|
1174
|
+
callback_data->rb_owner = Qnil;
|
1175
|
+
} else {
|
1176
|
+
/* Callback is GC-ed only when callback is invalidated. */
|
1177
|
+
if (NIL_P(rb_owner)) {
|
1178
|
+
/* Module function case. */
|
1179
|
+
static VALUE rb_mGI = Qnil;
|
1180
|
+
if (NIL_P(rb_mGI)) {
|
1181
|
+
rb_mGI = rb_const_get(rb_cObject,
|
1182
|
+
rb_intern("GObjectIntrospection"));
|
1183
|
+
}
|
1184
|
+
rbgobj_add_relative(rb_mGI, callback_data->rb_callback);
|
1185
|
+
callback_data->rb_owner = rb_mGI;
|
1174
1186
|
} else {
|
1175
|
-
/* Class method case.
|
1187
|
+
/* Class method case. */
|
1176
1188
|
rbgobj_add_relative(rb_owner, callback_data->rb_callback);
|
1177
|
-
callback_data->
|
1189
|
+
callback_data->rb_owner = rb_owner;
|
1178
1190
|
}
|
1179
|
-
|
1191
|
+
callback_data->owner = NULL;
|
1180
1192
|
}
|
1193
|
+
closure_argument->v_pointer = callback_data;
|
1181
1194
|
}
|
1182
1195
|
|
1183
1196
|
if (destroy_argument) {
|
@@ -31,19 +31,7 @@ module GObjectIntrospection
|
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
-
|
35
|
-
vendor_dir = base_dir + "vendor" + "local"
|
36
|
-
vendor_bin_dir = vendor_dir + "bin"
|
37
|
-
GLib.prepend_dll_path(vendor_bin_dir)
|
38
|
-
begin
|
39
|
-
major, minor, _ = RUBY_VERSION.split(/\./)
|
40
|
-
require "#{major}.#{minor}/gobject_introspection.so"
|
41
|
-
rescue LoadError
|
42
|
-
require "gobject_introspection.so"
|
43
|
-
end
|
44
|
-
|
45
|
-
vendor_girepository_dir = vendor_dir + "lib" + "girepository-1.0"
|
46
|
-
GObjectIntrospection.prepend_typelib_path(vendor_girepository_dir)
|
34
|
+
require "gobject_introspection.so"
|
47
35
|
|
48
36
|
module GObjectIntrospection
|
49
37
|
LOG_DOMAIN = "GObjectIntrospection"
|
@@ -1,4 +1,4 @@
|
|
1
|
-
# Copyright (C) 2012-
|
1
|
+
# Copyright (C) 2012-2018 Ruby-GNOME2 Project Team
|
2
2
|
#
|
3
3
|
# This library is free software; you can redistribute it and/or
|
4
4
|
# modify it under the terms of the GNU Lesser General Public
|
@@ -365,13 +365,10 @@ module GObjectIntrospection
|
|
365
365
|
raise ArgumentError, "wrong number of arguments (#{detail})"
|
366
366
|
end
|
367
367
|
|
368
|
-
def
|
369
|
-
|
370
|
-
|
371
|
-
type = arg_info.type
|
372
|
-
case type.tag
|
368
|
+
def match_type?(type_info, value)
|
369
|
+
case type_info.tag
|
373
370
|
when TypeTag::BOOLEAN
|
374
|
-
|
371
|
+
value == true or value == false
|
375
372
|
when TypeTag::INT8,
|
376
373
|
TypeTag::UINT8,
|
377
374
|
TypeTag::INT16,
|
@@ -382,39 +379,41 @@ module GObjectIntrospection
|
|
382
379
|
TypeTag::UINT64,
|
383
380
|
TypeTag::FLOAT,
|
384
381
|
TypeTag::DOUBLE
|
385
|
-
|
382
|
+
value.is_a?(Numeric)
|
386
383
|
when TypeTag::GTYPE
|
387
|
-
|
384
|
+
value.is_a?(GLib::Type)
|
388
385
|
when TypeTag::UTF8
|
389
|
-
|
386
|
+
value.is_a?(String)
|
390
387
|
when TypeTag::FILENAME
|
391
|
-
|
388
|
+
value.is_a?(String)
|
392
389
|
when TypeTag::ARRAY
|
393
|
-
|
390
|
+
element_type_info = type_info.get_param_type(0)
|
391
|
+
value.is_a?(Array) and value.all? {|v| match_type?(element_type_info, v)}
|
394
392
|
when TypeTag::INTERFACE
|
395
|
-
interface =
|
393
|
+
interface = type_info.interface
|
396
394
|
case interface.type
|
397
395
|
when InfoType::STRUCT
|
398
|
-
|
396
|
+
match_type_interface_struct?(interface, value)
|
399
397
|
when InfoType::OBJECT,
|
400
398
|
InfoType::INTERFACE,
|
401
399
|
InfoType::FLAGS,
|
402
400
|
InfoType::ENUM
|
403
|
-
|
401
|
+
value.is_a?(interface.gtype.to_class)
|
404
402
|
else
|
405
403
|
# TODO
|
406
404
|
false
|
407
405
|
end
|
408
406
|
when TypeTag::GLIST,
|
409
407
|
TypeTag::GSLIST
|
410
|
-
|
408
|
+
element_type_info = type_info.get_param_type(0)
|
409
|
+
value.is_a?(Array) and value.all? {|v| match_type?(element_type_info, v)}
|
411
410
|
else
|
412
411
|
# TODO
|
413
412
|
false
|
414
413
|
end
|
415
414
|
end
|
416
415
|
|
417
|
-
def
|
416
|
+
def match_type_interface_struct?(interface, value)
|
418
417
|
gtype = interface.gtype
|
419
418
|
case gtype.name
|
420
419
|
when "void"
|
@@ -422,15 +421,21 @@ module GObjectIntrospection
|
|
422
421
|
false
|
423
422
|
when "CairoSurface"
|
424
423
|
if Object.const_defined?(:Cairo)
|
425
|
-
|
424
|
+
value.is_a?(Cairo::Surface)
|
426
425
|
else
|
427
426
|
false
|
428
427
|
end
|
429
428
|
else
|
430
|
-
|
429
|
+
value.is_a?(gtype.to_class)
|
431
430
|
end
|
432
431
|
end
|
433
432
|
|
433
|
+
def match_argument?(arg_info, argument)
|
434
|
+
return true if argument.nil? and arg_info.may_be_null?
|
435
|
+
|
436
|
+
match_type?(arg_info.type, argument)
|
437
|
+
end
|
438
|
+
|
434
439
|
def rubyish_method_name(function_info, options={})
|
435
440
|
name = function_info.name
|
436
441
|
if options[:prefix]
|
@@ -463,6 +468,36 @@ module GObjectIntrospection
|
|
463
468
|
else
|
464
469
|
name
|
465
470
|
end
|
471
|
+
when "not_equal"
|
472
|
+
if n_in_args == 1
|
473
|
+
"!="
|
474
|
+
else
|
475
|
+
name
|
476
|
+
end
|
477
|
+
when "less_than"
|
478
|
+
if n_in_args == 1
|
479
|
+
"<"
|
480
|
+
else
|
481
|
+
name
|
482
|
+
end
|
483
|
+
when "less_than_or_equal"
|
484
|
+
if n_in_args == 1
|
485
|
+
"<="
|
486
|
+
else
|
487
|
+
name
|
488
|
+
end
|
489
|
+
when "greater_than"
|
490
|
+
if n_in_args == 1
|
491
|
+
">"
|
492
|
+
else
|
493
|
+
name
|
494
|
+
end
|
495
|
+
when "greater_than_or_equal"
|
496
|
+
if n_in_args == 1
|
497
|
+
">="
|
498
|
+
else
|
499
|
+
name
|
500
|
+
end
|
466
501
|
when /\A(?:is|get_is|can_be)_/
|
467
502
|
"#{$POSTMATCH}?"
|
468
503
|
when /\Aget_/
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gobject-introspection
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.3.
|
4
|
+
version: 3.3.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- The Ruby-GNOME2 Project Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-01-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: glib2
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 3.3.
|
19
|
+
version: 3.3.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 3.3.
|
26
|
+
version: 3.3.1
|
27
27
|
description: Ruby/GObjectIntrospection provides bindings of GObject Introspection
|
28
28
|
and a loader module that can generate dynamically Ruby bindings of any GObject C
|
29
29
|
libraries
|
@@ -135,8 +135,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
135
135
|
- !ruby/object:Gem::Version
|
136
136
|
version: '0'
|
137
137
|
requirements: []
|
138
|
-
|
139
|
-
rubygems_version: 3.0.0.beta1
|
138
|
+
rubygems_version: 3.0.2
|
140
139
|
signing_key:
|
141
140
|
specification_version: 4
|
142
141
|
summary: Ruby/GObjectIntrospection is a Ruby binding of GObject Introspection.
|