gir_ffi 0.7.5 → 0.7.6
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 +17 -1
- data/README.md +1 -1
- data/Rakefile +0 -7
- data/examples/main_loop.rb +12 -0
- data/lib/ffi-glib/array.rb +18 -5
- data/lib/ffi-glib/array_methods.rb +1 -1
- data/lib/ffi-glib/list.rb +1 -1
- data/lib/ffi-glib/list_methods.rb +1 -1
- data/lib/ffi-glib/main_loop.rb +51 -0
- data/lib/ffi-glib/ptr_array.rb +2 -2
- data/lib/ffi-glib/s_list.rb +1 -1
- data/lib/ffi-glib/variant.rb +3 -3
- data/lib/ffi-glib.rb +1 -0
- data/lib/ffi-gobject/initially_unowned.rb +1 -1
- data/lib/ffi-gobject/object.rb +14 -12
- data/lib/ffi-gobject/ruby_closure.rb +3 -2
- data/lib/ffi-gobject/value.rb +12 -16
- data/lib/ffi-gobject.rb +4 -21
- data/lib/ffi-gobject_introspection/i_base_info.rb +3 -3
- data/lib/ffi-gobject_introspection/i_interface_info.rb +1 -1
- data/lib/ffi-gobject_introspection/i_repository.rb +1 -1
- data/lib/ffi-gobject_introspection/lib.rb +1 -1
- data/lib/gir_ffi/arg_helper.rb +2 -2
- data/lib/gir_ffi/builder.rb +1 -1
- data/lib/gir_ffi/builders/argument_builder.rb +19 -17
- data/lib/gir_ffi/builders/argument_builder_collection.rb +51 -16
- data/lib/gir_ffi/builders/base_argument_builder.rb +20 -10
- data/lib/gir_ffi/builders/base_type_builder.rb +6 -5
- data/lib/gir_ffi/builders/callback_argument_builder.rb +5 -5
- data/lib/gir_ffi/builders/callback_builder.rb +0 -4
- data/lib/gir_ffi/builders/callback_return_value_builder.rb +11 -11
- data/lib/gir_ffi/builders/constant_builder.rb +2 -4
- data/lib/gir_ffi/builders/enum_builder.rb +7 -7
- data/lib/gir_ffi/builders/error_argument_builder.rb +16 -4
- data/lib/gir_ffi/builders/field_builder.rb +5 -17
- data/lib/gir_ffi/builders/function_builder.rb +36 -86
- data/lib/gir_ffi/builders/interface_builder.rb +2 -7
- data/lib/gir_ffi/builders/mapping_method_builder.rb +42 -33
- data/lib/gir_ffi/builders/marshalling_method_builder.rb +44 -33
- data/lib/gir_ffi/builders/method_template.rb +81 -0
- data/lib/gir_ffi/builders/module_builder.rb +5 -5
- data/lib/gir_ffi/builders/object_builder.rb +44 -25
- data/lib/gir_ffi/builders/property_builder.rb +6 -2
- data/lib/gir_ffi/builders/registered_type_builder.rb +1 -5
- data/lib/gir_ffi/builders/return_value_builder.rb +20 -15
- data/lib/gir_ffi/builders/signal_closure_builder.rb +3 -6
- data/lib/gir_ffi/builders/type_builder.rb +1 -1
- data/lib/gir_ffi/builders/unintrospectable_builder.rb +1 -5
- data/lib/gir_ffi/builders/user_defined_builder.rb +17 -21
- data/lib/gir_ffi/builders/vfunc_builder.rb +3 -6
- data/lib/gir_ffi/builders/with_layout.rb +2 -6
- data/lib/gir_ffi/callback_base.rb +10 -5
- data/lib/gir_ffi/class_base.rb +4 -7
- data/lib/gir_ffi/enum_base.rb +1 -1
- data/lib/gir_ffi/g_type.rb +21 -19
- data/lib/gir_ffi/in_out_pointer.rb +2 -4
- data/lib/gir_ffi/in_pointer.rb +9 -8
- data/lib/gir_ffi/info_ext/i_field_info.rb +1 -3
- data/lib/gir_ffi/info_ext/i_signal_info.rb +4 -4
- data/lib/gir_ffi/info_ext/i_type_info.rb +6 -6
- data/lib/gir_ffi/module_base.rb +3 -2
- data/lib/gir_ffi/object_base.rb +1 -1
- data/lib/gir_ffi/struct_base.rb +1 -1
- data/lib/gir_ffi/type_base.rb +2 -2
- data/lib/gir_ffi/unintrospectable_type_info.rb +2 -0
- data/lib/gir_ffi/version.rb +1 -1
- data/lib/gir_ffi/zero_terminated.rb +1 -1
- data/lib/gir_ffi-base/glib/strv.rb +2 -2
- data/lib/gir_ffi.rb +1 -1
- data/test/ffi-glib/array_test.rb +28 -0
- data/test/ffi-glib/byte_array_test.rb +1 -1
- data/test/ffi-glib/bytes_test.rb +1 -1
- data/test/ffi-gobject/object_test.rb +11 -1
- data/test/ffi-gobject/value_test.rb +12 -1
- data/test/ffi-gobject_introspection/i_base_info_test.rb +14 -0
- data/test/ffi-gobject_introspection/i_object_info_test.rb +8 -6
- data/test/ffi-gobject_introspection/i_registered_type_info_test.rb +24 -0
- data/test/ffi-gobject_introspection/i_type_info_test.rb +17 -0
- data/test/gir_ffi/builder_test.rb +3 -2
- data/test/gir_ffi/builders/argument_builder_test.rb +2 -2
- data/test/gir_ffi/builders/function_builder_test.rb +27 -27
- data/test/gir_ffi/builders/object_builder_test.rb +10 -0
- data/test/gir_ffi/builders/return_value_builder_test.rb +3 -3
- data/test/gir_ffi/builders/signal_closure_builder_test.rb +6 -6
- data/test/gir_ffi/in_out_pointer_test.rb +0 -2
- data/test/gir_ffi/info_ext/i_type_info_test.rb +1 -1
- data/test/gir_ffi_test_helper.rb +0 -4
- data/test/integration/generated_gimarshallingtests_test.rb +1 -1
- data/test/integration/generated_regress_test.rb +2 -2
- data/test/integration/idle_loop_test.rb +25 -0
- data/test/minitest/stats_plugin.rb +26 -0
- metadata +13 -62
- data/lib/gir_ffi/builders/null_argument_builder.rb +0 -12
- data/lib/gir_ffi/builders/null_builder.rb +0 -12
- data/tasks/yard.rake +0 -6
@@ -7,17 +7,17 @@ module GirFFI
|
|
7
7
|
module Builders
|
8
8
|
# Implements building post-processing statements for return values.
|
9
9
|
class ReturnValueBuilder < BaseArgumentBuilder
|
10
|
-
def initialize var_gen, arginfo,
|
10
|
+
def initialize var_gen, arginfo, constructor_result = false
|
11
11
|
super var_gen, arginfo
|
12
|
-
@
|
12
|
+
@constructor_result = constructor_result
|
13
13
|
end
|
14
14
|
|
15
|
-
def
|
16
|
-
!
|
15
|
+
def relevant?
|
16
|
+
!void_return_value? && !arginfo.skip?
|
17
17
|
end
|
18
18
|
|
19
19
|
def capture_variable_name
|
20
|
-
@capture_variable_name ||= new_variable
|
20
|
+
@capture_variable_name ||= new_variable if relevant?
|
21
21
|
end
|
22
22
|
|
23
23
|
def post_converted_name
|
@@ -29,32 +29,33 @@ module GirFFI
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def return_value_name
|
32
|
-
if
|
33
|
-
post_converted_name unless array_arg
|
34
|
-
end
|
32
|
+
post_converted_name if has_return_value_name?
|
35
33
|
end
|
36
34
|
|
37
35
|
def post_conversion
|
36
|
+
# TODO: Avoid conditional by using NullConvertor
|
38
37
|
if has_post_conversion?
|
39
|
-
[
|
38
|
+
["#{post_converted_name} = #{post_convertor.conversion}"]
|
40
39
|
else
|
41
40
|
[]
|
42
41
|
end
|
43
42
|
end
|
44
43
|
|
45
|
-
attr_reader :is_constructor
|
46
|
-
|
47
44
|
private
|
48
45
|
|
46
|
+
def constructor_result?
|
47
|
+
@constructor_result
|
48
|
+
end
|
49
|
+
|
49
50
|
def has_post_conversion?
|
50
|
-
|
51
|
+
closure? || constructor_result? ||
|
51
52
|
type_info.needs_c_to_ruby_conversion_for_functions?
|
52
53
|
end
|
53
54
|
|
54
55
|
def post_convertor
|
55
|
-
@post_convertor ||= if
|
56
|
+
@post_convertor ||= if closure?
|
56
57
|
ClosureConvertor.new(capture_variable_name)
|
57
|
-
elsif
|
58
|
+
elsif constructor_result?
|
58
59
|
ConstructorResultConvertor.new(capture_variable_name)
|
59
60
|
else
|
60
61
|
CToRubyConvertor.new(type_info,
|
@@ -67,9 +68,13 @@ module GirFFI
|
|
67
68
|
length_arg && length_arg.post_converted_name
|
68
69
|
end
|
69
70
|
|
70
|
-
def
|
71
|
+
def void_return_value?
|
71
72
|
specialized_type_tag == :void && !type_info.pointer?
|
72
73
|
end
|
74
|
+
|
75
|
+
def has_return_value_name?
|
76
|
+
relevant? && !array_arg
|
77
|
+
end
|
73
78
|
end
|
74
79
|
end
|
75
80
|
end
|
@@ -6,12 +6,9 @@ module GirFFI
|
|
6
6
|
# Implements the creation of a closure class for handling a particular
|
7
7
|
# signal. The type will be attached to the appropriate class.
|
8
8
|
class SignalClosureBuilder < BaseTypeBuilder
|
9
|
-
def
|
10
|
-
|
11
|
-
|
12
|
-
klass.class_eval marshaller_definition
|
13
|
-
end
|
14
|
-
klass
|
9
|
+
def setup_class
|
10
|
+
setup_constants
|
11
|
+
klass.class_eval marshaller_definition
|
15
12
|
end
|
16
13
|
|
17
14
|
def setup_method _method
|
@@ -6,10 +6,6 @@ module GirFFI
|
|
6
6
|
# which no data is found in the GIR. Typically, these are created to
|
7
7
|
# cast objects returned by a function that returns an interface.
|
8
8
|
class UnintrospectableBuilder < ObjectBuilder
|
9
|
-
def instantiate_class
|
10
|
-
setup_class unless already_set_up
|
11
|
-
end
|
12
|
-
|
13
9
|
def klass
|
14
10
|
@klass ||= TypeBuilder::CACHE[target_gtype] ||= Class.new(superclass)
|
15
11
|
end
|
@@ -26,7 +22,7 @@ module GirFFI
|
|
26
22
|
|
27
23
|
private
|
28
24
|
|
29
|
-
def
|
25
|
+
def ancestor_infos
|
30
26
|
info.interfaces
|
31
27
|
end
|
32
28
|
end
|
@@ -9,37 +9,33 @@ module GirFFI
|
|
9
9
|
@info = info
|
10
10
|
end
|
11
11
|
|
12
|
-
def instantiate_class
|
13
|
-
if already_set_up
|
14
|
-
@gtype = klass.get_gtype
|
15
|
-
else
|
16
|
-
@gtype = GObject.type_register_static(parent_gtype.to_i,
|
17
|
-
info.g_name,
|
18
|
-
gobject_type_info, 0)
|
19
|
-
included_interfaces.each do |interface|
|
20
|
-
ifinfo = gobject_interface_info interface
|
21
|
-
GObject.type_add_interface_static @gtype, interface.get_gtype, ifinfo
|
22
|
-
end
|
23
|
-
setup_class
|
24
|
-
TypeBuilder::CACHE[@gtype] = klass
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
12
|
def setup_class
|
13
|
+
register_type
|
29
14
|
setup_layout
|
30
15
|
setup_constants
|
31
16
|
setup_property_accessors
|
32
17
|
setup_constructor
|
18
|
+
TypeBuilder::CACHE[@gtype] = klass
|
33
19
|
end
|
34
20
|
|
35
21
|
def target_gtype
|
36
|
-
@gtype
|
22
|
+
@gtype ||= klass.get_gtype
|
37
23
|
end
|
38
24
|
|
39
25
|
private
|
40
26
|
|
41
|
-
def
|
42
|
-
@
|
27
|
+
def register_type
|
28
|
+
@gtype = GObject.type_register_static(parent_gtype.to_i,
|
29
|
+
info.g_name,
|
30
|
+
gobject_type_info, 0)
|
31
|
+
included_interfaces.each do |interface|
|
32
|
+
ifinfo = gobject_interface_info interface
|
33
|
+
GObject.type_add_interface_static @gtype, interface.get_gtype, ifinfo
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def parent_info
|
38
|
+
@parent_info ||= gir.find_by_gtype(parent_gtype.to_i)
|
43
39
|
end
|
44
40
|
|
45
41
|
def parent_gtype
|
@@ -47,7 +43,7 @@ module GirFFI
|
|
47
43
|
end
|
48
44
|
|
49
45
|
def interface_gtypes
|
50
|
-
included_interfaces.map {|interface| GType.new(interface.get_gtype) }
|
46
|
+
included_interfaces.map { |interface| GType.new(interface.get_gtype) }
|
51
47
|
end
|
52
48
|
|
53
49
|
def included_interfaces
|
@@ -141,7 +137,7 @@ module GirFFI
|
|
141
137
|
|
142
138
|
def setup_vfunc super_class_struct, impl
|
143
139
|
vfunc_name = impl.name
|
144
|
-
vfunc_info =
|
140
|
+
vfunc_info = parent_info.find_vfunc vfunc_name.to_s
|
145
141
|
|
146
142
|
if vfunc_info
|
147
143
|
install_vfunc super_class_struct, vfunc_name, vfunc_info, impl.implementation
|
@@ -12,12 +12,9 @@ module GirFFI
|
|
12
12
|
# can serve as such an implementation in C. The class will be namespaced
|
13
13
|
# inside class defining the vfunc.
|
14
14
|
class VFuncBuilder < BaseTypeBuilder
|
15
|
-
def
|
16
|
-
|
17
|
-
|
18
|
-
klass.class_eval mapping_method_definition
|
19
|
-
end
|
20
|
-
klass
|
15
|
+
def setup_class
|
16
|
+
setup_constants
|
17
|
+
klass.class_eval mapping_method_definition
|
21
18
|
end
|
22
19
|
|
23
20
|
def klass
|
@@ -23,8 +23,8 @@ module GirFFI
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def dummy_layout_specification
|
26
|
-
if
|
27
|
-
[:parent, superclass
|
26
|
+
if parent_info
|
27
|
+
[:parent, superclass::Struct, 0]
|
28
28
|
else
|
29
29
|
[:dummy, :char, 0]
|
30
30
|
end
|
@@ -40,10 +40,6 @@ module GirFFI
|
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
def instantiate_class
|
44
|
-
setup_class unless already_set_up
|
45
|
-
end
|
46
|
-
|
47
43
|
def klass
|
48
44
|
@klass ||= get_or_define_class namespace_module, @classname, superclass
|
49
45
|
end
|
@@ -19,9 +19,14 @@ module GirFFI
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def self.to_native value, _context
|
22
|
-
|
23
|
-
|
24
|
-
|
22
|
+
case value
|
23
|
+
when CallbackBase
|
24
|
+
value.to_native
|
25
|
+
when FFI::Function
|
26
|
+
value
|
27
|
+
else
|
28
|
+
nil
|
29
|
+
end
|
25
30
|
end
|
26
31
|
|
27
32
|
def self.wrap ptr
|
@@ -43,8 +48,8 @@ module GirFFI
|
|
43
48
|
end
|
44
49
|
|
45
50
|
def self.wrap_in_callback_args_mapper prc
|
46
|
-
return
|
47
|
-
|
51
|
+
return unless prc
|
52
|
+
|
48
53
|
new do |*args|
|
49
54
|
call_with_argument_mapping(prc, *args)
|
50
55
|
end
|
data/lib/gir_ffi/class_base.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
require 'forwardable'
|
2
|
-
require 'gir_ffi/builders/null_builder'
|
3
2
|
require 'gir_ffi/registered_type_base'
|
4
3
|
|
5
4
|
module GirFFI
|
@@ -12,13 +11,11 @@ module GirFFI
|
|
12
11
|
attr_reader :struct
|
13
12
|
def_delegators :@struct, :to_ptr
|
14
13
|
|
15
|
-
GIR_FFI_BUILDER = NullBuilder.new
|
16
|
-
|
17
14
|
def setup_and_call method, *arguments, &block
|
18
15
|
method_name = self.class.try_in_ancestors(:setup_instance_method, method.to_s)
|
19
16
|
|
20
17
|
unless method_name
|
21
|
-
raise
|
18
|
+
raise "Unable to set up instance method '#{method}' in #{self}"
|
22
19
|
end
|
23
20
|
|
24
21
|
send method_name, *arguments, &block
|
@@ -34,7 +31,7 @@ module GirFFI
|
|
34
31
|
method_name = try_in_ancestors(:setup_method, method.to_s)
|
35
32
|
|
36
33
|
unless method_name
|
37
|
-
raise
|
34
|
+
raise "Unable to set up method '#{method}' in #{self}"
|
38
35
|
end
|
39
36
|
|
40
37
|
send method_name, *arguments, &block
|
@@ -74,9 +71,9 @@ module GirFFI
|
|
74
71
|
# Wrap the passed pointer in an instance of the current class. Will not
|
75
72
|
# do any casting to subtypes.
|
76
73
|
def direct_wrap ptr
|
77
|
-
return nil if !ptr
|
74
|
+
return nil if !ptr || ptr.null?
|
78
75
|
obj = _real_new
|
79
|
-
obj.instance_variable_set :@struct, self::Struct.new(ptr
|
76
|
+
obj.instance_variable_set :@struct, self::Struct.new(ptr)
|
80
77
|
obj
|
81
78
|
end
|
82
79
|
|
data/lib/gir_ffi/enum_base.rb
CHANGED
data/lib/gir_ffi/g_type.rb
CHANGED
@@ -1,25 +1,27 @@
|
|
1
|
-
|
2
|
-
#
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
module GirFFI
|
2
|
+
# Wrapper class providing extended functionality for a GType, which is
|
3
|
+
# normally just a kind of integer
|
4
|
+
class GType
|
5
|
+
def initialize gtype
|
6
|
+
@gtype = gtype
|
7
|
+
end
|
7
8
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
def class_size
|
13
|
-
type_query.class_size
|
14
|
-
end
|
9
|
+
def to_i
|
10
|
+
@gtype
|
11
|
+
end
|
15
12
|
|
16
|
-
|
17
|
-
|
18
|
-
|
13
|
+
def class_size
|
14
|
+
type_query.class_size
|
15
|
+
end
|
16
|
+
|
17
|
+
def instance_size
|
18
|
+
type_query.instance_size
|
19
|
+
end
|
19
20
|
|
20
|
-
|
21
|
+
private
|
21
22
|
|
22
|
-
|
23
|
-
|
23
|
+
def type_query
|
24
|
+
@type_query ||= GObject.type_query @gtype
|
25
|
+
end
|
24
26
|
end
|
25
27
|
end
|
@@ -13,8 +13,6 @@ module GirFFI
|
|
13
13
|
super ptr
|
14
14
|
end
|
15
15
|
|
16
|
-
private :initialize
|
17
|
-
|
18
16
|
# TODO: Create type classes that extract values from pointers.
|
19
17
|
def to_value
|
20
18
|
case value_ffi_type
|
@@ -58,11 +56,11 @@ module GirFFI
|
|
58
56
|
end
|
59
57
|
|
60
58
|
def self.for type
|
61
|
-
new(type).tap {|ptr| ptr.clear}
|
59
|
+
new(type).tap { |ptr| ptr.clear }
|
62
60
|
end
|
63
61
|
|
64
62
|
def self.from type, value
|
65
|
-
new(type).tap {|ptr| ptr.set_value value}
|
63
|
+
new(type).tap { |ptr| ptr.set_value value }
|
66
64
|
end
|
67
65
|
|
68
66
|
private
|
data/lib/gir_ffi/in_pointer.rb
CHANGED
@@ -4,7 +4,7 @@ module GirFFI
|
|
4
4
|
# arrays, strings, or interfaces.
|
5
5
|
class InPointer < FFI::Pointer
|
6
6
|
def self.from_array type, ary
|
7
|
-
return
|
7
|
+
return unless ary
|
8
8
|
case type
|
9
9
|
when :utf8, :filename
|
10
10
|
from_utf8_array ary
|
@@ -30,7 +30,7 @@ module GirFFI
|
|
30
30
|
end
|
31
31
|
|
32
32
|
def self.from type, val
|
33
|
-
return
|
33
|
+
return unless val
|
34
34
|
case type
|
35
35
|
when :utf8, :filename
|
36
36
|
from_utf8 val
|
@@ -47,22 +47,23 @@ module GirFFI
|
|
47
47
|
|
48
48
|
class << self
|
49
49
|
def from_closure_data obj
|
50
|
-
FFI::Pointer.new(obj.object_id).tap
|
51
|
-
ArgHelper::OBJECT_STORE.store(ptr, obj)
|
50
|
+
FFI::Pointer.new(obj.object_id).tap do |ptr|
|
51
|
+
ArgHelper::OBJECT_STORE.store(ptr, obj)
|
52
|
+
end
|
52
53
|
end
|
53
54
|
|
54
55
|
private
|
55
56
|
|
56
57
|
def from_utf8_array ary
|
57
|
-
from_basic_type_array :pointer, ary.map {|str| from_utf8 str}
|
58
|
+
from_basic_type_array :pointer, ary.map { |str| from_utf8 str }
|
58
59
|
end
|
59
60
|
|
60
61
|
def from_boolean_array ary
|
61
|
-
from_basic_type_array :int, ary.map {|val| val ? 1 : 0}
|
62
|
+
from_basic_type_array :int, ary.map { |val| val ? 1 : 0 }
|
62
63
|
end
|
63
64
|
|
64
65
|
def from_pointer_array type, ary
|
65
|
-
from_basic_type_array :pointer, ary.map {|elem| from type, elem }
|
66
|
+
from_basic_type_array :pointer, ary.map { |elem| from type, elem }
|
66
67
|
end
|
67
68
|
|
68
69
|
def from_gvalue_array type, ary
|
@@ -90,7 +91,7 @@ module GirFFI
|
|
90
91
|
end
|
91
92
|
|
92
93
|
def from_enum_array type, ary
|
93
|
-
from_basic_type_array :int32, ary.map {|sym| type.to_native sym, nil }
|
94
|
+
from_basic_type_array :int32, ary.map { |sym| type.to_native sym, nil }
|
94
95
|
end
|
95
96
|
|
96
97
|
def from_utf8 str
|
@@ -14,13 +14,13 @@ module GirFFI
|
|
14
14
|
bldr.build_class.new(&block)
|
15
15
|
end
|
16
16
|
|
17
|
-
# TODO: Use argument info to convert out arguments and array lengths.
|
18
17
|
def arguments_to_gvalues instance, arguments
|
19
|
-
|
20
|
-
|
18
|
+
arg_g_values = args.map { |info| info.argument_type.make_g_value }
|
19
|
+
arg_g_values.zip(arguments).each do |g_value, arg|
|
20
|
+
g_value.set_value arg
|
21
21
|
end
|
22
22
|
|
23
|
-
|
23
|
+
arg_g_values.unshift GObject::Value.wrap_instance(instance)
|
24
24
|
end
|
25
25
|
|
26
26
|
def gvalue_for_return_value
|
@@ -4,7 +4,6 @@ module GirFFI
|
|
4
4
|
module InfoExt
|
5
5
|
# Extensions for GObjectIntrospection::ITypeInfo needed by GirFFI
|
6
6
|
module ITypeInfo
|
7
|
-
|
8
7
|
def self.flattened_tag_to_gtype_map
|
9
8
|
@flattened_tag_to_gtype_map ||= {
|
10
9
|
array: GObject::TYPE_ARRAY,
|
@@ -22,10 +21,11 @@ module GirFFI
|
|
22
21
|
|
23
22
|
def g_type
|
24
23
|
if tag == :interface
|
25
|
-
interface.g_type
|
24
|
+
return interface.g_type
|
25
|
+
elsif (type = ITypeInfo.flattened_tag_to_gtype_map[flattened_tag])
|
26
|
+
return type
|
26
27
|
else
|
27
|
-
|
28
|
-
raise "Can't find type for #{flattened_tag} pointer? = #{pointer?}"
|
28
|
+
raise "Can't find GType for #{flattened_tag} pointer? = #{pointer?}"
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
@@ -36,7 +36,7 @@ module GirFFI
|
|
36
36
|
def element_type
|
37
37
|
case tag
|
38
38
|
when :glist, :gslist, :array, :c
|
39
|
-
enumerable_element_type
|
39
|
+
enumerable_element_type
|
40
40
|
when :ghash
|
41
41
|
dictionary_element_type
|
42
42
|
else
|
@@ -197,7 +197,7 @@ module GirFFI
|
|
197
197
|
subtype = param_type(index).to_ffitype
|
198
198
|
if subtype == :pointer
|
199
199
|
# NOTE: Don't use pointer directly to appease JRuby.
|
200
|
-
:"uint#{FFI.type_size(:pointer)*8}"
|
200
|
+
:"uint#{FFI.type_size(:pointer) * 8}"
|
201
201
|
else
|
202
202
|
subtype
|
203
203
|
end
|
data/lib/gir_ffi/module_base.rb
CHANGED
@@ -11,14 +11,15 @@ module GirFFI
|
|
11
11
|
load_class(classname) || super
|
12
12
|
end
|
13
13
|
|
14
|
+
# @deprecated The load_class method should always be used. Remove in 0.8.0
|
14
15
|
def setup_class classname
|
15
16
|
gir_ffi_builder.build_namespaced_class classname.to_s
|
16
17
|
end
|
17
18
|
|
18
|
-
|
19
|
+
alias_method :load_class, :setup_class
|
19
20
|
|
20
21
|
def gir_ffi_builder
|
21
|
-
|
22
|
+
self::GIR_FFI_BUILDER
|
22
23
|
end
|
23
24
|
|
24
25
|
def setup_method name
|
data/lib/gir_ffi/object_base.rb
CHANGED
data/lib/gir_ffi/struct_base.rb
CHANGED
@@ -21,7 +21,7 @@ module GirFFI
|
|
21
21
|
pointer.to_ptr
|
22
22
|
end
|
23
23
|
|
24
|
-
def self.copy_value_to_pointer value, pointer, offset=0
|
24
|
+
def self.copy_value_to_pointer value, pointer, offset = 0
|
25
25
|
size = self::Struct.size
|
26
26
|
pointer.put_bytes offset, value.to_ptr.read_bytes(size), 0, size
|
27
27
|
end
|
data/lib/gir_ffi/type_base.rb
CHANGED
data/lib/gir_ffi/version.rb
CHANGED
@@ -17,7 +17,8 @@ module GLib
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def each
|
20
|
-
|
20
|
+
return if @ptr.null?
|
21
|
+
reset_iterator
|
21
22
|
while (ptr = next_ptr)
|
22
23
|
yield ptr.read_string
|
23
24
|
end
|
@@ -30,7 +31,6 @@ module GLib
|
|
30
31
|
private
|
31
32
|
|
32
33
|
def reset_iterator
|
33
|
-
return if @ptr.null?
|
34
34
|
@offset = 0
|
35
35
|
end
|
36
36
|
|
data/lib/gir_ffi.rb
CHANGED
@@ -20,7 +20,7 @@ require 'gir_ffi/version'
|
|
20
20
|
# Main module containing classes and modules needed for generating GLib and
|
21
21
|
# GObject bindings.
|
22
22
|
module GirFFI
|
23
|
-
def self.setup module_name, version=nil
|
23
|
+
def self.setup module_name, version = nil
|
24
24
|
module_name = module_name.to_s
|
25
25
|
GirFFI::Builder.build_module module_name, version
|
26
26
|
end
|
data/test/ffi-glib/array_test.rb
CHANGED
@@ -153,4 +153,32 @@ describe GLib::Array do
|
|
153
153
|
proc { arr.index(-1) }.must_raise IndexError
|
154
154
|
end
|
155
155
|
end
|
156
|
+
|
157
|
+
describe "#reset_typespec" do
|
158
|
+
describe "when it needs to guess the type" do
|
159
|
+
it "guesses :uint8 for size 1" do
|
160
|
+
arr = GLib::Array.from :int8, [1, 2, 3]
|
161
|
+
arr.reset_typespec
|
162
|
+
arr.element_type.must_equal :uint8
|
163
|
+
end
|
164
|
+
|
165
|
+
it "guesses :uint16 for size 2" do
|
166
|
+
arr = GLib::Array.from :int16, [1, 2, 3]
|
167
|
+
arr.reset_typespec
|
168
|
+
arr.element_type.must_equal :uint16
|
169
|
+
end
|
170
|
+
|
171
|
+
it "guesses :uint32 for size 4" do
|
172
|
+
arr = GLib::Array.from :int32, [1, 2, 3]
|
173
|
+
arr.reset_typespec
|
174
|
+
arr.element_type.must_equal :uint32
|
175
|
+
end
|
176
|
+
|
177
|
+
it "guesses :uint64 for size 8" do
|
178
|
+
arr = GLib::Array.from :int64, [1, 2, 3]
|
179
|
+
arr.reset_typespec
|
180
|
+
arr.element_type.must_equal :uint64
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
156
184
|
end
|