gir_ffi 0.7.10 → 0.8.0
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 +6 -0
- data/Gemfile +3 -1
- data/README.md +5 -2
- data/lib/ffi-glib.rb +1 -0
- data/lib/ffi-glib/array.rb +6 -6
- data/lib/ffi-glib/array_methods.rb +1 -1
- data/lib/ffi-glib/byte_array.rb +1 -1
- data/lib/ffi-glib/bytes.rb +3 -3
- data/lib/ffi-glib/container_class_methods.rb +2 -2
- data/lib/ffi-glib/error.rb +2 -2
- data/lib/ffi-glib/hash_table.rb +9 -9
- data/lib/ffi-glib/iconv.rb +1 -1
- data/lib/ffi-glib/list.rb +2 -2
- data/lib/ffi-glib/list_methods.rb +8 -7
- data/lib/ffi-glib/main_loop.rb +1 -1
- data/lib/ffi-glib/ptr_array.rb +7 -7
- data/lib/ffi-glib/s_list.rb +2 -2
- data/lib/ffi-glib/strv.rb +3 -3
- data/lib/ffi-glib/variant.rb +9 -2
- data/lib/ffi-gobject.rb +10 -10
- data/lib/ffi-gobject/closure.rb +1 -1
- data/lib/ffi-gobject/initially_unowned.rb +4 -3
- data/lib/ffi-gobject/object.rb +19 -19
- data/lib/ffi-gobject/object_class.rb +2 -2
- data/lib/ffi-gobject/ruby_closure.rb +5 -4
- data/lib/ffi-gobject/value.rb +15 -20
- data/lib/ffi-gobject_introspection/g_error.rb +1 -1
- data/lib/ffi-gobject_introspection/i_base_info.rb +6 -6
- data/lib/ffi-gobject_introspection/i_callable_info.rb +1 -1
- data/lib/ffi-gobject_introspection/i_enum_info.rb +2 -2
- data/lib/ffi-gobject_introspection/i_interface_info.rb +8 -8
- data/lib/ffi-gobject_introspection/i_object_info.rb +9 -9
- data/lib/ffi-gobject_introspection/i_repository.rb +13 -13
- data/lib/ffi-gobject_introspection/i_struct_info.rb +2 -2
- data/lib/ffi-gobject_introspection/i_type_info.rb +1 -1
- data/lib/ffi-gobject_introspection/i_union_info.rb +3 -3
- data/lib/ffi-gobject_introspection/lib.rb +4 -4
- data/lib/gir_ffi-base/glib/boolean.rb +4 -4
- data/lib/gir_ffi-base/glib/strv.rb +2 -2
- data/lib/gir_ffi/allocation_helper.rb +1 -1
- data/lib/gir_ffi/arg_helper.rb +8 -8
- data/lib/gir_ffi/boxed_base.rb +5 -9
- data/lib/gir_ffi/builder.rb +4 -4
- data/lib/gir_ffi/builder_helper.rb +3 -3
- data/lib/gir_ffi/builders/argument_builder_collection.rb +1 -1
- data/lib/gir_ffi/builders/base_argument_builder.rb +3 -3
- data/lib/gir_ffi/builders/base_method_builder.rb +71 -0
- data/lib/gir_ffi/builders/base_type_builder.rb +1 -1
- data/lib/gir_ffi/builders/boxed_builder.rb +3 -2
- data/lib/gir_ffi/builders/c_to_ruby_convertor.rb +1 -1
- data/lib/gir_ffi/builders/closure_convertor.rb +1 -1
- data/lib/gir_ffi/builders/closure_to_pointer_convertor.rb +1 -1
- data/lib/gir_ffi/builders/constructor_builder.rb +52 -0
- data/lib/gir_ffi/builders/enum_builder.rb +3 -3
- data/lib/gir_ffi/builders/field_builder.rb +3 -2
- data/lib/gir_ffi/builders/function_builder.rb +9 -50
- data/lib/gir_ffi/builders/initializer_builder.rb +32 -0
- data/lib/gir_ffi/builders/initializer_return_value_builder.rb +16 -0
- data/lib/gir_ffi/builders/mapping_method_builder.rb +7 -5
- data/lib/gir_ffi/builders/marshalling_method_builder.rb +5 -3
- data/lib/gir_ffi/builders/method_template.rb +1 -1
- data/lib/gir_ffi/builders/module_builder.rb +8 -7
- data/lib/gir_ffi/builders/null_convertor.rb +1 -1
- data/lib/gir_ffi/builders/null_return_value_builder.rb +21 -0
- data/lib/gir_ffi/builders/object_builder.rb +3 -3
- data/lib/gir_ffi/builders/property_builder.rb +1 -1
- data/lib/gir_ffi/builders/registered_type_builder.rb +31 -15
- data/lib/gir_ffi/builders/return_value_builder.rb +1 -14
- data/lib/gir_ffi/builders/ruby_to_c_convertor.rb +2 -2
- data/lib/gir_ffi/builders/signal_closure_builder.rb +1 -1
- data/lib/gir_ffi/builders/type_builder.rb +2 -2
- data/lib/gir_ffi/builders/unintrospectable_builder.rb +1 -1
- data/lib/gir_ffi/builders/user_defined_builder.rb +11 -11
- data/lib/gir_ffi/builders/vfunc_builder.rb +1 -1
- data/lib/gir_ffi/callback_base.rb +8 -13
- data/lib/gir_ffi/class_base.rb +41 -45
- data/lib/gir_ffi/core.rb +2 -2
- data/lib/gir_ffi/enum_base.rb +9 -14
- data/lib/gir_ffi/field_argument_info.rb +1 -1
- data/lib/gir_ffi/g_type.rb +1 -1
- data/lib/gir_ffi/glib_error.rb +1 -1
- data/lib/gir_ffi/in_out_pointer.rb +4 -4
- data/lib/gir_ffi/in_pointer.rb +12 -12
- data/lib/gir_ffi/info_ext/i_arg_info.rb +0 -10
- data/lib/gir_ffi/info_ext/i_callback_info.rb +0 -5
- data/lib/gir_ffi/info_ext/i_property_info.rb +1 -1
- data/lib/gir_ffi/info_ext/i_registered_type_info.rb +1 -6
- data/lib/gir_ffi/info_ext/i_signal_info.rb +2 -2
- data/lib/gir_ffi/info_ext/i_type_info.rb +2 -17
- data/lib/gir_ffi/info_ext/i_unresolved_info.rb +0 -5
- data/lib/gir_ffi/info_ext/i_vfunc_info.rb +2 -2
- data/lib/gir_ffi/interface_base.rb +2 -7
- data/lib/gir_ffi/method_stubber.rb +1 -1
- data/lib/gir_ffi/module_base.rb +4 -7
- data/lib/gir_ffi/object_base.rb +4 -9
- data/lib/gir_ffi/receiver_argument_info.rb +1 -1
- data/lib/gir_ffi/receiver_type_info.rb +1 -1
- data/lib/gir_ffi/registered_type_base.rb +0 -5
- data/lib/gir_ffi/return_value_info.rb +1 -1
- data/lib/gir_ffi/sized_array.rb +10 -10
- data/lib/gir_ffi/type_map.rb +3 -3
- data/lib/gir_ffi/unintrospectable_type_info.rb +3 -1
- data/lib/gir_ffi/user_data_argument_info.rb +1 -1
- data/lib/gir_ffi/user_defined_property_info.rb +1 -1
- data/lib/gir_ffi/user_defined_type_info.rb +4 -4
- data/lib/gir_ffi/version.rb +1 -1
- data/lib/gir_ffi/vfunc_implementation.rb +1 -1
- data/lib/gir_ffi/zero_terminated.rb +6 -6
- data/test/base_test_helper.rb +13 -13
- data/test/ffi-gobject/object_test.rb +22 -1
- data/test/ffi-gobject/value_test.rb +24 -24
- data/test/ffi-gobject_introspection/i_registered_type_info_test.rb +4 -4
- data/test/ffi-gobject_introspection/i_type_info_test.rb +2 -2
- data/test/ffi-gobject_test.rb +2 -2
- data/test/gir_ffi/builders/argument_builder_test.rb +60 -60
- data/test/gir_ffi/builders/callback_argument_builder_test.rb +8 -8
- data/test/gir_ffi/builders/callback_builder_test.rb +4 -4
- data/test/gir_ffi/builders/callback_return_value_builder_test.rb +8 -8
- data/test/gir_ffi/builders/constructor_builder_test.rb +34 -0
- data/test/gir_ffi/builders/function_builder_test.rb +8 -24
- data/test/gir_ffi/builders/initializer_builder_test.rb +36 -0
- data/test/gir_ffi/builders/interface_builder_test.rb +2 -2
- data/test/gir_ffi/builders/object_builder_test.rb +6 -18
- data/test/gir_ffi/builders/property_builder_test.rb +2 -2
- data/test/gir_ffi/builders/return_value_builder_test.rb +54 -79
- data/test/gir_ffi/builders/signal_closure_builder_test.rb +14 -14
- data/test/gir_ffi/builders/user_defined_builder_test.rb +8 -8
- data/test/gir_ffi/builders/vfunc_builder_test.rb +22 -22
- data/test/gir_ffi/class_base_test.rb +9 -7
- data/test/gir_ffi/in_pointer_test.rb +1 -1
- data/test/gir_ffi/info_ext/i_callable_info_test.rb +2 -2
- data/test/gir_ffi/info_ext/i_callback_info_test.rb +2 -2
- data/test/gir_ffi/info_ext/i_field_info_test.rb +2 -2
- data/test/gir_ffi/info_ext/i_function_info_test.rb +2 -2
- data/test/gir_ffi/info_ext/i_signal_info_test.rb +2 -2
- data/test/gir_ffi/info_ext/i_type_info_test.rb +18 -18
- data/test/gir_ffi/info_ext/i_unresolved_info_test.rb +2 -2
- data/test/gir_ffi/info_ext/safe_constant_name_test.rb +2 -2
- data/test/gir_ffi/info_ext/safe_function_name_test.rb +2 -2
- data/test/gir_ffi/method_stubber_test.rb +6 -6
- data/test/gir_ffi/user_defined_type_info_test.rb +3 -3
- data/test/gir_ffi_test_helper.rb +12 -12
- data/test/integration/derived_classes_test.rb +7 -3
- data/test/integration/generated_gimarshallingtests_test.rb +10 -10
- data/test/integration/generated_regress_test.rb +11 -20
- data/test/introspection_test_helper.rb +1 -1
- data/test/minitest/stats_plugin.rb +3 -3
- metadata +9 -3
- data/lib/gir_ffi/builders/constructor_result_convertor.rb +0 -14
@@ -20,12 +20,12 @@ module GirFFI
|
|
20
20
|
end
|
21
21
|
end
|
22
22
|
|
23
|
-
def find_signal
|
23
|
+
def find_signal(signal_name)
|
24
24
|
seek_in_ancestor_infos { |info| info.find_signal signal_name } or
|
25
25
|
raise "Signal #{signal_name} not found"
|
26
26
|
end
|
27
27
|
|
28
|
-
def find_property
|
28
|
+
def find_property(property_name)
|
29
29
|
seek_in_ancestor_infos { |info| info.find_property property_name } or
|
30
30
|
raise "Property #{property_name} not found"
|
31
31
|
end
|
@@ -99,7 +99,7 @@ module GirFFI
|
|
99
99
|
end
|
100
100
|
end
|
101
101
|
|
102
|
-
def define_vfunc_invoker
|
102
|
+
def define_vfunc_invoker(vfunc_name, invoker_name)
|
103
103
|
return if vfunc_name == invoker_name
|
104
104
|
klass.class_eval "
|
105
105
|
def #{vfunc_name} *args, &block
|
@@ -1,6 +1,8 @@
|
|
1
1
|
require 'gir_ffi/builders/base_type_builder'
|
2
2
|
require 'gir_ffi/method_stubber'
|
3
|
-
require 'gir_ffi/
|
3
|
+
require 'gir_ffi/builders/function_builder'
|
4
|
+
require 'gir_ffi/builders/constructor_builder'
|
5
|
+
require 'gir_ffi/builders/initializer_builder'
|
4
6
|
|
5
7
|
module GirFFI
|
6
8
|
module Builders
|
@@ -8,14 +10,16 @@ module GirFFI
|
|
8
10
|
# of IRegisteredTypeInfo. These are types whose C representation is
|
9
11
|
# complex, i.e., a struct or a union.
|
10
12
|
class RegisteredTypeBuilder < BaseTypeBuilder
|
11
|
-
def setup_method
|
12
|
-
|
13
|
-
|
13
|
+
def setup_method(method)
|
14
|
+
method_info = info.find_method method
|
15
|
+
return unless method_info
|
16
|
+
attach_and_define_method method_info, meta_class
|
14
17
|
end
|
15
18
|
|
16
|
-
def setup_instance_method
|
17
|
-
|
18
|
-
|
19
|
+
def setup_instance_method(method)
|
20
|
+
method_info = info.find_instance_method method
|
21
|
+
return unless method_info
|
22
|
+
attach_and_define_method method_info, build_class
|
19
23
|
end
|
20
24
|
|
21
25
|
def target_gtype
|
@@ -28,17 +32,29 @@ module GirFFI
|
|
28
32
|
(class << build_class; self; end)
|
29
33
|
end
|
30
34
|
|
31
|
-
def
|
32
|
-
|
35
|
+
def attach_and_define_method(method_info, modul)
|
36
|
+
method = method_info.safe_name
|
37
|
+
attach_method method_info
|
38
|
+
remove_old_method method, modul
|
39
|
+
define_method method_info
|
40
|
+
method
|
41
|
+
end
|
42
|
+
|
43
|
+
def define_method(method_info)
|
44
|
+
if method_info.constructor?
|
45
|
+
build_class.class_eval InitializerBuilder.new(method_info).method_definition
|
46
|
+
build_class.class_eval ConstructorBuilder.new(method_info).method_definition
|
47
|
+
else
|
48
|
+
build_class.class_eval FunctionBuilder.new(method_info).method_definition
|
49
|
+
end
|
33
50
|
end
|
34
51
|
|
35
|
-
def
|
36
|
-
return unless go
|
37
|
-
method = go.safe_name
|
38
|
-
Builder.attach_ffi_function lib, go
|
52
|
+
def remove_old_method(method, modul)
|
39
53
|
modul.class_eval { remove_method method if method_defined? method }
|
40
|
-
|
41
|
-
|
54
|
+
end
|
55
|
+
|
56
|
+
def attach_method(method_info)
|
57
|
+
Builder.attach_ffi_function lib, method_info
|
42
58
|
end
|
43
59
|
|
44
60
|
def stub_methods
|
@@ -1,17 +1,11 @@
|
|
1
1
|
require 'gir_ffi/builders/base_argument_builder'
|
2
2
|
require 'gir_ffi/builders/c_to_ruby_convertor'
|
3
3
|
require 'gir_ffi/builders/closure_convertor'
|
4
|
-
require 'gir_ffi/builders/constructor_result_convertor'
|
5
4
|
|
6
5
|
module GirFFI
|
7
6
|
module Builders
|
8
7
|
# Implements building post-processing statements for return values.
|
9
8
|
class ReturnValueBuilder < BaseArgumentBuilder
|
10
|
-
def initialize var_gen, arginfo, constructor_result = false
|
11
|
-
super var_gen, arginfo
|
12
|
-
@constructor_result = constructor_result
|
13
|
-
end
|
14
|
-
|
15
9
|
def relevant?
|
16
10
|
!void_return_value? && !arginfo.skip?
|
17
11
|
end
|
@@ -42,20 +36,13 @@ module GirFFI
|
|
42
36
|
|
43
37
|
private
|
44
38
|
|
45
|
-
def constructor_result?
|
46
|
-
@constructor_result
|
47
|
-
end
|
48
|
-
|
49
39
|
def has_post_conversion?
|
50
|
-
closure? ||
|
51
|
-
type_info.needs_c_to_ruby_conversion_for_functions?
|
40
|
+
closure? || type_info.needs_c_to_ruby_conversion_for_functions?
|
52
41
|
end
|
53
42
|
|
54
43
|
def post_convertor
|
55
44
|
@post_convertor ||= if closure?
|
56
45
|
ClosureConvertor.new(capture_variable_name)
|
57
|
-
elsif constructor_result?
|
58
|
-
ConstructorResultConvertor.new(capture_variable_name)
|
59
46
|
else
|
60
47
|
CToRubyConvertor.new(type_info,
|
61
48
|
capture_variable_name,
|
@@ -3,7 +3,7 @@ module GirFFI
|
|
3
3
|
# Builder that generates code to convert values from Ruby to C. Used by
|
4
4
|
# argument builders.
|
5
5
|
class RubyToCConvertor
|
6
|
-
def initialize
|
6
|
+
def initialize(type_info, argument_name)
|
7
7
|
@type_info = type_info
|
8
8
|
@argument_name = argument_name
|
9
9
|
end
|
@@ -13,7 +13,7 @@ module GirFFI
|
|
13
13
|
"#{@type_info.argument_class_name}.from(#{args})"
|
14
14
|
end
|
15
15
|
|
16
|
-
def conversion_arguments
|
16
|
+
def conversion_arguments(name)
|
17
17
|
@type_info.extra_conversion_arguments.map(&:inspect).push(name).join(', ')
|
18
18
|
end
|
19
19
|
end
|
@@ -28,12 +28,12 @@ module GirFFI
|
|
28
28
|
unintrospectable: UnintrospectableBuilder
|
29
29
|
}
|
30
30
|
|
31
|
-
def self.build
|
31
|
+
def self.build(info)
|
32
32
|
builder_for(info).build_class
|
33
33
|
end
|
34
34
|
|
35
35
|
# TODO: Pull up to include :function and :module
|
36
|
-
def self.builder_for
|
36
|
+
def self.builder_for(info)
|
37
37
|
TYPE_MAP[info.info_type].new(info)
|
38
38
|
end
|
39
39
|
end
|
@@ -5,7 +5,7 @@ module GirFFI
|
|
5
5
|
module Builders
|
6
6
|
# Implements the creation of GObject subclasses from Ruby.
|
7
7
|
class UserDefinedBuilder < ObjectBuilder
|
8
|
-
def initialize
|
8
|
+
def initialize(info)
|
9
9
|
@info = info
|
10
10
|
end
|
11
11
|
|
@@ -62,7 +62,7 @@ module GirFFI
|
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
|
-
def gobject_interface_info
|
65
|
+
def gobject_interface_info(interface)
|
66
66
|
GObject::InterfaceInfo.new.tap do |interface_info|
|
67
67
|
interface_info.interface_init = interface_init_proc(interface)
|
68
68
|
end
|
@@ -75,7 +75,7 @@ module GirFFI
|
|
75
75
|
end
|
76
76
|
end
|
77
77
|
|
78
|
-
def interface_init_proc
|
78
|
+
def interface_init_proc(interface)
|
79
79
|
proc do |interface_ptr, _data|
|
80
80
|
setup_interface_vfuncs interface, interface_ptr
|
81
81
|
end
|
@@ -93,7 +93,7 @@ module GirFFI
|
|
93
93
|
parent_gtype.class_size + interface_gtypes.map(&:class_size).inject(0, :+)
|
94
94
|
end
|
95
95
|
|
96
|
-
def setup_properties
|
96
|
+
def setup_properties(object_class_ptr)
|
97
97
|
object_class = GObject::ObjectClass.wrap object_class_ptr
|
98
98
|
|
99
99
|
object_class.get_property = property_getter
|
@@ -116,7 +116,7 @@ module GirFFI
|
|
116
116
|
end
|
117
117
|
end
|
118
118
|
|
119
|
-
def setup_vfuncs
|
119
|
+
def setup_vfuncs(object_class_ptr)
|
120
120
|
super_class_struct =
|
121
121
|
superclass.gir_ffi_builder.object_class_struct::Struct.new(object_class_ptr)
|
122
122
|
|
@@ -125,7 +125,7 @@ module GirFFI
|
|
125
125
|
end
|
126
126
|
end
|
127
127
|
|
128
|
-
def setup_interface_vfuncs
|
128
|
+
def setup_interface_vfuncs(interface, interface_ptr)
|
129
129
|
interface_builder = interface.gir_ffi_builder
|
130
130
|
|
131
131
|
interface_struct = interface_builder.interface_struct::Struct.new(interface_ptr)
|
@@ -136,7 +136,7 @@ module GirFFI
|
|
136
136
|
end
|
137
137
|
end
|
138
138
|
|
139
|
-
def setup_vfunc
|
139
|
+
def setup_vfunc(super_class_struct, impl)
|
140
140
|
vfunc_name = impl.name
|
141
141
|
vfunc_info = parent_info.find_vfunc vfunc_name.to_s
|
142
142
|
|
@@ -145,7 +145,7 @@ module GirFFI
|
|
145
145
|
end
|
146
146
|
end
|
147
147
|
|
148
|
-
def setup_interface_vfunc
|
148
|
+
def setup_interface_vfunc(interface_info, interface_struct, impl)
|
149
149
|
vfunc_name = impl.name
|
150
150
|
vfunc_info = interface_info.find_vfunc vfunc_name.to_s
|
151
151
|
|
@@ -154,7 +154,7 @@ module GirFFI
|
|
154
154
|
end
|
155
155
|
end
|
156
156
|
|
157
|
-
def install_vfunc
|
157
|
+
def install_vfunc(container_struct, vfunc_name, vfunc_info, implementation)
|
158
158
|
vfunc = VFuncBuilder.new(vfunc_info).build_class
|
159
159
|
container_struct[vfunc_name] = vfunc.from implementation
|
160
160
|
end
|
@@ -180,7 +180,7 @@ module GirFFI
|
|
180
180
|
end
|
181
181
|
end
|
182
182
|
|
183
|
-
def setup_accessors_for_param_info
|
183
|
+
def setup_accessors_for_param_info(pinfo)
|
184
184
|
field_name = pinfo.name
|
185
185
|
code = <<-CODE
|
186
186
|
def #{field_name}
|
@@ -194,7 +194,7 @@ module GirFFI
|
|
194
194
|
klass.class_eval code
|
195
195
|
end
|
196
196
|
|
197
|
-
def method_introspection_data
|
197
|
+
def method_introspection_data(_method)
|
198
198
|
nil
|
199
199
|
end
|
200
200
|
|
@@ -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
|
case value
|
23
23
|
when CallbackBase
|
24
24
|
value.to_native
|
@@ -27,25 +27,25 @@ module GirFFI
|
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
-
def self.wrap
|
30
|
+
def self.wrap(ptr)
|
31
31
|
from_native ptr, nil
|
32
32
|
end
|
33
33
|
|
34
34
|
CALLBACKS = []
|
35
35
|
|
36
|
-
def self.store_callback
|
36
|
+
def self.store_callback(prc)
|
37
37
|
CALLBACKS << prc
|
38
38
|
end
|
39
39
|
|
40
40
|
# Create Callback from a Proc. Makes sure arguments are properly wrapped,
|
41
41
|
# and the callback is stored to prevent garbage collection.
|
42
|
-
def self.from
|
42
|
+
def self.from(prc)
|
43
43
|
wrap_in_callback_args_mapper(prc).tap do |cb|
|
44
44
|
store_callback cb
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
-
def self.wrap_in_callback_args_mapper
|
48
|
+
def self.wrap_in_callback_args_mapper(prc)
|
49
49
|
return unless prc
|
50
50
|
|
51
51
|
new do |*args|
|
@@ -53,11 +53,6 @@ module GirFFI
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
# @deprecated Use .to_ffi_type instead. Will be removed in 0.8.0.
|
57
|
-
def self.to_ffitype
|
58
|
-
self
|
59
|
-
end
|
60
|
-
|
61
56
|
def self.to_ffi_type
|
62
57
|
self
|
63
58
|
end
|
@@ -70,11 +65,11 @@ module GirFFI
|
|
70
65
|
end
|
71
66
|
end
|
72
67
|
|
73
|
-
def self.copy_value_to_pointer
|
68
|
+
def self.copy_value_to_pointer(value, pointer)
|
74
69
|
pointer.put_pointer 0, to_native(value, nil)
|
75
70
|
end
|
76
71
|
|
77
|
-
def self.get_value_from_pointer
|
72
|
+
def self.get_value_from_pointer(pointer)
|
78
73
|
from_native pointer.get_pointer(0), nil
|
79
74
|
end
|
80
75
|
end
|
data/lib/gir_ffi/class_base.rb
CHANGED
@@ -11,7 +11,7 @@ module GirFFI
|
|
11
11
|
attr_reader :struct
|
12
12
|
def_delegators :@struct, :to_ptr
|
13
13
|
|
14
|
-
def setup_and_call
|
14
|
+
def setup_and_call(method, arguments, &block)
|
15
15
|
method_name = self.class.try_in_ancestors(:setup_instance_method, method.to_s)
|
16
16
|
|
17
17
|
unless method_name
|
@@ -23,11 +23,11 @@ module GirFFI
|
|
23
23
|
|
24
24
|
# NOTE: JRuby should fix FFI::MemoryPointer#== to return true for
|
25
25
|
# equivalent FFI::Pointer. For now, user to_ptr.address
|
26
|
-
def ==
|
26
|
+
def ==(other)
|
27
27
|
other.class == self.class && to_ptr.address == other.to_ptr.address
|
28
28
|
end
|
29
29
|
|
30
|
-
def self.setup_and_call
|
30
|
+
def self.setup_and_call(method, arguments, &block)
|
31
31
|
method_name = try_in_ancestors(:setup_method, method.to_s)
|
32
32
|
|
33
33
|
unless method_name
|
@@ -37,7 +37,7 @@ module GirFFI
|
|
37
37
|
send method_name, *arguments, &block
|
38
38
|
end
|
39
39
|
|
40
|
-
def self.try_in_ancestors
|
40
|
+
def self.try_in_ancestors(method, *arguments)
|
41
41
|
ancestors.each do |klass|
|
42
42
|
if klass.respond_to?(method)
|
43
43
|
result = klass.send(method, *arguments)
|
@@ -50,60 +50,56 @@ module GirFFI
|
|
50
50
|
self::Struct
|
51
51
|
end
|
52
52
|
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
to_ffi_type
|
57
|
-
end
|
58
|
-
|
59
|
-
def setup_method name
|
60
|
-
gir_ffi_builder.setup_method name
|
61
|
-
end
|
53
|
+
def self.setup_method(name)
|
54
|
+
gir_ffi_builder.setup_method name
|
55
|
+
end
|
62
56
|
|
63
|
-
|
64
|
-
|
65
|
-
|
57
|
+
def self.setup_instance_method(name)
|
58
|
+
gir_ffi_builder.setup_instance_method name
|
59
|
+
end
|
66
60
|
|
67
|
-
|
61
|
+
class << self
|
68
62
|
undef new
|
63
|
+
end
|
69
64
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
65
|
+
# Wrap the passed pointer in an instance of the current class, or a
|
66
|
+
# descendant type if applicable.
|
67
|
+
def self.wrap(ptr)
|
68
|
+
direct_wrap ptr
|
69
|
+
end
|
75
70
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
71
|
+
# Wrap the passed pointer in an instance of the current class. Will not
|
72
|
+
# do any casting to subtypes or additional processing.
|
73
|
+
def self.direct_wrap(ptr)
|
74
|
+
return nil if !ptr || ptr.null?
|
75
|
+
obj = allocate
|
76
|
+
obj.__send__ :assign_pointer, ptr
|
77
|
+
obj
|
78
|
+
end
|
84
79
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
end
|
80
|
+
# Pass-through casting method. This may become a type checking
|
81
|
+
# method. It is overridden by GValue to implement wrapping of plain
|
82
|
+
# Ruby objects.
|
83
|
+
def self.from(val)
|
84
|
+
val
|
91
85
|
end
|
92
86
|
|
93
|
-
|
94
|
-
|
95
|
-
#
|
96
|
-
#
|
87
|
+
private
|
88
|
+
|
89
|
+
# Stores a pointer created by a constructor function. Derived classes may
|
90
|
+
# perform additional processing. For example, InitiallyUnowned overrides it
|
91
|
+
# to sink the floating object.
|
97
92
|
#
|
98
93
|
# This method assumes the pointer will always be of the type corresponding
|
99
94
|
# to the current class, and never of a subtype.
|
100
95
|
#
|
101
96
|
# @param ptr Pointer to the object's C structure
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
97
|
+
def store_pointer(ptr)
|
98
|
+
assign_pointer ptr
|
99
|
+
end
|
100
|
+
|
101
|
+
def assign_pointer(ptr)
|
102
|
+
@struct = self.class::Struct.new(ptr)
|
107
103
|
end
|
108
104
|
end
|
109
105
|
end
|