gobject-introspection 3.2.5-x64-mingw32 → 3.2.6-x64-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.
- checksums.yaml +4 -4
- data/COPYING.LIB +502 -0
- data/README.md +24 -0
- data/Rakefile +7 -4
- data/ext/gobject-introspection/gobject_introspection.def +6 -1
- data/ext/gobject-introspection/rb-gi-argument.c +3 -1
- data/ext/gobject-introspection/rb-gi-constructor-info.c +3 -3
- data/ext/gobject-introspection/rb-gi-field-info.c +44 -8
- data/ext/gobject-introspection/rb-gi-function-info.c +45 -13
- data/ext/gobject-introspection/rb-gi-loader.c +10 -10
- data/ext/gobject-introspection/rb-gi-struct-info.c +82 -41
- data/ext/gobject-introspection/rb-gobject-introspection.h +12 -9
- data/gobject-introspection.gemspec +48 -0
- data/lib/2.2/gobject_introspection.so +0 -0
- data/lib/2.3/gobject_introspection.so +0 -0
- data/lib/2.4/gobject_introspection.so +0 -0
- data/lib/2.5/gobject_introspection.so +0 -0
- data/lib/gobject-introspection/loader.rb +4 -0
- data/vendor/local/bin/g-ir-compiler.exe +0 -0
- data/vendor/local/bin/g-ir-generate.exe +0 -0
- data/vendor/local/bin/g-ir-inspect.exe +0 -0
- data/vendor/local/bin/libgirepository-1.0-1.dll +0 -0
- data/vendor/local/lib/girepository-1.0/GLib-2.0.typelib +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/__init__.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/__init__.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/annotationmain.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/annotationmain.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/annotationparser.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/annotationparser.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/ast.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/ast.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/cachestore.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/cachestore.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/ccompiler.py +1 -1
- data/vendor/local/lib/gobject-introspection/giscanner/ccompiler.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/ccompiler.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/codegen.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/codegen.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/collections/__init__.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/collections/__init__.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/collections/counter.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/collections/counter.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/collections/ordereddict.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/collections/ordereddict.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/docmain.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/docmain.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/docwriter.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/docwriter.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/dumper.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/dumper.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/gdumpparser.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/gdumpparser.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/girparser.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/girparser.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/girwriter.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/girwriter.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/introspectablepass.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/introspectablepass.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/libtoolimporter.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/libtoolimporter.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/maintransformer.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/maintransformer.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/message.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/message.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/msvccompiler.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/msvccompiler.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/scannermain.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/scannermain.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/sectionparser.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/sectionparser.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/shlibs.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/shlibs.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/sourcescanner.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/sourcescanner.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/testcodegen.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/testcodegen.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/transformer.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/transformer.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/utils.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/utils.pyo +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/xmlwriter.pyc +0 -0
- data/vendor/local/lib/gobject-introspection/giscanner/xmlwriter.pyo +0 -0
- data/vendor/local/lib/libgirepository-1.0.a +0 -0
- data/vendor/local/lib/libgirepository-1.0.dll.a +0 -0
- data/vendor/local/lib/libgirepository-1.0.la +1 -1
- data/vendor/local/lib/pkgconfig/gobject-introspection-1.0.pc +1 -1
- data/vendor/local/lib/pkgconfig/gobject-introspection-no-export-1.0.pc +1 -1
- data/vendor/local/share/gir-1.0/GLib-2.0.gir +1 -1
- data/vendor/local/share/gir-1.0/Gio-2.0.gir +42 -17
- metadata +11 -34
data/README.md
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# Ruby/GObjectIntrospection
|
2
|
+
|
3
|
+
Ruby/GObjectIntrospection is a Ruby binding of GObject Introspect.
|
4
|
+
|
5
|
+
## Requirements
|
6
|
+
|
7
|
+
* Ruby/GLib2 in
|
8
|
+
[Ruby-GNOME2](https://ruby-gnome2.osdn.jp/)
|
9
|
+
* [GObject Introspection](http://live.gnome.org/GObjectIntrospection)
|
10
|
+
|
11
|
+
## Install
|
12
|
+
|
13
|
+
gem install gobject-introspection
|
14
|
+
|
15
|
+
## License
|
16
|
+
|
17
|
+
Copyright (c) 2013 Ruby-GNOME2 Project Team
|
18
|
+
|
19
|
+
This program is free software. You can distribute/modify this program
|
20
|
+
under the terms of the GNU LESSER GENERAL PUBLIC LICENSE Version 2.1.
|
21
|
+
|
22
|
+
## Project Website
|
23
|
+
|
24
|
+
https://ruby-gnome2.osdn.jp/
|
data/Rakefile
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# -*- ruby -*-
|
2
2
|
#
|
3
|
-
# Copyright (C) 2012-
|
3
|
+
# Copyright (C) 2012-2018 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
|
@@ -19,7 +19,10 @@
|
|
19
19
|
$LOAD_PATH.unshift("./../glib2/lib")
|
20
20
|
require "gnome2/rake/package-task"
|
21
21
|
|
22
|
-
|
22
|
+
package_name = File.basename(__dir__)
|
23
|
+
spec = Gem::Specification.load("#{package_name}.gemspec")
|
24
|
+
|
25
|
+
package_task = GNOME2::Rake::PackageTask.new(spec, __dir__) do |package|
|
23
26
|
package.summary = "Ruby/GObjectIntrospection is a Ruby binding of GObjectIntrospection."
|
24
27
|
package.description = "Ruby/GObjectIntrospection is a Ruby binding of GObjectIntrospection."
|
25
28
|
package.dependency.gem.runtime = ["glib2"]
|
@@ -32,7 +35,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
|
|
32
35
|
:name => "glib",
|
33
36
|
:download_site => :gnome,
|
34
37
|
:label => "GLib",
|
35
|
-
:version => "2.56.
|
38
|
+
:version => "2.56.1",
|
36
39
|
:compression_method => "xz",
|
37
40
|
:windows => {
|
38
41
|
:build => false,
|
@@ -47,7 +50,7 @@ package_task = GNOME2::Rake::PackageTask.new do |package|
|
|
47
50
|
:name => "gobject-introspection",
|
48
51
|
:download_site => :gnome,
|
49
52
|
:label => "gobject-introspection",
|
50
|
-
:version => "1.56.
|
53
|
+
:version => "1.56.1",
|
51
54
|
:compression_method => "xz",
|
52
55
|
:windows => {
|
53
56
|
:configure_args => [
|
@@ -22,6 +22,7 @@
|
|
22
22
|
|
23
23
|
static VALUE rb_cGLibValue = Qnil;
|
24
24
|
static VALUE rb_cGLibBytes = Qnil;
|
25
|
+
static VALUE rb_cGLibBoxed = Qnil;
|
25
26
|
|
26
27
|
static gboolean
|
27
28
|
rb_gi_arg_info_may_be_null(GIArgInfo *arg_info)
|
@@ -2883,7 +2884,7 @@ rb_gi_value_argument_from_ruby_interface(GIArgument *argument,
|
|
2883
2884
|
case GI_INFO_TYPE_STRUCT:
|
2884
2885
|
gtype = g_registered_type_info_get_g_type(interface_info);
|
2885
2886
|
if (gtype == G_TYPE_NONE) {
|
2886
|
-
argument->v_pointer =
|
2887
|
+
argument->v_pointer = rb_gi_struct_get_raw(rb_argument, gtype);
|
2887
2888
|
} else if (gtype == G_TYPE_VALUE) {
|
2888
2889
|
GValue *gvalue;
|
2889
2890
|
if (RVAL2CBOOL(rb_obj_is_kind_of(rb_argument, rb_cGLibValue))) {
|
@@ -4470,4 +4471,5 @@ rb_gi_argument_init(void)
|
|
4470
4471
|
{
|
4471
4472
|
rb_cGLibValue = rb_const_get(mGLib, rb_intern("Value"));
|
4472
4473
|
rb_cGLibBytes = rb_const_get(mGLib, rb_intern("Bytes"));
|
4474
|
+
rb_cGLibBoxed = rb_const_get(mGLib, rb_intern("Boxed"));
|
4473
4475
|
}
|
@@ -28,7 +28,7 @@ gi_constructor_info_get_type(void)
|
|
28
28
|
{
|
29
29
|
static GType type = 0;
|
30
30
|
if (type == 0) {
|
31
|
-
|
31
|
+
type = g_boxed_type_register_static("GIConstructorInfo",
|
32
32
|
(GBoxedCopyFunc)g_base_info_ref,
|
33
33
|
(GBoxedFreeFunc)g_base_info_unref);
|
34
34
|
}
|
@@ -141,9 +141,9 @@ rb_gi_constructor_info_init(VALUE rb_mGI, VALUE rb_cGIFunctionInfo)
|
|
141
141
|
VALUE RG_TARGET_NAMESPACE;
|
142
142
|
|
143
143
|
RG_TARGET_NAMESPACE =
|
144
|
-
|
144
|
+
G_DEF_CLASS_WITH_PARENT(GI_TYPE_CONSTRUCTOR_INFO,
|
145
145
|
"ConstructorInfo", rb_mGI,
|
146
|
-
|
146
|
+
rb_cGIFunctionInfo);
|
147
147
|
|
148
148
|
RG_DEF_METHOD(invoke, 2);
|
149
149
|
}
|
@@ -79,24 +79,36 @@ rb_gi_field_info_get_field_raw_interface(GIFieldInfo *info,
|
|
79
79
|
VALUE rb_field_value = Qnil;
|
80
80
|
GIBaseInfo *interface_info;
|
81
81
|
GIInfoType interface_type;
|
82
|
+
GType gtype;
|
83
|
+
gint offset;
|
82
84
|
|
83
85
|
interface_info = g_type_info_get_interface(type_info);
|
84
86
|
interface_type = g_base_info_get_type(interface_info);
|
87
|
+
gtype = g_registered_type_info_get_g_type(interface_info);
|
88
|
+
offset = g_field_info_get_offset(info);
|
85
89
|
switch (interface_type) {
|
86
90
|
case GI_INFO_TYPE_INVALID:
|
87
91
|
case GI_INFO_TYPE_FUNCTION:
|
88
92
|
case GI_INFO_TYPE_CALLBACK:
|
93
|
+
rb_raise(rb_eNotImpError,
|
94
|
+
"TODO: GIField(interface)[%s](%s)",
|
95
|
+
g_info_type_to_string(interface_type),
|
96
|
+
g_type_name(gtype));
|
89
97
|
break;
|
90
98
|
case GI_INFO_TYPE_STRUCT:
|
91
99
|
{
|
92
100
|
GIStructInfo *struct_info = (GIStructInfo *)interface_info;
|
93
|
-
|
101
|
+
gboolean is_pointer;
|
102
|
+
gpointer target;
|
94
103
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
(
|
99
|
-
|
104
|
+
is_pointer = g_type_info_is_pointer(type_info);
|
105
|
+
target = (gpointer)((guint8 *)memory + offset);
|
106
|
+
if (is_pointer) {
|
107
|
+
target = *((gpointer *)target);
|
108
|
+
}
|
109
|
+
rb_field_value = rb_gi_struct_info_to_ruby(struct_info,
|
110
|
+
target,
|
111
|
+
is_pointer);
|
100
112
|
break;
|
101
113
|
}
|
102
114
|
case GI_INFO_TYPE_BOXED:
|
@@ -104,16 +116,36 @@ rb_gi_field_info_get_field_raw_interface(GIFieldInfo *info,
|
|
104
116
|
case GI_INFO_TYPE_OBJECT:
|
105
117
|
{
|
106
118
|
GIArgument argument;
|
107
|
-
gint offset;
|
108
119
|
|
109
|
-
offset = g_field_info_get_offset(info);
|
110
120
|
argument.v_pointer = G_STRUCT_MEMBER(gpointer, memory, offset);
|
111
121
|
rb_field_value = GI_ARGUMENT2RVAL(&argument, FALSE, type_info,
|
112
122
|
NULL, NULL, NULL);
|
113
123
|
}
|
114
124
|
break;
|
115
125
|
case GI_INFO_TYPE_ENUM:
|
126
|
+
{
|
127
|
+
gint32 raw_value;
|
128
|
+
|
129
|
+
raw_value = G_STRUCT_MEMBER(gint32, memory, offset);
|
130
|
+
if (gtype == G_TYPE_NONE) {
|
131
|
+
rb_field_value = INT2NUM(raw_value);
|
132
|
+
} else {
|
133
|
+
rb_field_value = GENUM2RVAL(raw_value, gtype);
|
134
|
+
}
|
135
|
+
}
|
136
|
+
break;
|
116
137
|
case GI_INFO_TYPE_FLAGS:
|
138
|
+
{
|
139
|
+
gint32 raw_value;
|
140
|
+
|
141
|
+
raw_value = G_STRUCT_MEMBER(gint32, memory, offset);
|
142
|
+
if (gtype == G_TYPE_NONE) {
|
143
|
+
rb_field_value = INT2NUM(raw_value);
|
144
|
+
} else {
|
145
|
+
rb_field_value = GFLAGS2RVAL(raw_value, gtype);
|
146
|
+
}
|
147
|
+
}
|
148
|
+
break;
|
117
149
|
case GI_INFO_TYPE_INTERFACE:
|
118
150
|
case GI_INFO_TYPE_CONSTANT:
|
119
151
|
case GI_INFO_TYPE_INVALID_0:
|
@@ -125,6 +157,10 @@ rb_gi_field_info_get_field_raw_interface(GIFieldInfo *info,
|
|
125
157
|
case GI_INFO_TYPE_ARG:
|
126
158
|
case GI_INFO_TYPE_TYPE:
|
127
159
|
case GI_INFO_TYPE_UNRESOLVED:
|
160
|
+
rb_raise(rb_eNotImpError,
|
161
|
+
"TODO: GIField(interface)[%s](%s)",
|
162
|
+
g_info_type_to_string(interface_type),
|
163
|
+
g_type_name(gtype));
|
128
164
|
break;
|
129
165
|
default:
|
130
166
|
break;
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
2
|
/*
|
3
|
-
* Copyright (C) 2012-
|
3
|
+
* Copyright (C) 2012-2018 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
|
@@ -42,6 +42,12 @@ typedef struct _RBGICallback {
|
|
42
42
|
ffi_closure *closure;
|
43
43
|
} RBGICallback;
|
44
44
|
|
45
|
+
struct RBGICallbackData_ {
|
46
|
+
RBGICallback *callback;
|
47
|
+
RBGIArgMetadata *metadata;
|
48
|
+
VALUE rb_callback;
|
49
|
+
};
|
50
|
+
|
45
51
|
static VALUE RG_TARGET_NAMESPACE;
|
46
52
|
static VALUE rb_cGLibError;
|
47
53
|
static const char *callbacks_key = "gi_callbacks";
|
@@ -300,22 +306,13 @@ fill_metadata(GPtrArray *args_metadata, GICallableInfo *info)
|
|
300
306
|
static void
|
301
307
|
callback_data_guard_from_gc(RBGICallbackData *callback_data)
|
302
308
|
{
|
303
|
-
|
304
|
-
|
305
|
-
rb_callbacks = rb_iv_get(RG_TARGET_NAMESPACE, callbacks_key);
|
306
|
-
callback_data->rb_gc_guard_key = rb_class_new_instance(0, NULL, rb_cObject);
|
307
|
-
rb_hash_aset(rb_callbacks,
|
308
|
-
callback_data->rb_gc_guard_key,
|
309
|
-
callback_data->rb_callback);
|
309
|
+
rbg_gc_guard(callback_data, callback_data->rb_callback);
|
310
310
|
}
|
311
311
|
|
312
312
|
static void
|
313
313
|
callback_data_unguard_from_gc(RBGICallbackData *callback_data)
|
314
314
|
{
|
315
|
-
|
316
|
-
|
317
|
-
rb_callbacks = rb_iv_get(RG_TARGET_NAMESPACE, callbacks_key);
|
318
|
-
rb_hash_delete(rb_callbacks, callback_data->rb_gc_guard_key);
|
315
|
+
rbg_gc_unguard(callback_data);
|
319
316
|
}
|
320
317
|
|
321
318
|
static void
|
@@ -339,6 +336,18 @@ rb_gi_callback_data_free(RBGICallbackData *callback_data)
|
|
339
336
|
xfree(callback_data);
|
340
337
|
}
|
341
338
|
|
339
|
+
RBGIArgMetadata *
|
340
|
+
rb_gi_callback_data_get_metadata(RBGICallbackData *callback_data)
|
341
|
+
{
|
342
|
+
return callback_data->metadata;
|
343
|
+
}
|
344
|
+
|
345
|
+
VALUE
|
346
|
+
rb_gi_callback_data_get_rb_callback(RBGICallbackData *callback_data)
|
347
|
+
{
|
348
|
+
return callback_data->rb_callback;
|
349
|
+
}
|
350
|
+
|
342
351
|
static void
|
343
352
|
destroy_notify(gpointer data)
|
344
353
|
{
|
@@ -1023,6 +1032,29 @@ ffi_closure_callback(G_GNUC_UNUSED ffi_cif *cif,
|
|
1023
1032
|
callback_data = *((RBGICallbackData **)(raw_args[i]));
|
1024
1033
|
break;
|
1025
1034
|
}
|
1035
|
+
|
1036
|
+
if (!callback_data && args_metadata->len > 0) {
|
1037
|
+
RBGIArgMetadata *metadata;
|
1038
|
+
GIArgInfo *arg_info;
|
1039
|
+
GITypeInfo *type_info;
|
1040
|
+
GITypeTag type_tag;
|
1041
|
+
gboolean is_pointer;
|
1042
|
+
const gchar *arg_name;
|
1043
|
+
|
1044
|
+
i = args_metadata->len - 1;
|
1045
|
+
metadata = g_ptr_array_index(args_metadata, i);
|
1046
|
+
arg_info = &(metadata->arg_info);
|
1047
|
+
type_info = g_arg_info_get_type(arg_info);
|
1048
|
+
type_tag = g_type_info_get_tag(type_info);
|
1049
|
+
is_pointer = g_type_info_is_pointer(type_info);
|
1050
|
+
g_base_info_unref(type_info);
|
1051
|
+
arg_name = g_base_info_get_name(arg_info);
|
1052
|
+
if (type_tag == GI_TYPE_TAG_VOID &&
|
1053
|
+
is_pointer &&
|
1054
|
+
strcmp(arg_name, "data") == 0) {
|
1055
|
+
callback_data = *((RBGICallbackData **)(raw_args[i]));
|
1056
|
+
}
|
1057
|
+
}
|
1026
1058
|
}
|
1027
1059
|
|
1028
1060
|
{
|
@@ -1421,7 +1453,7 @@ rb_gi_function_info_invoke_raw(GIFunctionInfo *info,
|
|
1421
1453
|
object_class = g_type_class_ref(CLASS2GTYPE(rb_receiver));
|
1422
1454
|
receiver.v_pointer = object_class;
|
1423
1455
|
} else {
|
1424
|
-
receiver.v_pointer =
|
1456
|
+
receiver.v_pointer = rb_gi_struct_get_raw(rb_receiver, G_TYPE_NONE);
|
1425
1457
|
}
|
1426
1458
|
}
|
1427
1459
|
rb_arguments = rbg_to_array(rb_arguments);
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
2
|
/*
|
3
|
-
* Copyright (C) 2012-
|
3
|
+
* Copyright (C) 2012-2018 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
|
@@ -58,23 +58,23 @@ rg_s_define_interface(G_GNUC_UNUSED VALUE klass,
|
|
58
58
|
return G_DEF_INTERFACE(gtype, RVAL2CSTR(rb_name), rb_module);
|
59
59
|
}
|
60
60
|
|
61
|
-
static void
|
62
|
-
struct_free(void *pointer)
|
63
|
-
{
|
64
|
-
xfree(pointer);
|
65
|
-
}
|
66
|
-
|
67
61
|
static VALUE
|
68
62
|
struct_alloc(VALUE klass)
|
69
63
|
{
|
70
64
|
VALUE rb_size;
|
71
65
|
size_t size;
|
72
66
|
gpointer instance;
|
67
|
+
gboolean is_owned;
|
73
68
|
|
74
69
|
rb_size = rb_iv_get(klass, "@size");
|
75
|
-
|
76
|
-
|
77
|
-
|
70
|
+
if (NIL_P(rb_size)) {
|
71
|
+
is_owned = FALSE;
|
72
|
+
} else {
|
73
|
+
size = NUM2ULONG(rb_size);
|
74
|
+
instance = xcalloc(1, size);
|
75
|
+
is_owned = TRUE;
|
76
|
+
}
|
77
|
+
return rb_gi_struct_new_raw(klass, instance, is_owned);
|
78
78
|
}
|
79
79
|
|
80
80
|
static VALUE
|
@@ -1,6 +1,6 @@
|
|
1
1
|
/* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
|
2
2
|
/*
|
3
|
-
* Copyright (C) 2012-
|
3
|
+
* Copyright (C) 2012-2018 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
|
@@ -35,6 +35,72 @@ gi_struct_info_get_type(void)
|
|
35
35
|
return type;
|
36
36
|
}
|
37
37
|
|
38
|
+
typedef struct {
|
39
|
+
gpointer instance;
|
40
|
+
gboolean is_owned;
|
41
|
+
} RBGIStructData;
|
42
|
+
|
43
|
+
static void
|
44
|
+
struct_free(void *data)
|
45
|
+
{
|
46
|
+
RBGIStructData *struct_data = data;
|
47
|
+
if (struct_data->is_owned) {
|
48
|
+
xfree(struct_data->instance);
|
49
|
+
}
|
50
|
+
xfree(struct_data);
|
51
|
+
}
|
52
|
+
|
53
|
+
static const rb_data_type_t rb_gi_struct_type = {
|
54
|
+
"GObjectIntrospection::Struct",
|
55
|
+
{
|
56
|
+
NULL,
|
57
|
+
struct_free,
|
58
|
+
NULL,
|
59
|
+
},
|
60
|
+
NULL,
|
61
|
+
NULL,
|
62
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
63
|
+
};
|
64
|
+
|
65
|
+
VALUE
|
66
|
+
rb_gi_struct_new_raw(VALUE klass, gpointer instance, gboolean is_owned)
|
67
|
+
{
|
68
|
+
RBGIStructData *data;
|
69
|
+
data = RB_ALLOC(RBGIStructData);
|
70
|
+
data->instance = instance;
|
71
|
+
data->is_owned = is_owned;
|
72
|
+
return TypedData_Wrap_Struct(klass, &rb_gi_struct_type, data);
|
73
|
+
}
|
74
|
+
|
75
|
+
gpointer
|
76
|
+
rb_gi_struct_get_raw(VALUE rb_struct, GType gtype)
|
77
|
+
{
|
78
|
+
gpointer raw_struct;
|
79
|
+
|
80
|
+
if (gtype == G_TYPE_NONE) {
|
81
|
+
VALUE rb_struct_class;
|
82
|
+
|
83
|
+
rb_struct_class = rb_class_of(rb_struct);
|
84
|
+
if (rb_respond_to(rb_struct_class, rb_intern("gtype"))) {
|
85
|
+
VALUE rb_gtype;
|
86
|
+
rb_gtype = rb_funcall(rb_struct_class, rb_intern("gtype"), 0);
|
87
|
+
gtype = NUM2ULONG(rb_funcall(rb_gtype, rb_intern("to_i"), 0));
|
88
|
+
}
|
89
|
+
}
|
90
|
+
if (gtype == G_TYPE_NONE) {
|
91
|
+
RBGIStructData *data;
|
92
|
+
TypedData_Get_Struct(rb_struct,
|
93
|
+
RBGIStructData,
|
94
|
+
&rb_gi_struct_type,
|
95
|
+
data);
|
96
|
+
raw_struct = data->instance;
|
97
|
+
} else {
|
98
|
+
raw_struct = RVAL2BOXED(rb_struct, gtype);
|
99
|
+
}
|
100
|
+
|
101
|
+
return raw_struct;
|
102
|
+
}
|
103
|
+
|
38
104
|
VALUE
|
39
105
|
rb_gi_struct_info_to_ruby(GIStructInfo *info,
|
40
106
|
gpointer object,
|
@@ -47,15 +113,13 @@ rb_gi_struct_info_to_ruby(GIStructInfo *info,
|
|
47
113
|
const char *name;
|
48
114
|
VALUE rb_module;
|
49
115
|
VALUE rb_class;
|
50
|
-
gpointer target_object = object;
|
51
|
-
RUBY_DATA_FUNC free_func = NULL;
|
52
116
|
|
53
117
|
gtype = g_registered_type_info_get_g_type(registered_type_info);
|
54
118
|
if (gtype == G_TYPE_VARIANT) {
|
55
119
|
GVariant *variant = object;
|
56
120
|
return rbg_variant_to_ruby(variant);
|
57
121
|
} else if (gtype != G_TYPE_NONE) {
|
58
|
-
return BOXED2RVAL(
|
122
|
+
return BOXED2RVAL(object, gtype);
|
59
123
|
}
|
60
124
|
|
61
125
|
namespace = g_base_info_get_namespace(base_info);
|
@@ -68,7 +132,7 @@ rb_gi_struct_info_to_ruby(GIStructInfo *info,
|
|
68
132
|
gtype_name = g_strdup_printf("Cairo%s", name);
|
69
133
|
gtype = g_type_from_name(gtype_name);
|
70
134
|
g_free(gtype_name);
|
71
|
-
return BOXED2RVAL(
|
135
|
+
return BOXED2RVAL(object, gtype);
|
72
136
|
}
|
73
137
|
|
74
138
|
rb_module = rb_const_get(rb_cObject, rb_intern(namespace));
|
@@ -79,18 +143,21 @@ rb_gi_struct_info_to_ruby(GIStructInfo *info,
|
|
79
143
|
|
80
144
|
rb_gtype = rb_funcall(rb_class, rb_intern("gtype"), 0);
|
81
145
|
gtype = NUM2ULONG(rb_funcall(rb_gtype, rb_intern("to_i"), 0));
|
82
|
-
return BOXED2RVAL(
|
146
|
+
return BOXED2RVAL(object, gtype);
|
83
147
|
}
|
84
148
|
|
85
|
-
if (
|
149
|
+
if (is_pointer) {
|
150
|
+
return rb_gi_struct_new_raw(rb_class, object, FALSE);
|
151
|
+
} else {
|
86
152
|
size_t object_size;
|
153
|
+
gpointer copied_object;
|
154
|
+
|
87
155
|
object_size = g_struct_info_get_size(info);
|
88
|
-
|
89
|
-
memcpy(
|
90
|
-
free_func = xfree;
|
91
|
-
}
|
156
|
+
copied_object = xmalloc(object_size);
|
157
|
+
memcpy(copied_object, object, object_size);
|
92
158
|
|
93
|
-
|
159
|
+
return rb_gi_struct_new_raw(rb_class, copied_object, TRUE);
|
160
|
+
}
|
94
161
|
}
|
95
162
|
|
96
163
|
gpointer
|
@@ -100,11 +167,7 @@ rb_gi_struct_info_from_ruby(GIStructInfo *info, VALUE rb_object)
|
|
100
167
|
GType gtype;
|
101
168
|
|
102
169
|
gtype = g_registered_type_info_get_g_type(registerd_type_info);
|
103
|
-
|
104
|
-
return DATA_PTR(rb_object);
|
105
|
-
} else {
|
106
|
-
return RVAL2BOXED(rb_object, gtype);
|
107
|
-
}
|
170
|
+
return rb_gi_struct_get_raw(rb_object, gtype);
|
108
171
|
}
|
109
172
|
|
110
173
|
static VALUE
|
@@ -127,28 +190,6 @@ rg_get_field(VALUE self, VALUE rb_n)
|
|
127
190
|
return GI_BASE_INFO2RVAL_WITH_UNREF(g_struct_info_get_field(info, n));
|
128
191
|
}
|
129
192
|
|
130
|
-
static gpointer
|
131
|
-
extract_raw_struct(VALUE rb_struct,
|
132
|
-
GIStructInfo *struct_info)
|
133
|
-
{
|
134
|
-
GType gtype;
|
135
|
-
gpointer raw_struct;
|
136
|
-
|
137
|
-
gtype = g_registered_type_info_get_g_type(struct_info);
|
138
|
-
if (gtype == G_TYPE_NONE && rb_respond_to(rb_struct, rb_intern("gtype"))) {
|
139
|
-
VALUE rb_gtype;
|
140
|
-
rb_gtype = rb_funcall(rb_struct, rb_intern("gtype"), 0);
|
141
|
-
gtype = NUM2ULONG(rb_funcall(rb_gtype, rb_intern("to_i"), 0));
|
142
|
-
}
|
143
|
-
if (gtype == G_TYPE_NONE) {
|
144
|
-
raw_struct = DATA_PTR(rb_struct);
|
145
|
-
} else {
|
146
|
-
raw_struct = RVAL2BOXED(rb_struct, gtype);
|
147
|
-
}
|
148
|
-
|
149
|
-
return raw_struct;
|
150
|
-
}
|
151
|
-
|
152
193
|
static VALUE
|
153
194
|
rg_get_field_value(VALUE self, VALUE rb_struct, VALUE rb_n)
|
154
195
|
{
|
@@ -159,7 +200,7 @@ rg_get_field_value(VALUE self, VALUE rb_struct, VALUE rb_n)
|
|
159
200
|
VALUE rb_value;
|
160
201
|
|
161
202
|
info = SELF(self);
|
162
|
-
raw_struct =
|
203
|
+
raw_struct = rb_gi_struct_info_from_ruby(info, rb_struct);
|
163
204
|
n = NUM2INT(rb_n);
|
164
205
|
field_info = g_struct_info_get_field(info, n);
|
165
206
|
rb_value = rb_gi_field_info_get_field_raw(field_info, raw_struct);
|
@@ -177,7 +218,7 @@ rg_set_field_value(VALUE self, VALUE rb_struct, VALUE rb_n, VALUE rb_value)
|
|
177
218
|
GIFieldInfo *field_info;
|
178
219
|
|
179
220
|
info = SELF(self);
|
180
|
-
raw_struct =
|
221
|
+
raw_struct = rb_gi_struct_info_from_ruby(info, rb_struct);
|
181
222
|
n = NUM2INT(rb_n);
|
182
223
|
field_info = g_struct_info_get_field(info, n);
|
183
224
|
rb_gi_field_info_set_field_raw(field_info, raw_struct, rb_value);
|