gir_ffi 0.7.4 → 0.7.5
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/Changelog.md +7 -0
- data/TODO.md +8 -0
- data/lib/ffi-glib/array.rb +7 -7
- data/lib/ffi-glib/byte_array.rb +3 -4
- data/lib/ffi-glib/bytes.rb +3 -3
- data/lib/ffi-glib/error.rb +2 -2
- data/lib/ffi-glib/hash_table.rb +7 -7
- data/lib/ffi-glib/iconv.rb +3 -4
- data/lib/ffi-glib/list.rb +3 -3
- data/lib/ffi-glib/list_methods.rb +3 -3
- data/lib/ffi-glib/ptr_array.rb +6 -6
- data/lib/ffi-glib/s_list.rb +3 -3
- data/lib/ffi-glib/strv.rb +3 -3
- data/lib/ffi-glib/variant.rb +6 -2
- data/lib/ffi-glib.rb +3 -0
- data/lib/ffi-gobject/base.rb +1 -0
- data/lib/ffi-gobject/closure.rb +2 -2
- data/lib/ffi-gobject/initially_unowned.rb +4 -3
- data/lib/ffi-gobject/object.rb +5 -5
- data/lib/ffi-gobject/object_class.rb +2 -2
- data/lib/ffi-gobject/ruby_closure.rb +2 -3
- data/lib/ffi-gobject/value.rb +5 -5
- data/lib/ffi-gobject.rb +17 -22
- data/lib/ffi-gobject_introspection/i_arg_info.rb +0 -1
- data/lib/ffi-gobject_introspection/i_base_info.rb +3 -4
- data/lib/ffi-gobject_introspection/i_callable_info.rb +1 -2
- data/lib/ffi-gobject_introspection/i_constant_info.rb +19 -11
- data/lib/ffi-gobject_introspection/i_enum_info.rb +4 -3
- data/lib/ffi-gobject_introspection/i_function_info.rb +7 -1
- data/lib/ffi-gobject_introspection/i_interface_info.rb +12 -0
- data/lib/ffi-gobject_introspection/i_object_info.rb +19 -8
- data/lib/ffi-gobject_introspection/i_registered_type_info.rb +0 -1
- data/lib/ffi-gobject_introspection/i_repository.rb +10 -15
- data/lib/ffi-gobject_introspection/i_struct_info.rb +4 -2
- data/lib/ffi-gobject_introspection/i_type_info.rb +4 -2
- data/lib/ffi-gobject_introspection/i_union_info.rb +7 -3
- data/lib/ffi-gobject_introspection/i_value_info.rb +0 -1
- data/lib/ffi-gobject_introspection/lib.rb +1 -2
- data/lib/ffi-gobject_introspection.rb +0 -1
- data/lib/gir_ffi/allocation_helper.rb +2 -1
- data/lib/gir_ffi/arg_helper.rb +6 -2
- data/lib/gir_ffi/builder_helper.rb +1 -0
- data/lib/gir_ffi/builders/argument_builder_collection.rb +67 -0
- data/lib/gir_ffi/builders/c_to_ruby_convertor.rb +2 -0
- data/lib/gir_ffi/builders/callback_argument_builder.rb +7 -5
- data/lib/gir_ffi/builders/callback_builder.rb +3 -1
- data/lib/gir_ffi/builders/callback_return_value_builder.rb +2 -0
- data/lib/gir_ffi/builders/closure_argument_builder.rb +13 -0
- data/lib/gir_ffi/builders/closure_convertor.rb +2 -0
- data/lib/gir_ffi/builders/closure_to_pointer_convertor.rb +2 -0
- data/lib/gir_ffi/builders/constructor_result_convertor.rb +1 -0
- data/lib/gir_ffi/builders/enum_builder.rb +1 -4
- data/lib/gir_ffi/builders/field_builder.rb +2 -2
- data/lib/gir_ffi/builders/function_builder.rb +2 -1
- data/lib/gir_ffi/builders/interface_builder.rb +0 -3
- data/lib/gir_ffi/builders/mapping_method_builder.rb +24 -92
- data/lib/gir_ffi/builders/marshalling_method_builder.rb +73 -0
- data/lib/gir_ffi/builders/null_argument_builder.rb +3 -0
- data/lib/gir_ffi/builders/null_builder.rb +1 -0
- data/lib/gir_ffi/builders/object_builder.rb +0 -2
- data/lib/gir_ffi/builders/property_builder.rb +4 -4
- data/lib/gir_ffi/builders/registered_type_builder.rb +35 -1
- data/lib/gir_ffi/builders/return_value_builder.rb +4 -6
- data/lib/gir_ffi/builders/ruby_to_c_convertor.rb +2 -0
- data/lib/gir_ffi/builders/signal_closure_builder.rb +46 -0
- data/lib/gir_ffi/builders/struct_builder.rb +0 -2
- data/lib/gir_ffi/builders/type_builder.rb +1 -1
- data/lib/gir_ffi/builders/unintrospectable_builder.rb +1 -1
- data/lib/gir_ffi/builders/union_builder.rb +0 -2
- data/lib/gir_ffi/builders/user_defined_builder.rb +6 -18
- data/lib/gir_ffi/builders/vfunc_builder.rb +6 -4
- data/lib/gir_ffi/builders/with_layout.rb +1 -2
- data/lib/gir_ffi/callback_base.rb +4 -4
- data/lib/gir_ffi/class_base.rb +28 -18
- data/lib/gir_ffi/enum_base.rb +2 -2
- data/lib/gir_ffi/ffi_ext/pointer.rb +1 -0
- data/lib/gir_ffi/in_out_pointer.rb +4 -4
- data/lib/gir_ffi/in_pointer.rb +2 -2
- data/lib/gir_ffi/info_ext/full_type_name.rb +16 -0
- data/lib/gir_ffi/info_ext/i_arg_info.rb +2 -3
- data/lib/gir_ffi/info_ext/i_callback_info.rb +1 -8
- data/lib/gir_ffi/info_ext/i_property_info.rb +0 -1
- data/lib/gir_ffi/info_ext/i_registered_type_info.rb +0 -1
- data/lib/gir_ffi/info_ext/i_signal_info.rb +8 -40
- data/lib/gir_ffi/info_ext/i_type_info.rb +12 -2
- data/lib/gir_ffi/info_ext/i_vfunc_info.rb +1 -6
- data/lib/gir_ffi/info_ext/safe_constant_name.rb +0 -5
- data/lib/gir_ffi/info_ext.rb +1 -0
- data/lib/gir_ffi/lib_c.rb +1 -0
- data/lib/gir_ffi/module_base.rb +2 -2
- data/lib/gir_ffi/object_base.rb +0 -16
- data/lib/gir_ffi/receiver_argument_info.rb +0 -4
- data/lib/gir_ffi/registered_type_base.rb +0 -1
- data/lib/gir_ffi/sized_array.rb +5 -5
- data/lib/gir_ffi/struct_base.rb +4 -0
- data/lib/gir_ffi/type_base.rb +2 -2
- data/lib/gir_ffi/type_map.rb +1 -0
- data/lib/gir_ffi/unintrospectable_type_info.rb +1 -3
- data/lib/gir_ffi/user_data_type_info.rb +2 -0
- data/lib/gir_ffi/version.rb +2 -1
- data/lib/gir_ffi/zero_terminated.rb +6 -6
- data/lib/gir_ffi-base/glib/boolean.rb +2 -2
- data/lib/gir_ffi-base/glib/strv.rb +1 -1
- data/lib/gir_ffi-base/gobject/lib.rb +1 -0
- data/lib/gir_ffi-base/gobject.rb +1 -1
- data/lib/gir_ffi.rb +2 -0
- data/test/ffi-glib/hash_table_test.rb +1 -1
- data/test/ffi-glib/strv_test.rb +27 -0
- data/test/ffi-gobject_introspection/i_constant_info_test.rb +1 -5
- data/test/ffi-gobject_test.rb +3 -3
- data/test/gir_ffi/builders/{with_methods_test.rb → registered_type_builder_test.rb} +1 -1
- data/test/gir_ffi/builders/signal_closure_builder_test.rb +136 -0
- data/test/gir_ffi/builders/user_defined_builder_test.rb +2 -1
- data/test/gir_ffi/info_ext/i_signal_info_test.rb +0 -11
- data/test/integration/generated_gimarshallingtests_test.rb +47 -2
- data/test/integration/generated_regress_test.rb +19 -11
- metadata +82 -25
- data/lib/gir_ffi/builders/signal_builder.rb +0 -51
- data/lib/gir_ffi/builders/with_methods.rb +0 -45
- data/lib/gir_ffi/signal_base.rb +0 -21
- data/lib/gir_ffi/vfunc_base.rb +0 -9
- data/test/gir_ffi/builders/signal_builder_test.rb +0 -106
@@ -1,13 +1,10 @@
|
|
1
1
|
require 'gir_ffi/builders/registered_type_builder'
|
2
|
-
require 'gir_ffi/builders/with_methods'
|
3
2
|
require 'gir_ffi/interface_base'
|
4
3
|
|
5
4
|
module GirFFI
|
6
5
|
module Builders
|
7
6
|
# Implements the creation of a module representing an Interface.
|
8
7
|
class InterfaceBuilder < RegisteredTypeBuilder
|
9
|
-
include WithMethods
|
10
|
-
|
11
8
|
def interface_struct
|
12
9
|
@interface_struct ||= Builder.build_class iface_struct_info
|
13
10
|
end
|
@@ -1,5 +1,6 @@
|
|
1
1
|
require 'gir_ffi/builders/callback_argument_builder'
|
2
2
|
require 'gir_ffi/builders/callback_return_value_builder'
|
3
|
+
require 'gir_ffi/builders/argument_builder_collection'
|
3
4
|
|
4
5
|
module GirFFI
|
5
6
|
module Builders
|
@@ -7,72 +8,30 @@ module GirFFI
|
|
7
8
|
# handler. This method converts arguments from C to Ruby, and the
|
8
9
|
# result from Ruby to C.
|
9
10
|
class MappingMethodBuilder
|
10
|
-
def self.for_callback argument_infos,
|
11
|
+
def self.for_callback argument_infos, return_value_info
|
11
12
|
vargen = VariableNameGenerator.new
|
12
|
-
argument_builders = argument_infos.map {|arg|
|
13
|
-
CallbackArgumentBuilder.new vargen, arg }
|
14
|
-
set_up_argument_relations argument_infos, argument_builders
|
15
|
-
new return_type_info, vargen, argument_builders
|
16
|
-
end
|
17
|
-
|
18
|
-
def self.for_signal receiver_info, argument_infos, user_data_info, return_type_info
|
19
|
-
vargen = VariableNameGenerator.new
|
20
|
-
|
21
|
-
receiver_builder = CallbackArgumentBuilder.new vargen, receiver_info
|
22
|
-
argument_builders = argument_infos.map {|arg|
|
23
|
-
CallbackArgumentBuilder.new vargen, arg }
|
24
|
-
user_data_builder = CallbackArgumentBuilder.new vargen, user_data_info
|
25
|
-
|
26
|
-
set_up_argument_relations argument_infos, argument_builders
|
27
|
-
user_data_builder.is_closure = true
|
28
13
|
|
29
|
-
argument_builders.
|
30
|
-
|
14
|
+
argument_builders = argument_infos.map {|arg| CallbackArgumentBuilder.new vargen, arg }
|
15
|
+
return_value_builder = CallbackReturnValueBuilder.new(vargen, return_value_info)
|
31
16
|
|
32
|
-
new
|
17
|
+
new ArgumentBuilderCollection.new(return_value_builder, argument_builders)
|
33
18
|
end
|
34
19
|
|
35
|
-
def self.for_vfunc receiver_info, argument_infos,
|
20
|
+
def self.for_vfunc receiver_info, argument_infos, return_value_info
|
36
21
|
vargen = VariableNameGenerator.new
|
37
22
|
|
38
23
|
receiver_builder = CallbackArgumentBuilder.new vargen, receiver_info
|
39
|
-
argument_builders = argument_infos.map {|arg|
|
40
|
-
|
41
|
-
|
42
|
-
set_up_argument_relations argument_infos, argument_builders
|
43
|
-
|
44
|
-
argument_builders.unshift receiver_builder
|
24
|
+
argument_builders = argument_infos.map {|arg| CallbackArgumentBuilder.new vargen, arg }
|
25
|
+
return_value_builder = CallbackReturnValueBuilder.new(vargen, return_value_info)
|
45
26
|
|
46
|
-
new
|
27
|
+
new ArgumentBuilderCollection.new(return_value_builder, argument_builders,
|
28
|
+
receiver_builder: receiver_builder)
|
47
29
|
end
|
48
30
|
|
49
|
-
def
|
50
|
-
|
51
|
-
if (idx = arg.closure) >= 0
|
52
|
-
argument_builders[idx].is_closure = true
|
53
|
-
end
|
54
|
-
end
|
55
|
-
argument_builders.each do |bldr|
|
56
|
-
if (idx = bldr.array_length_idx) >= 0
|
57
|
-
other = argument_builders[idx]
|
58
|
-
|
59
|
-
bldr.length_arg = other
|
60
|
-
other.array_arg = bldr
|
61
|
-
end
|
62
|
-
end
|
31
|
+
def initialize argument_builder_collection
|
32
|
+
@argument_builder_collection = argument_builder_collection
|
63
33
|
end
|
64
34
|
|
65
|
-
def initialize return_type_info, vargen, argument_builders
|
66
|
-
@vargen = vargen
|
67
|
-
@argument_builders = argument_builders
|
68
|
-
|
69
|
-
@return_type_info = return_type_info
|
70
|
-
end
|
71
|
-
|
72
|
-
attr_reader :return_type_info
|
73
|
-
attr_reader :vargen
|
74
|
-
attr_reader :argument_builders
|
75
|
-
|
76
35
|
def method_definition
|
77
36
|
code = "def self.call_with_argument_mapping(#{method_arguments.join(', ')})"
|
78
37
|
method_lines.each { |line| code << "\n #{line}" }
|
@@ -80,61 +39,34 @@ module GirFFI
|
|
80
39
|
end
|
81
40
|
|
82
41
|
def method_lines
|
83
|
-
parameter_preparation +
|
42
|
+
@argument_builder_collection.parameter_preparation +
|
43
|
+
call_to_proc +
|
44
|
+
@argument_builder_collection.return_value_conversion +
|
45
|
+
return_value
|
84
46
|
end
|
85
47
|
|
86
48
|
def return_value
|
87
|
-
if
|
88
|
-
["return #{
|
49
|
+
if (name = @argument_builder_collection.return_value_name)
|
50
|
+
["return #{name}"]
|
89
51
|
else
|
90
52
|
[]
|
91
53
|
end
|
92
54
|
end
|
93
55
|
|
94
|
-
def return_value_conversion
|
95
|
-
all_builders.map(&:post_conversion).flatten
|
96
|
-
end
|
97
|
-
|
98
56
|
def call_to_proc
|
99
|
-
["#{capture}_proc.call(#{
|
100
|
-
end
|
101
|
-
|
102
|
-
def parameter_preparation
|
103
|
-
argument_builders.sort_by.with_index {|arg, i|
|
104
|
-
[arg.type_info.array_length, i] }.map(&:pre_conversion).flatten
|
57
|
+
["#{capture}_proc.call(#{@argument_builder_collection.call_argument_names.join(', ')})"]
|
105
58
|
end
|
106
59
|
|
107
60
|
def capture
|
108
|
-
@capture ||=
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
def capture_variable_names
|
114
|
-
@capture_variable_names ||=
|
115
|
-
all_builders.map(&:capture_variable_name).compact
|
116
|
-
end
|
117
|
-
|
118
|
-
def all_builders
|
119
|
-
@all_builders ||= [return_value_builder] + argument_builders
|
120
|
-
end
|
121
|
-
|
122
|
-
def call_arguments
|
123
|
-
@call_arguments ||= argument_builders.map(&:call_argument_name).compact
|
61
|
+
@capture ||= begin
|
62
|
+
names = @argument_builder_collection.capture_variable_names
|
63
|
+
names.any? ? "#{names.join(", ")} = " : ""
|
64
|
+
end
|
124
65
|
end
|
125
66
|
|
126
67
|
def method_arguments
|
127
|
-
@method_arguments ||=
|
128
|
-
end
|
129
|
-
|
130
|
-
def return_value_info
|
131
|
-
@return_value_info ||= ReturnValueInfo.new(return_type_info)
|
132
|
-
end
|
133
|
-
|
134
|
-
def return_value_builder
|
135
|
-
@return_value_builder ||= CallbackReturnValueBuilder.new(vargen, return_value_info)
|
68
|
+
@method_arguments ||= @argument_builder_collection.method_argument_names.dup.unshift('_proc')
|
136
69
|
end
|
137
70
|
end
|
138
71
|
end
|
139
72
|
end
|
140
|
-
|
@@ -0,0 +1,73 @@
|
|
1
|
+
require 'gir_ffi/builders/closure_argument_builder'
|
2
|
+
require 'gir_ffi/builders/callback_return_value_builder'
|
3
|
+
require 'gir_ffi/builders/argument_builder_collection'
|
4
|
+
|
5
|
+
module GirFFI
|
6
|
+
module Builders
|
7
|
+
# Implements the creation mapping method for a callback or signal
|
8
|
+
# handler. This method converts arguments from C to Ruby, and the
|
9
|
+
# result from Ruby to C.
|
10
|
+
class MarshallingMethodBuilder
|
11
|
+
def self.for_signal receiver_info, argument_infos, return_value_info
|
12
|
+
vargen = VariableNameGenerator.new
|
13
|
+
|
14
|
+
receiver_builder = ClosureArgumentBuilder.new vargen, receiver_info
|
15
|
+
argument_builders = argument_infos.map {|arg| ClosureArgumentBuilder.new vargen, arg }
|
16
|
+
return_value_builder = CallbackReturnValueBuilder.new(vargen, return_value_info)
|
17
|
+
|
18
|
+
new ArgumentBuilderCollection.new(return_value_builder, argument_builders,
|
19
|
+
receiver_builder: receiver_builder)
|
20
|
+
end
|
21
|
+
|
22
|
+
def initialize argument_builder_collection
|
23
|
+
@argument_builder_collection = argument_builder_collection
|
24
|
+
end
|
25
|
+
|
26
|
+
def method_definition
|
27
|
+
code = "def self.marshaller(#{marshaller_arguments.join(', ')})"
|
28
|
+
method_lines.each { |line| code << "\n #{line}" }
|
29
|
+
code << "\nend\n"
|
30
|
+
end
|
31
|
+
|
32
|
+
def method_lines
|
33
|
+
param_values_unpack +
|
34
|
+
@argument_builder_collection.parameter_preparation +
|
35
|
+
call_to_closure +
|
36
|
+
@argument_builder_collection.return_value_conversion +
|
37
|
+
return_value
|
38
|
+
end
|
39
|
+
|
40
|
+
def return_value
|
41
|
+
if (name = @argument_builder_collection.return_value_name)
|
42
|
+
["return_value.set_value #{name}"]
|
43
|
+
else
|
44
|
+
[]
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def call_to_closure
|
49
|
+
["#{capture}wrap(closure.to_ptr).invoke_block(#{@argument_builder_collection.call_argument_names.join(', ')})"]
|
50
|
+
end
|
51
|
+
|
52
|
+
def param_values_unpack
|
53
|
+
["#{method_arguments.join(", ")} = param_values.map(&:get_value_plain)" ]
|
54
|
+
end
|
55
|
+
|
56
|
+
def capture
|
57
|
+
@capture ||= begin
|
58
|
+
names = @argument_builder_collection.capture_variable_names
|
59
|
+
names.any? ? "#{names.join(", ")} = " : ""
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def method_arguments
|
64
|
+
# FIXME: Don't add _ if method_argument_names has more than one element
|
65
|
+
@method_arguments ||= @argument_builder_collection.method_argument_names.dup.push('_')
|
66
|
+
end
|
67
|
+
|
68
|
+
def marshaller_arguments
|
69
|
+
%w(closure return_value param_values _invocation_hint _marshal_data)
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'gir_ffi/builders/registered_type_builder'
|
2
2
|
require 'gir_ffi/builders/with_layout'
|
3
|
-
require 'gir_ffi/builders/with_methods'
|
4
3
|
require 'gir_ffi/builders/property_builder'
|
5
4
|
require 'gir_ffi/object_base'
|
6
5
|
|
@@ -8,7 +7,6 @@ module GirFFI
|
|
8
7
|
module Builders
|
9
8
|
# Implements the creation of a class representing a GObject Object.
|
10
9
|
class ObjectBuilder < RegisteredTypeBuilder
|
11
|
-
include WithMethods
|
12
10
|
include WithLayout
|
13
11
|
|
14
12
|
def find_signal signal_name
|
@@ -44,7 +44,7 @@ module GirFFI
|
|
44
44
|
private
|
45
45
|
|
46
46
|
def converting_getter_def
|
47
|
-
|
47
|
+
<<-CODE.reset_indentation
|
48
48
|
def #{getter_name}
|
49
49
|
#{getter_builder.capture_variable_name} = get_property("#{property_name}").get_value_plain
|
50
50
|
#{getter_builder.post_conversion.join("\n")}
|
@@ -54,7 +54,7 @@ module GirFFI
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def simple_getter_def
|
57
|
-
|
57
|
+
<<-CODE.reset_indentation
|
58
58
|
def #{getter_name}
|
59
59
|
get_property("#{property_name}").get_value
|
60
60
|
end
|
@@ -67,7 +67,7 @@ module GirFFI
|
|
67
67
|
end
|
68
68
|
|
69
69
|
def converting_setter_def
|
70
|
-
|
70
|
+
<<-CODE.reset_indentation
|
71
71
|
def #{setter_name} value
|
72
72
|
#{setter_builder.pre_conversion.join("\n")}
|
73
73
|
set_property("#{property_name}", #{setter_builder.callarg})
|
@@ -76,7 +76,7 @@ module GirFFI
|
|
76
76
|
end
|
77
77
|
|
78
78
|
def simple_setter_def
|
79
|
-
|
79
|
+
<<-CODE.reset_indentation
|
80
80
|
def #{setter_name} value
|
81
81
|
set_property("#{property_name}", value)
|
82
82
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'gir_ffi/builders/base_type_builder'
|
2
|
+
require 'gir_ffi/method_stubber'
|
2
3
|
require 'gir_ffi/class_base'
|
3
4
|
|
4
5
|
module GirFFI
|
@@ -7,12 +8,45 @@ module GirFFI
|
|
7
8
|
# of IRegisteredTypeInfo. These are types whose C representation is
|
8
9
|
# complex, i.e., a struct or a union.
|
9
10
|
class RegisteredTypeBuilder < BaseTypeBuilder
|
10
|
-
|
11
|
+
def setup_method method
|
12
|
+
go = info.find_method method
|
13
|
+
attach_and_define_method method, go, meta_class
|
14
|
+
end
|
15
|
+
|
16
|
+
def setup_instance_method method
|
17
|
+
go = info.find_instance_method method
|
18
|
+
attach_and_define_method method, go, build_class
|
19
|
+
end
|
11
20
|
|
12
21
|
def target_gtype
|
13
22
|
info.g_type
|
14
23
|
end
|
15
24
|
|
25
|
+
private
|
26
|
+
|
27
|
+
def meta_class
|
28
|
+
(class << build_class; self; end)
|
29
|
+
end
|
30
|
+
|
31
|
+
def function_definition go
|
32
|
+
FunctionBuilder.new(go).generate
|
33
|
+
end
|
34
|
+
|
35
|
+
def attach_and_define_method method, go, modul
|
36
|
+
return unless go
|
37
|
+
method = go.safe_name
|
38
|
+
Builder.attach_ffi_function lib, go
|
39
|
+
modul.class_eval { remove_method method if method_defined? method }
|
40
|
+
build_class.class_eval function_definition(go)
|
41
|
+
method
|
42
|
+
end
|
43
|
+
|
44
|
+
def stub_methods
|
45
|
+
info.get_methods.each do |minfo|
|
46
|
+
klass.class_eval MethodStubber.new(minfo).method_stub
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
16
50
|
def setup_constants
|
17
51
|
klass.const_set :G_TYPE, target_gtype
|
18
52
|
super
|
@@ -42,17 +42,19 @@ module GirFFI
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
|
45
|
+
attr_reader :is_constructor
|
46
|
+
|
45
47
|
private
|
46
48
|
|
47
49
|
def has_post_conversion?
|
48
|
-
is_closure ||
|
50
|
+
is_closure || is_constructor ||
|
49
51
|
type_info.needs_c_to_ruby_conversion_for_functions?
|
50
52
|
end
|
51
53
|
|
52
54
|
def post_convertor
|
53
55
|
@post_convertor ||= if is_closure
|
54
56
|
ClosureConvertor.new(capture_variable_name)
|
55
|
-
elsif
|
57
|
+
elsif is_constructor
|
56
58
|
ConstructorResultConvertor.new(capture_variable_name)
|
57
59
|
else
|
58
60
|
CToRubyConvertor.new(type_info,
|
@@ -65,10 +67,6 @@ module GirFFI
|
|
65
67
|
length_arg && length_arg.post_converted_name
|
66
68
|
end
|
67
69
|
|
68
|
-
def needs_constructor_wrap?
|
69
|
-
@is_constructor && specialized_type_tag == :object
|
70
|
-
end
|
71
|
-
|
72
70
|
def is_void_return_value?
|
73
71
|
specialized_type_tag == :void && !type_info.pointer?
|
74
72
|
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'gir_ffi/builders/base_type_builder'
|
2
|
+
require 'gir_ffi/builders/marshalling_method_builder'
|
3
|
+
|
4
|
+
module GirFFI
|
5
|
+
module Builders
|
6
|
+
# Implements the creation of a closure class for handling a particular
|
7
|
+
# signal. The type will be attached to the appropriate class.
|
8
|
+
class SignalClosureBuilder < BaseTypeBuilder
|
9
|
+
def instantiate_class
|
10
|
+
unless already_set_up
|
11
|
+
setup_constants
|
12
|
+
klass.class_eval marshaller_definition
|
13
|
+
end
|
14
|
+
klass
|
15
|
+
end
|
16
|
+
|
17
|
+
def setup_method _method
|
18
|
+
nil
|
19
|
+
end
|
20
|
+
|
21
|
+
def marshaller_definition
|
22
|
+
arg_infos = info.args
|
23
|
+
|
24
|
+
container_type_info = ReceiverTypeInfo.new(container_info)
|
25
|
+
receiver_info = ReceiverArgumentInfo.new(container_type_info)
|
26
|
+
return_value_info = ReturnValueInfo.new info.return_type
|
27
|
+
|
28
|
+
MarshallingMethodBuilder.for_signal(receiver_info,
|
29
|
+
arg_infos,
|
30
|
+
return_value_info).method_definition
|
31
|
+
end
|
32
|
+
|
33
|
+
def klass
|
34
|
+
@klass ||= get_or_define_class container_class, @classname, GObject::RubyClosure
|
35
|
+
end
|
36
|
+
|
37
|
+
def container_class
|
38
|
+
@container_class ||= Builder.build_class(container_info)
|
39
|
+
end
|
40
|
+
|
41
|
+
def container_info
|
42
|
+
@container_info ||= info.container
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -1,13 +1,11 @@
|
|
1
1
|
require 'gir_ffi/builders/registered_type_builder'
|
2
2
|
require 'gir_ffi/builders/with_layout'
|
3
|
-
require 'gir_ffi/builders/with_methods'
|
4
3
|
require 'gir_ffi/struct_base'
|
5
4
|
|
6
5
|
module GirFFI
|
7
6
|
module Builders
|
8
7
|
# Implements the creation of a class representing a Struct.
|
9
8
|
class StructBuilder < RegisteredTypeBuilder
|
10
|
-
include WithMethods
|
11
9
|
include WithLayout
|
12
10
|
|
13
11
|
private
|
@@ -4,7 +4,7 @@ require 'gir_ffi/builders/enum_builder'
|
|
4
4
|
require 'gir_ffi/builders/interface_builder'
|
5
5
|
require 'gir_ffi/builders/object_builder'
|
6
6
|
require 'gir_ffi/builders/struct_builder'
|
7
|
-
require 'gir_ffi/builders/
|
7
|
+
require 'gir_ffi/builders/signal_closure_builder'
|
8
8
|
require 'gir_ffi/builders/unintrospectable_builder'
|
9
9
|
require 'gir_ffi/builders/union_builder'
|
10
10
|
require 'gir_ffi/builders/vfunc_builder'
|
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'gir_ffi/builders/registered_type_builder'
|
2
2
|
require 'gir_ffi/builders/with_layout'
|
3
|
-
require 'gir_ffi/builders/with_methods'
|
4
3
|
require 'gir_ffi/union_base'
|
5
4
|
|
6
5
|
module GirFFI
|
@@ -8,7 +7,6 @@ module GirFFI
|
|
8
7
|
# Implements the creation of a class representing union type. The
|
9
8
|
# class will have a nested FFI::Union class to represent its C union.
|
10
9
|
class UnionBuilder < RegisteredTypeBuilder
|
11
|
-
include WithMethods
|
12
10
|
include WithLayout
|
13
11
|
|
14
12
|
def layout_superclass
|
@@ -28,24 +28,16 @@ module GirFFI
|
|
28
28
|
def setup_class
|
29
29
|
setup_layout
|
30
30
|
setup_constants
|
31
|
-
#stub_methods
|
32
31
|
setup_property_accessors
|
33
|
-
#setup_vfunc_invokers
|
34
|
-
#setup_interfaces
|
35
32
|
setup_constructor
|
36
33
|
end
|
37
34
|
|
38
|
-
def
|
35
|
+
def target_gtype
|
39
36
|
@gtype
|
40
37
|
end
|
41
38
|
|
42
39
|
private
|
43
40
|
|
44
|
-
# FIXME: Is this really used?
|
45
|
-
def target_gtype
|
46
|
-
@gtype
|
47
|
-
end
|
48
|
-
|
49
41
|
def parent
|
50
42
|
@parent ||= gir.find_by_gtype(parent_gtype.to_i)
|
51
43
|
end
|
@@ -81,14 +73,14 @@ module GirFFI
|
|
81
73
|
end
|
82
74
|
|
83
75
|
def class_init_proc
|
84
|
-
proc do |object_class_ptr,
|
76
|
+
proc do |object_class_ptr, _data|
|
85
77
|
setup_properties object_class_ptr
|
86
78
|
setup_vfuncs object_class_ptr
|
87
79
|
end
|
88
80
|
end
|
89
81
|
|
90
82
|
def interface_init_proc interface
|
91
|
-
proc do |interface_ptr,
|
83
|
+
proc do |interface_ptr, _data|
|
92
84
|
setup_interface_vfuncs interface, interface_ptr
|
93
85
|
end
|
94
86
|
end
|
@@ -98,7 +90,7 @@ module GirFFI
|
|
98
90
|
properties.each do
|
99
91
|
size += FFI.type_size(:int32)
|
100
92
|
end
|
101
|
-
|
93
|
+
size
|
102
94
|
end
|
103
95
|
|
104
96
|
def class_size
|
@@ -117,13 +109,13 @@ module GirFFI
|
|
117
109
|
end
|
118
110
|
|
119
111
|
def property_getter
|
120
|
-
proc do |object,
|
112
|
+
proc do |object, _property_id, value, pspec|
|
121
113
|
value.set_value object.send(pspec.get_name)
|
122
114
|
end
|
123
115
|
end
|
124
116
|
|
125
117
|
def property_setter
|
126
|
-
proc do |object,
|
118
|
+
proc do |object, _property_id, value, pspec|
|
127
119
|
object.send("#{pspec.get_name}=", value.get_value)
|
128
120
|
end
|
129
121
|
end
|
@@ -167,10 +159,6 @@ module GirFFI
|
|
167
159
|
|
168
160
|
def install_vfunc container_struct, vfunc_name, vfunc_info, implementation
|
169
161
|
vfunc = VFuncBuilder.new(vfunc_info).build_class
|
170
|
-
# NOTE: This assigns a VFuncBase to a CallbackBase.
|
171
|
-
# This suggests that the two should be combined, but it seems
|
172
|
-
# CallbackBase will not cast the first argument correctly if used
|
173
|
-
# to map the implementation proc arguments.
|
174
162
|
container_struct[vfunc_name] = vfunc.from implementation
|
175
163
|
end
|
176
164
|
|
@@ -3,13 +3,14 @@ require 'gir_ffi/builders/base_type_builder'
|
|
3
3
|
require 'gir_ffi/builders/mapping_method_builder'
|
4
4
|
require 'gir_ffi/receiver_type_info'
|
5
5
|
require 'gir_ffi/receiver_argument_info'
|
6
|
-
require 'gir_ffi/
|
6
|
+
require 'gir_ffi/callback_base'
|
7
7
|
|
8
8
|
module GirFFI
|
9
9
|
module Builders
|
10
10
|
# Implements the creation of a class representing the implementation of a
|
11
11
|
# vfunc. This class will be able to turn a proc into an FFI::Function that
|
12
|
-
# can serve as such an implementation in C.
|
12
|
+
# can serve as such an implementation in C. The class will be namespaced
|
13
|
+
# inside class defining the vfunc.
|
13
14
|
class VFuncBuilder < BaseTypeBuilder
|
14
15
|
def instantiate_class
|
15
16
|
unless already_set_up
|
@@ -27,11 +28,12 @@ module GirFFI
|
|
27
28
|
arg_infos = info.args
|
28
29
|
arg_infos << ErrorArgumentInfo.new if info.throws?
|
29
30
|
|
30
|
-
receiver_info = ReceiverArgumentInfo.new
|
31
|
+
receiver_info = ReceiverArgumentInfo.new receiver_type_info
|
32
|
+
return_value_info = ReturnValueInfo.new info.return_type
|
31
33
|
|
32
34
|
MappingMethodBuilder.for_vfunc(receiver_info,
|
33
35
|
arg_infos,
|
34
|
-
|
36
|
+
return_value_info).method_definition
|
35
37
|
end
|
36
38
|
|
37
39
|
def receiver_type_info
|
@@ -4,8 +4,7 @@ module GirFFI
|
|
4
4
|
module Builders
|
5
5
|
# Implements the creation of classes representing types with layout,
|
6
6
|
# i.e., :union, :struct, :object.
|
7
|
-
# Note: This module depends on
|
8
|
-
# WithMethods.
|
7
|
+
# Note: This module depends on methods in RegisteredTypeBuilder.
|
9
8
|
module WithLayout
|
10
9
|
def layout_specification
|
11
10
|
spec = base_layout_specification
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'gir_ffi/type_base'
|
2
2
|
|
3
3
|
module GirFFI
|
4
|
-
# Base module for callbacks.
|
4
|
+
# Base module for callbacks and vfuncs.
|
5
5
|
# NOTE: Another option would be to derive this class from FFI::Function,
|
6
6
|
# allowing a more natural implementation of from_native, to_native and wrap.
|
7
7
|
class CallbackBase < Proc
|
@@ -12,13 +12,13 @@ module GirFFI
|
|
12
12
|
FFI::Type::POINTER
|
13
13
|
end
|
14
14
|
|
15
|
-
def self.from_native
|
15
|
+
def self.from_native value, _context
|
16
16
|
return nil if !value || value.null?
|
17
17
|
FFI::Function.new(gir_ffi_builder.return_ffi_type,
|
18
18
|
gir_ffi_builder.argument_ffi_types, value)
|
19
19
|
end
|
20
20
|
|
21
|
-
def self.to_native
|
21
|
+
def self.to_native value, _context
|
22
22
|
return nil unless value
|
23
23
|
return value if FFI::Function === value
|
24
24
|
value.to_native
|
@@ -45,7 +45,7 @@ module GirFFI
|
|
45
45
|
def self.wrap_in_callback_args_mapper prc
|
46
46
|
return nil unless prc
|
47
47
|
return prc if FFI::Function === prc
|
48
|
-
|
48
|
+
new do |*args|
|
49
49
|
call_with_argument_mapping(prc, *args)
|
50
50
|
end
|
51
51
|
end
|