gir_ffi 0.8.6 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changelog.md +18 -0
- data/README.md +3 -4
- data/lib/ffi-glib.rb +1 -0
- data/lib/ffi-glib/container_class_methods.rb +12 -0
- data/lib/ffi-glib/destroy_notify.rb +15 -0
- data/lib/ffi-glib/main_loop.rb +23 -4
- data/lib/ffi-gobject.rb +4 -2
- data/lib/ffi-gobject/object.rb +31 -16
- data/lib/ffi-gobject/object_class.rb +4 -0
- data/lib/ffi-gobject/value.rb +3 -3
- data/lib/ffi-gobject_introspection/i_flags_info.rb +0 -1
- data/lib/gir_ffi-base/gobject/lib.rb +10 -0
- data/lib/gir_ffi/arg_helper.rb +1 -22
- data/lib/gir_ffi/boxed_base.rb +1 -0
- data/lib/gir_ffi/builder.rb +7 -1
- data/lib/gir_ffi/builders/argument_builder.rb +21 -9
- data/lib/gir_ffi/builders/argument_builder_collection.rb +28 -9
- data/lib/gir_ffi/builders/base_argument_builder.rb +36 -12
- data/lib/gir_ffi/builders/base_method_builder.rb +1 -1
- data/lib/gir_ffi/builders/callback_argument_builder.rb +4 -0
- data/lib/gir_ffi/builders/closure_to_pointer_convertor.rb +3 -2
- data/lib/gir_ffi/builders/constructor_builder.rb +1 -1
- data/lib/gir_ffi/builders/enum_builder.rb +4 -4
- data/lib/gir_ffi/builders/error_argument_builder.rb +4 -0
- data/lib/gir_ffi/builders/field_builder.rb +23 -9
- data/lib/gir_ffi/builders/flags_builder.rb +28 -0
- data/lib/gir_ffi/builders/full_c_to_ruby_convertor.rb +18 -0
- data/lib/gir_ffi/builders/module_builder.rb +1 -0
- data/lib/gir_ffi/builders/null_argument_builder.rb +9 -1
- data/lib/gir_ffi/builders/object_builder.rb +7 -4
- data/lib/gir_ffi/builders/property_builder.rb +2 -2
- data/lib/gir_ffi/builders/return_value_builder.rb +4 -4
- data/lib/gir_ffi/builders/struct_builder.rb +10 -2
- data/lib/gir_ffi/builders/type_builder.rb +12 -9
- data/lib/gir_ffi/builders/unintrospectable_boxed_builder.rb +26 -0
- data/lib/gir_ffi/builders/user_defined_builder.rb +2 -2
- data/lib/gir_ffi/builders/with_layout.rb +1 -1
- data/lib/gir_ffi/callback_base.rb +13 -5
- data/lib/gir_ffi/core.rb +1 -0
- data/lib/gir_ffi/error_argument_info.rb +4 -0
- data/lib/gir_ffi/flags_base.rb +63 -0
- data/lib/gir_ffi/in_pointer.rb +1 -3
- data/lib/gir_ffi/info_ext/i_type_info.rb +6 -0
- data/lib/gir_ffi/object_base.rb +9 -1
- data/lib/gir_ffi/object_store.rb +26 -0
- data/lib/gir_ffi/unintrospectable_boxed_info.rb +31 -0
- data/lib/gir_ffi/unintrospectable_type_info.rb +5 -0
- data/lib/gir_ffi/user_defined_type_info.rb +19 -0
- data/lib/gir_ffi/version.rb +1 -1
- data/test/ffi-glib/destroy_notify_test.rb +13 -0
- data/test/ffi-glib/main_loop_test.rb +3 -3
- data/test/ffi-gobject/object_class_test.rb +8 -0
- data/test/ffi-gobject/object_test.rb +23 -5
- data/test/ffi-gobject/value_test.rb +19 -5
- data/test/ffi-gobject_test.rb +2 -2
- data/test/gir_ffi/builders/argument_builder_test.rb +12 -2
- data/test/gir_ffi/builders/constructor_builder_test.rb +4 -4
- data/test/gir_ffi/builders/function_builder_test.rb +46 -3
- data/test/gir_ffi/builders/object_builder_test.rb +25 -0
- data/test/gir_ffi/builders/property_builder_test.rb +4 -4
- data/test/gir_ffi/builders/struct_builder_test.rb +15 -13
- data/test/gir_ffi/builders/unintrospectable_boxed_builder_test.rb +33 -0
- data/test/gir_ffi/builders/unintrospectable_builder_test.rb +6 -0
- data/test/gir_ffi/builders/user_defined_builder_test.rb +7 -1
- data/test/gir_ffi/callback_base_test.rb +12 -2
- data/test/gir_ffi/object_base_test.rb +14 -0
- data/test/integration/callback_exceptions_test.rb +61 -0
- data/test/integration/generated_gimarshallingtests_test.rb +70 -70
- data/test/integration/generated_gio_test.rb +1 -1
- data/test/integration/generated_gobject_test.rb +1 -1
- data/test/integration/generated_gtop_test.rb +5 -1
- data/test/integration/generated_regress_test.rb +83 -102
- data/test/integration/generated_warnlib_test.rb +2 -2
- metadata +42 -4
@@ -1,14 +1,16 @@
|
|
1
1
|
module GirFFI
|
2
2
|
module Builders
|
3
|
-
# Class representing the argument and return value builders for a
|
4
|
-
# mapping function or marshaller. Implements collecting the
|
5
|
-
# and parameter and variable names for use by function
|
3
|
+
# Class representing the argument and return value builders for a method,
|
4
|
+
# callback mapping function or marshaller. Implements collecting the
|
5
|
+
# conversion code and parameter and variable names for use by function
|
6
|
+
# builders.
|
6
7
|
class ArgumentBuilderCollection
|
7
8
|
attr_reader :return_value_builder
|
8
9
|
|
9
|
-
def initialize(return_value_builder, argument_builders,
|
10
|
-
|
11
|
-
@
|
10
|
+
def initialize(return_value_builder, argument_builders,
|
11
|
+
receiver_builder: nil, error_argument_builder: nil)
|
12
|
+
@receiver_builder = receiver_builder
|
13
|
+
@error_argument_builder = error_argument_builder
|
12
14
|
@base_argument_builders = argument_builders
|
13
15
|
@return_value_builder = return_value_builder
|
14
16
|
set_up_argument_relations
|
@@ -32,7 +34,21 @@ module GirFFI
|
|
32
34
|
end
|
33
35
|
|
34
36
|
def method_argument_names
|
35
|
-
@method_argument_names ||=
|
37
|
+
@method_argument_names ||=
|
38
|
+
begin
|
39
|
+
base = []
|
40
|
+
block = nil
|
41
|
+
argument_builders.each do |it|
|
42
|
+
name = it.method_argument_name
|
43
|
+
if !block && it.block_argument?
|
44
|
+
block = "&#{name}"
|
45
|
+
else
|
46
|
+
base << name
|
47
|
+
end
|
48
|
+
end
|
49
|
+
base << block if block
|
50
|
+
base.compact
|
51
|
+
end
|
36
52
|
end
|
37
53
|
|
38
54
|
def return_value_name
|
@@ -58,8 +74,11 @@ module GirFFI
|
|
58
74
|
|
59
75
|
def set_up_argument_relations
|
60
76
|
@base_argument_builders.each do |bldr|
|
61
|
-
if (idx = bldr.
|
62
|
-
@base_argument_builders[idx].closure =
|
77
|
+
if (idx = bldr.closure_idx) >= 0
|
78
|
+
@base_argument_builders[idx].closure = bldr
|
79
|
+
end
|
80
|
+
if (idx = bldr.destroy_idx) >= 0
|
81
|
+
@base_argument_builders[idx].mark_as_destroy_notifier bldr
|
63
82
|
end
|
64
83
|
end
|
65
84
|
all_builders.each do |bldr|
|
@@ -15,23 +15,13 @@ module GirFFI
|
|
15
15
|
attr_reader :arginfo
|
16
16
|
attr_accessor :length_arg, :array_arg
|
17
17
|
|
18
|
-
# TODO: closure unfortunately means two things in GLib: a closure
|
19
|
-
# argument (user_data), and the Closure class (a callable object). Make
|
20
|
-
# the distinction more explicit in GirFFI.
|
21
|
-
def closure?
|
22
|
-
@is_closure
|
23
|
-
end
|
24
|
-
|
25
|
-
def closure=(arg)
|
26
|
-
@is_closure = arg
|
27
|
-
end
|
28
|
-
|
29
18
|
def initialize(var_gen, arginfo)
|
30
19
|
@var_gen = var_gen
|
31
20
|
@arginfo = arginfo
|
32
21
|
@length_arg = nil
|
33
22
|
@array_arg = nil
|
34
23
|
@is_closure = false
|
24
|
+
@destroy_notifier = false
|
35
25
|
end
|
36
26
|
|
37
27
|
def name
|
@@ -60,10 +50,44 @@ module GirFFI
|
|
60
50
|
type_info.array_length
|
61
51
|
end
|
62
52
|
|
63
|
-
def
|
53
|
+
def closure_idx
|
64
54
|
arginfo.closure
|
65
55
|
end
|
66
56
|
|
57
|
+
def destroy_idx
|
58
|
+
arginfo.destroy
|
59
|
+
end
|
60
|
+
|
61
|
+
# TODO: closure unfortunately means two things in GLib: a closure
|
62
|
+
# argument (user_data), and the Closure class (a callable object). Make
|
63
|
+
# the distinction more explicit in GirFFI.
|
64
|
+
def closure=(arg)
|
65
|
+
@is_closure = arg
|
66
|
+
end
|
67
|
+
|
68
|
+
# TODO: Unify relationship set-up methods and improve naming. We
|
69
|
+
# currently have length_arg=, array_arg=, closure= and
|
70
|
+
# mark_as_destroy_notifier.
|
71
|
+
def mark_as_destroy_notifier(callback)
|
72
|
+
@destroy_notifier = callback
|
73
|
+
end
|
74
|
+
|
75
|
+
def array_length_parameter?
|
76
|
+
@array_arg
|
77
|
+
end
|
78
|
+
|
79
|
+
def closure?
|
80
|
+
@is_closure
|
81
|
+
end
|
82
|
+
|
83
|
+
def destroy_notifier?
|
84
|
+
@destroy_notifier
|
85
|
+
end
|
86
|
+
|
87
|
+
def helper_argument?
|
88
|
+
array_length_parameter? || closure? || destroy_notifier?
|
89
|
+
end
|
90
|
+
|
67
91
|
def ownership_transfer
|
68
92
|
arginfo.ownership_transfer
|
69
93
|
end
|
@@ -3,12 +3,13 @@ module GirFFI
|
|
3
3
|
# Builder that generates code to convert closure arguments ('user data')
|
4
4
|
# from Ruby to C. Used by argument builders.
|
5
5
|
class ClosureToPointerConvertor
|
6
|
-
def initialize(argument_name)
|
6
|
+
def initialize(argument_name, callback_argument)
|
7
7
|
@argument_name = argument_name
|
8
|
+
@callback_argument = callback_argument
|
8
9
|
end
|
9
10
|
|
10
11
|
def conversion
|
11
|
-
"GirFFI::InPointer.from_closure_data(#{@
|
12
|
+
"GirFFI::InPointer.from_closure_data(#{@callback_argument.call_argument_name}.object_id)"
|
12
13
|
end
|
13
14
|
end
|
14
15
|
end
|
@@ -21,7 +21,7 @@ module GirFFI
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def setup_class
|
24
|
-
|
24
|
+
setup_ffi_type
|
25
25
|
klass.extend superclass
|
26
26
|
setup_constants
|
27
27
|
stub_methods
|
@@ -32,8 +32,8 @@ module GirFFI
|
|
32
32
|
@klass ||= get_or_define_module namespace_module, @classname
|
33
33
|
end
|
34
34
|
|
35
|
-
def
|
36
|
-
|
35
|
+
def setup_ffi_type
|
36
|
+
optionally_define_constant klass, :Enum do
|
37
37
|
lib.enum(enum_sym, value_spec)
|
38
38
|
end
|
39
39
|
end
|
@@ -51,7 +51,7 @@ module GirFFI
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def superclass
|
54
|
-
|
54
|
+
EnumBase
|
55
55
|
end
|
56
56
|
end
|
57
57
|
end
|
@@ -9,10 +9,12 @@ module GirFFI
|
|
9
9
|
# Convertor for fields for field getters. Used when building getter
|
10
10
|
# methods.
|
11
11
|
class GetterArgumentBuilder < BaseArgumentBuilder
|
12
|
-
def initialize(var_gen, field_argument_info, field_info,
|
12
|
+
def initialize(var_gen, field_argument_info, field_info,
|
13
|
+
array_length_idx: -1)
|
13
14
|
super(var_gen, field_argument_info)
|
14
15
|
@field_info = field_info
|
15
|
-
@length_arg =
|
16
|
+
@length_arg = NullArgumentBuilder.new
|
17
|
+
@array_length_idx = array_length_idx
|
16
18
|
end
|
17
19
|
|
18
20
|
def pre_conversion
|
@@ -47,6 +49,10 @@ module GirFFI
|
|
47
49
|
end
|
48
50
|
end
|
49
51
|
|
52
|
+
def array_length_idx
|
53
|
+
@array_length_idx
|
54
|
+
end
|
55
|
+
|
50
56
|
private
|
51
57
|
|
52
58
|
def field_offset
|
@@ -98,6 +104,10 @@ module GirFFI
|
|
98
104
|
-1
|
99
105
|
end
|
100
106
|
|
107
|
+
def destroy
|
108
|
+
-1
|
109
|
+
end
|
110
|
+
|
101
111
|
def direction
|
102
112
|
:out
|
103
113
|
end
|
@@ -163,22 +173,26 @@ module GirFFI
|
|
163
173
|
@argument_builders ||=
|
164
174
|
ArgumentBuilderCollection.new(
|
165
175
|
NullReturnValueBuilder.new,
|
166
|
-
|
176
|
+
base_argument_builders)
|
177
|
+
end
|
178
|
+
|
179
|
+
def base_argument_builders
|
180
|
+
if array_length_field
|
181
|
+
[getter_argument_builder, length_argument_builder]
|
182
|
+
else
|
183
|
+
[getter_argument_builder]
|
184
|
+
end
|
167
185
|
end
|
168
186
|
|
169
187
|
def getter_argument_builder
|
170
188
|
@getter_argument_builder ||=
|
171
189
|
GetterArgumentBuilder.new(var_gen, field_argument_info, @info,
|
172
|
-
|
190
|
+
array_length_idx: array_length_field ? 1 : -1)
|
173
191
|
end
|
174
192
|
|
175
193
|
def length_argument_builder
|
176
194
|
@length_argument_builder ||=
|
177
|
-
|
178
|
-
GetterArgumentBuilder.new(var_gen, length_argument_info, array_length_field)
|
179
|
-
else
|
180
|
-
NullArgumentBuilder.new
|
181
|
-
end
|
195
|
+
GetterArgumentBuilder.new(var_gen, length_argument_info, array_length_field)
|
182
196
|
end
|
183
197
|
|
184
198
|
def array_length_field
|
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'gir_ffi/builders/enum_builder'
|
2
|
+
require 'gir_ffi/flags_base'
|
3
|
+
|
4
|
+
module GirFFI
|
5
|
+
module Builders
|
6
|
+
# Implements the creation of a flags type. The type will be
|
7
|
+
# attached to the appropriate namespace module, and will be defined
|
8
|
+
# as a bit_mask for FFI.
|
9
|
+
class FlagsBuilder < EnumBuilder
|
10
|
+
def setup_ffi_type
|
11
|
+
optionally_define_constant klass, :BitMask do
|
12
|
+
lib.bit_mask(enum_sym, value_spec)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def value_spec
|
17
|
+
info.values.map do|vinfo|
|
18
|
+
val = GirFFI::ArgHelper.cast_uint32_to_int32(vinfo.value)
|
19
|
+
{ vinfo.name.to_sym => val }
|
20
|
+
end.reduce(:merge)
|
21
|
+
end
|
22
|
+
|
23
|
+
def superclass
|
24
|
+
FlagsBase
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'gir_ffi/builders/c_to_ruby_convertor'
|
2
|
+
|
3
|
+
module GirFFI
|
4
|
+
module Builders
|
5
|
+
# Builder that generates code to convert values from C to Ruby, including
|
6
|
+
# GValue unpacking. Used by argument builders.
|
7
|
+
class FullCToRubyConvertor < CToRubyConvertor
|
8
|
+
def conversion
|
9
|
+
base = super
|
10
|
+
if @type_info.gvalue?
|
11
|
+
"#{base}.get_value"
|
12
|
+
else
|
13
|
+
base
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -38,6 +38,13 @@ module GirFFI
|
|
38
38
|
@ancestor_infos ||= [info] + info.interfaces + parent_ancestor_infos
|
39
39
|
end
|
40
40
|
|
41
|
+
protected
|
42
|
+
|
43
|
+
def object_class_struct_info
|
44
|
+
@object_class_struct_info ||=
|
45
|
+
info.class_struct || parent_builder.object_class_struct_info
|
46
|
+
end
|
47
|
+
|
41
48
|
private
|
42
49
|
|
43
50
|
def setup_class
|
@@ -131,10 +138,6 @@ module GirFFI
|
|
131
138
|
end
|
132
139
|
end
|
133
140
|
|
134
|
-
def object_class_struct_info
|
135
|
-
@object_class_struct_info ||= info.class_struct
|
136
|
-
end
|
137
|
-
|
138
141
|
def seek_in_ancestor_infos
|
139
142
|
ancestor_infos.each do |info|
|
140
143
|
item = yield info
|
@@ -50,7 +50,7 @@ module GirFFI
|
|
50
50
|
capture = getter_builder.capture_variable_name
|
51
51
|
<<-CODE.reset_indentation
|
52
52
|
def #{getter_name}
|
53
|
-
#{capture} = get_property("#{property_name}")
|
53
|
+
#{capture} = get_property("#{property_name}")
|
54
54
|
#{getter_builder.post_conversion.join("\n")}
|
55
55
|
#{getter_builder.return_value_name}
|
56
56
|
end
|
@@ -60,7 +60,7 @@ module GirFFI
|
|
60
60
|
def simple_getter_def
|
61
61
|
<<-CODE.reset_indentation
|
62
62
|
def #{getter_name}
|
63
|
-
get_property("#{property_name}")
|
63
|
+
get_property("#{property_name}")
|
64
64
|
end
|
65
65
|
CODE
|
66
66
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require 'gir_ffi/builders/base_argument_builder'
|
2
|
-
require 'gir_ffi/builders/
|
2
|
+
require 'gir_ffi/builders/full_c_to_ruby_convertor'
|
3
3
|
require 'gir_ffi/builders/closure_convertor'
|
4
4
|
|
5
5
|
module GirFFI
|
@@ -44,9 +44,9 @@ module GirFFI
|
|
44
44
|
@post_convertor ||= if closure?
|
45
45
|
ClosureConvertor.new(capture_variable_name)
|
46
46
|
else
|
47
|
-
|
48
|
-
|
49
|
-
|
47
|
+
FullCToRubyConvertor.new(type_info,
|
48
|
+
capture_variable_name,
|
49
|
+
length_argument_name)
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
@@ -9,9 +9,17 @@ module GirFFI
|
|
9
9
|
FFI::Struct
|
10
10
|
end
|
11
11
|
|
12
|
-
private
|
13
|
-
|
14
12
|
def superclass
|
13
|
+
if info.gtype_struct?
|
14
|
+
# HACK: Inheritance chain is not expressed in GObject's code correctly.
|
15
|
+
if info.full_type_name == 'GObject::InitiallyUnownedClass'
|
16
|
+
return GObject::ObjectClass
|
17
|
+
else
|
18
|
+
type = fields.first.field_type
|
19
|
+
return type.tag_or_class if type.tag == :interface
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
15
23
|
StructBase
|
16
24
|
end
|
17
25
|
end
|