gir_ffi 0.13.0 → 0.13.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changelog.md +10 -0
- data/lib/ffi-glib/array.rb +2 -2
- data/lib/ffi-glib/array_methods.rb +1 -0
- data/lib/ffi-glib/list_methods.rb +3 -2
- data/lib/ffi-glib/main_loop.rb +2 -0
- data/lib/ffi-glib/ptr_array.rb +2 -2
- data/lib/ffi-gobject.rb +3 -11
- data/lib/ffi-gobject/closure.rb +1 -0
- data/lib/ffi-gobject/object.rb +30 -16
- data/lib/ffi-gobject/object_class.rb +2 -2
- data/lib/ffi-gobject/ruby_closure.rb +2 -2
- data/lib/ffi-gobject/value.rb +2 -1
- data/lib/ffi-gobject_introspection/i_arg_info.rb +11 -11
- data/lib/ffi-gobject_introspection/i_base_info.rb +12 -10
- data/lib/ffi-gobject_introspection/i_callable_info.rb +8 -8
- data/lib/ffi-gobject_introspection/i_enum_info.rb +5 -5
- data/lib/ffi-gobject_introspection/i_field_info.rb +4 -4
- data/lib/ffi-gobject_introspection/i_function_info.rb +2 -2
- data/lib/ffi-gobject_introspection/i_interface_info.rb +15 -15
- data/lib/ffi-gobject_introspection/i_object_info.rb +22 -22
- data/lib/ffi-gobject_introspection/i_property_info.rb +2 -2
- data/lib/ffi-gobject_introspection/i_registered_type_info.rb +3 -3
- data/lib/ffi-gobject_introspection/i_repository.rb +16 -10
- data/lib/ffi-gobject_introspection/i_struct_info.rb +11 -7
- data/lib/ffi-gobject_introspection/i_type_info.rb +8 -8
- data/lib/ffi-gobject_introspection/i_union_info.rb +7 -7
- data/lib/ffi-gobject_introspection/i_value_info.rb +1 -1
- data/lib/ffi-gobject_introspection/strv.rb +1 -0
- data/lib/gir_ffi-base/gobject.rb +5 -0
- data/lib/gir_ffi-base/gobject/lib.rb +4 -0
- data/lib/gir_ffi/boolean.rb +2 -2
- data/lib/gir_ffi/builders/argument_builder.rb +41 -14
- data/lib/gir_ffi/builders/argument_builder_collection.rb +17 -4
- data/lib/gir_ffi/builders/base_argument_builder.rb +12 -16
- data/lib/gir_ffi/builders/callback_argument_builder.rb +1 -1
- data/lib/gir_ffi/builders/callback_builder.rb +1 -1
- data/lib/gir_ffi/builders/closure_to_pointer_convertor.rb +2 -9
- data/lib/gir_ffi/builders/field_builder.rb +11 -9
- data/lib/gir_ffi/builders/module_builder.rb +2 -1
- data/lib/gir_ffi/builders/object_builder.rb +21 -12
- data/lib/gir_ffi/builders/pointer_value_convertor.rb +8 -6
- data/lib/gir_ffi/builders/property_builder.rb +4 -2
- data/lib/gir_ffi/builders/registered_type_builder.rb +30 -19
- data/lib/gir_ffi/builders/return_value_builder.rb +2 -2
- data/lib/gir_ffi/builders/ruby_to_c_convertor.rb +2 -0
- data/lib/gir_ffi/builders/signal_closure_builder.rb +1 -1
- data/lib/gir_ffi/builders/struct_builder.rb +7 -8
- data/lib/gir_ffi/builders/unintrospectable_builder.rb +4 -1
- data/lib/gir_ffi/builders/user_defined_builder.rb +31 -95
- data/lib/gir_ffi/builders/vfunc_builder.rb +1 -1
- data/lib/gir_ffi/builders/with_layout.rb +3 -1
- data/lib/gir_ffi/callback_base.rb +3 -2
- data/lib/gir_ffi/class_base.rb +5 -0
- data/lib/gir_ffi/enum_like_base.rb +9 -5
- data/lib/gir_ffi/error_argument_info.rb +1 -1
- data/lib/gir_ffi/ffi_ext/pointer.rb +1 -4
- data/lib/gir_ffi/field_argument_info.rb +1 -1
- data/lib/gir_ffi/in_pointer.rb +36 -23
- data/lib/gir_ffi/info_ext/i_arg_info.rb +2 -0
- data/lib/gir_ffi/info_ext/i_callback_info.rb +4 -0
- data/lib/gir_ffi/info_ext/i_registered_type_info.rb +4 -0
- data/lib/gir_ffi/info_ext/i_type_info.rb +3 -27
- data/lib/gir_ffi/info_ext/safe_function_name.rb +1 -0
- data/lib/gir_ffi/interface_base.rb +5 -0
- data/lib/gir_ffi/module_base.rb +1 -0
- data/lib/gir_ffi/object_base.rb +10 -0
- data/lib/gir_ffi/object_store.rb +2 -0
- data/lib/gir_ffi/receiver_argument_info.rb +1 -1
- data/lib/gir_ffi/return_value_info.rb +1 -1
- data/lib/gir_ffi/sized_array.rb +7 -14
- data/lib/gir_ffi/struct_like_base.rb +3 -0
- data/lib/gir_ffi/type_map.rb +21 -0
- data/lib/gir_ffi/user_defined_object_info.rb +6 -2
- data/lib/gir_ffi/user_defined_property_info.rb +113 -71
- data/lib/gir_ffi/version.rb +1 -1
- data/lib/gir_ffi/zero_terminated.rb +26 -1
- data/tasks/test.rake +1 -0
- data/test/ffi-gobject_introspection/i_repository_test.rb +1 -2
- data/test/gir_ffi/builder_test.rb +13 -7
- data/test/gir_ffi/builders/argument_builder_test.rb +1 -5
- data/test/gir_ffi/builders/callback_return_value_builder_test.rb +1 -1
- data/test/gir_ffi/builders/field_builder_test.rb +20 -20
- data/test/gir_ffi/builders/return_value_builder_test.rb +1 -1
- data/test/gir_ffi/builders/signal_closure_builder_test.rb +1 -1
- data/test/gir_ffi/builders/unintrospectable_boxed_builder_test.rb +1 -1
- data/test/gir_ffi/builders/unintrospectable_builder_test.rb +2 -2
- data/test/gir_ffi/builders/vfunc_builder_test.rb +1 -1
- data/test/gir_ffi/enum_base_test.rb +43 -0
- data/test/gir_ffi/info_ext/i_type_info_test.rb +3 -9
- data/test/gir_ffi/object_base_test.rb +30 -0
- data/test/gir_ffi/sized_array_test.rb +0 -9
- data/test/gir_ffi/user_defined_object_info_test.rb +4 -6
- data/test/gir_ffi/user_defined_property_info_test.rb +6 -5
- data/test/gir_ffi/zero_terminated_test.rb +22 -0
- data/test/gir_ffi_test_helper.rb +2 -0
- data/test/integration/generated_gimarshallingtests_test.rb +1 -0
- data/test/integration/generated_gio_test.rb +5 -6
- data/test/integration/generated_gobject_test.rb +1 -1
- data/test/integration/generated_gtop_test.rb +3 -1
- data/test/integration/generated_regress_test.rb +3 -4
- metadata +3 -2
@@ -17,6 +17,7 @@ module GirFFI
|
|
17
17
|
# TODO: Return instance of this class
|
18
18
|
def self.from_native(value, _context)
|
19
19
|
return nil if !value || value.null?
|
20
|
+
|
20
21
|
FFI::Function.new(gir_ffi_builder.return_ffi_type,
|
21
22
|
gir_ffi_builder.argument_ffi_types, value)
|
22
23
|
end
|
@@ -80,8 +81,8 @@ module GirFFI
|
|
80
81
|
to_native.to_ptr
|
81
82
|
end
|
82
83
|
|
83
|
-
def self.copy_value_to_pointer(value, pointer)
|
84
|
-
pointer.put_pointer
|
84
|
+
def self.copy_value_to_pointer(value, pointer, offset = 0)
|
85
|
+
pointer.put_pointer offset, to_native(value, nil)
|
85
86
|
end
|
86
87
|
|
87
88
|
def self.get_value_from_pointer(pointer, offset)
|
data/lib/gir_ffi/class_base.rb
CHANGED
@@ -56,6 +56,10 @@ module GirFFI
|
|
56
56
|
self::Struct
|
57
57
|
end
|
58
58
|
|
59
|
+
def self.to_callback_ffi_type
|
60
|
+
:pointer
|
61
|
+
end
|
62
|
+
|
59
63
|
# Wrap the passed pointer in an instance of the current class, or a
|
60
64
|
# descendant type if applicable.
|
61
65
|
def self.wrap(ptr)
|
@@ -66,6 +70,7 @@ module GirFFI
|
|
66
70
|
# do any casting to subtypes or additional processing.
|
67
71
|
def self.direct_wrap(ptr)
|
68
72
|
return nil if !ptr || ptr.null?
|
73
|
+
|
69
74
|
obj = allocate
|
70
75
|
obj.__send__ :assign_pointer, ptr
|
71
76
|
obj
|
@@ -11,19 +11,19 @@ module GirFFI
|
|
11
11
|
include MethodSetup
|
12
12
|
|
13
13
|
def wrap(arg)
|
14
|
-
|
14
|
+
from_native arg, nil
|
15
15
|
end
|
16
16
|
|
17
|
-
def
|
18
|
-
|
17
|
+
def to_int(arg)
|
18
|
+
to_native arg, nil
|
19
19
|
end
|
20
20
|
|
21
21
|
def size
|
22
22
|
native_type.size
|
23
23
|
end
|
24
24
|
|
25
|
-
def copy_value_to_pointer(value, pointer)
|
26
|
-
pointer.put_int32
|
25
|
+
def copy_value_to_pointer(value, pointer, offset = 0)
|
26
|
+
pointer.put_int32 offset, to_native(value, nil)
|
27
27
|
end
|
28
28
|
|
29
29
|
def get_value_from_pointer(pointer, offset)
|
@@ -41,5 +41,9 @@ module GirFFI
|
|
41
41
|
def to_ffi_type
|
42
42
|
self
|
43
43
|
end
|
44
|
+
|
45
|
+
def to_callback_ffi_type
|
46
|
+
:int32
|
47
|
+
end
|
44
48
|
end
|
45
49
|
end
|
@@ -8,13 +8,10 @@ module GirFFI
|
|
8
8
|
self
|
9
9
|
end
|
10
10
|
|
11
|
-
def zero?
|
12
|
-
null?
|
13
|
-
end
|
14
|
-
|
15
11
|
# FIXME: Should probably not be here.
|
16
12
|
def to_object
|
17
13
|
return nil if null?
|
14
|
+
|
18
15
|
gtype = GObject.type_from_instance_pointer self
|
19
16
|
Builder.build_by_gtype(gtype).direct_wrap self
|
20
17
|
end
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module GirFFI
|
4
4
|
# Class to represent argument info for the argument of a setter method.
|
5
|
-
# Implements the necessary parts of
|
5
|
+
# Implements the necessary parts of IArgInfo's interface.
|
6
6
|
# TODO: Rename and add direction argument or subclass
|
7
7
|
class FieldArgumentInfo
|
8
8
|
attr_reader :name, :argument_type
|
data/lib/gir_ffi/in_pointer.rb
CHANGED
@@ -7,24 +7,16 @@ module GirFFI
|
|
7
7
|
module InPointer
|
8
8
|
def self.from_array(type, ary)
|
9
9
|
return unless ary
|
10
|
+
|
10
11
|
case type
|
11
|
-
when :utf8, :filename
|
12
|
-
from_utf8_array ary
|
13
|
-
when :gboolean
|
14
|
-
from_boolean_array ary
|
15
12
|
when Symbol
|
16
|
-
|
17
|
-
when Class
|
18
|
-
if type == GObject::Value
|
19
|
-
from_gvalue_array type, ary
|
20
|
-
else
|
21
|
-
from_struct_array type, ary
|
22
|
-
end
|
13
|
+
from_simple_type_array type, ary
|
23
14
|
when Module
|
24
|
-
|
15
|
+
from_module_type_array type, ary
|
25
16
|
when Array
|
26
17
|
main_type, sub_type = *type
|
27
18
|
raise "Unexpected main type #{main_type}" if main_type != :pointer
|
19
|
+
|
28
20
|
from_pointer_array sub_type, ary
|
29
21
|
else
|
30
22
|
raise NotImplementedError, type
|
@@ -33,6 +25,7 @@ module GirFFI
|
|
33
25
|
|
34
26
|
def self.from(type, val)
|
35
27
|
return unless val
|
28
|
+
|
36
29
|
case type
|
37
30
|
when :utf8, :filename
|
38
31
|
from_utf8 val
|
@@ -47,9 +40,40 @@ module GirFFI
|
|
47
40
|
end
|
48
41
|
end
|
49
42
|
|
43
|
+
def self.from_utf8(str)
|
44
|
+
return unless str
|
45
|
+
|
46
|
+
ptr = FFI::MemoryPointer.from_string(str)
|
47
|
+
ptr.autorelease = false
|
48
|
+
ptr
|
49
|
+
end
|
50
|
+
|
50
51
|
class << self
|
51
52
|
private
|
52
53
|
|
54
|
+
def from_simple_type_array(type, ary)
|
55
|
+
case type
|
56
|
+
when :utf8, :filename
|
57
|
+
from_utf8_array ary
|
58
|
+
when :gboolean
|
59
|
+
from_boolean_array ary
|
60
|
+
else
|
61
|
+
from_basic_type_array type, ary
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def from_module_type_array(type, ary)
|
66
|
+
if type == GObject::Value
|
67
|
+
from_gvalue_array type, ary
|
68
|
+
elsif type < GirFFI::ClassBase
|
69
|
+
from_struct_array type, ary
|
70
|
+
elsif type.singleton_class.include? GirFFI::EnumBase
|
71
|
+
from_enum_array type, ary
|
72
|
+
else
|
73
|
+
raise NotImplementedError, type
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
53
77
|
def from_utf8_array(ary)
|
54
78
|
from_basic_type_array :pointer, ary.map { |str| from_utf8 str }
|
55
79
|
end
|
@@ -90,17 +114,6 @@ module GirFFI
|
|
90
114
|
from_basic_type_array :int32, ary.map { |sym| type.to_native sym, nil }
|
91
115
|
end
|
92
116
|
|
93
|
-
public
|
94
|
-
|
95
|
-
def from_utf8(str)
|
96
|
-
return unless str
|
97
|
-
ptr = FFI::MemoryPointer.from_string(str)
|
98
|
-
ptr.autorelease = false
|
99
|
-
ptr
|
100
|
-
end
|
101
|
-
|
102
|
-
private
|
103
|
-
|
104
117
|
def from_basic_type_array(type, ary)
|
105
118
|
ffi_type = TypeMap.type_specification_to_ffi_type type
|
106
119
|
type_size = FFI.type_size(ffi_type)
|
@@ -6,11 +6,13 @@ module GirFFI
|
|
6
6
|
module IArgInfo
|
7
7
|
def to_ffi_type
|
8
8
|
return :pointer if direction != :in
|
9
|
+
|
9
10
|
argument_type.to_ffi_type
|
10
11
|
end
|
11
12
|
|
12
13
|
def to_callback_ffi_type
|
13
14
|
return :pointer if direction != :in
|
15
|
+
|
14
16
|
argument_type.to_callback_ffi_type
|
15
17
|
end
|
16
18
|
end
|
@@ -6,26 +6,8 @@ module GirFFI
|
|
6
6
|
module InfoExt
|
7
7
|
# Extensions for GObjectIntrospection::ITypeInfo needed by GirFFI
|
8
8
|
module ITypeInfo
|
9
|
-
def self.flattened_tag_to_gtype_map
|
10
|
-
@flattened_tag_to_gtype_map ||= {
|
11
|
-
[:array, true] => GObject::TYPE_ARRAY,
|
12
|
-
[:c, true] => GObject::TYPE_POINTER,
|
13
|
-
[:gboolean, false] => GObject::TYPE_BOOLEAN,
|
14
|
-
[:ghash, true] => GObject::TYPE_HASH_TABLE,
|
15
|
-
[:glist, true] => GObject::TYPE_POINTER,
|
16
|
-
[:gint32, false] => GObject::TYPE_INT,
|
17
|
-
[:gint64, false] => GObject::TYPE_INT64,
|
18
|
-
[:guint64, false] => GObject::TYPE_UINT64,
|
19
|
-
[:strv, true] => GObject::TYPE_STRV,
|
20
|
-
[:utf8, true] => GObject::TYPE_STRING,
|
21
|
-
[:void, true] => GObject::TYPE_POINTER,
|
22
|
-
[:void, false] => GObject::TYPE_NONE
|
23
|
-
}.freeze
|
24
|
-
end
|
25
|
-
|
26
9
|
def gtype
|
27
|
-
|
28
|
-
ITypeInfo.flattened_tag_to_gtype_map.fetch [flattened_tag, pointer?]
|
10
|
+
TypeMap.type_info_to_gtype self
|
29
11
|
end
|
30
12
|
|
31
13
|
def make_g_value
|
@@ -57,7 +39,7 @@ module GirFFI
|
|
57
39
|
end
|
58
40
|
|
59
41
|
def hidden_struct_type?
|
60
|
-
flattened_tag == :struct && interface.
|
42
|
+
flattened_tag == :struct && interface.empty?
|
61
43
|
end
|
62
44
|
|
63
45
|
def tag_or_class
|
@@ -123,13 +105,7 @@ module GirFFI
|
|
123
105
|
|
124
106
|
case tag
|
125
107
|
when :interface
|
126
|
-
|
127
|
-
case interface.info_type
|
128
|
-
when :enum, :flags
|
129
|
-
:int32
|
130
|
-
else
|
131
|
-
:pointer
|
132
|
-
end
|
108
|
+
interface.to_callback_ffi_type
|
133
109
|
when :gboolean
|
134
110
|
# TODO: Move this logic into TypeMap
|
135
111
|
:bool
|
@@ -14,6 +14,7 @@ module GirFFI
|
|
14
14
|
def setup_and_call(method, arguments, &block)
|
15
15
|
method_name = setup_method method.to_s
|
16
16
|
raise NoMethodError, "undefined method `#{method}' for #{self}" unless method_name
|
17
|
+
|
17
18
|
send method_name, *arguments, &block
|
18
19
|
end
|
19
20
|
|
@@ -24,5 +25,9 @@ module GirFFI
|
|
24
25
|
def to_ffi_type
|
25
26
|
:pointer
|
26
27
|
end
|
28
|
+
|
29
|
+
def to_callback_ffi_type
|
30
|
+
:pointer
|
31
|
+
end
|
27
32
|
end
|
28
33
|
end
|
data/lib/gir_ffi/module_base.rb
CHANGED
data/lib/gir_ffi/object_base.rb
CHANGED
@@ -72,5 +72,15 @@ module GirFFI
|
|
72
72
|
gir_ffi_builder.object_class_struct.wrap ptr
|
73
73
|
end
|
74
74
|
end
|
75
|
+
|
76
|
+
def self.included_interfaces
|
77
|
+
included_modules.select { |it| it.singleton_class.include? InterfaceBase }
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.registered_ancestors
|
81
|
+
ancestors.select do |it|
|
82
|
+
it < GirFFI::ObjectBase || it.singleton_class.include?(InterfaceBase)
|
83
|
+
end
|
84
|
+
end
|
75
85
|
end
|
76
86
|
end
|
data/lib/gir_ffi/object_store.rb
CHANGED
@@ -10,6 +10,7 @@ module GirFFI
|
|
10
10
|
|
11
11
|
def store(obj)
|
12
12
|
return FFI::Pointer::NULL if obj.nil?
|
13
|
+
|
13
14
|
# FIXME: Don't use object_id!
|
14
15
|
key = obj.object_id
|
15
16
|
@store[key] = obj
|
@@ -18,6 +19,7 @@ module GirFFI
|
|
18
19
|
|
19
20
|
def fetch(ptr)
|
20
21
|
return if ptr.null?
|
22
|
+
|
21
23
|
key = ptr.address
|
22
24
|
if @store.key? key
|
23
25
|
@store[key]
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module GirFFI
|
4
4
|
# Class to represent the info for the receiver argument of a callback or
|
5
|
-
# signal handler. Implements the necessary parts of
|
5
|
+
# signal handler. Implements the necessary parts of IArgInfo's
|
6
6
|
# interface.
|
7
7
|
class ReceiverArgumentInfo
|
8
8
|
attr_reader :argument_type
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module GirFFI
|
4
|
-
# Represents a return value with the same interface as
|
4
|
+
# Represents a return value with the same interface as IArgInfo
|
5
5
|
class ReturnValueInfo
|
6
6
|
attr_reader :argument_type
|
7
7
|
attr_reader :ownership_transfer
|
data/lib/gir_ffi/sized_array.rb
CHANGED
@@ -39,9 +39,9 @@ module GirFFI
|
|
39
39
|
pointer + offset
|
40
40
|
end
|
41
41
|
|
42
|
-
def self.copy_value_to_pointer(value, pointer)
|
42
|
+
def self.copy_value_to_pointer(value, pointer, offset = 0)
|
43
43
|
size = value.size_in_bytes
|
44
|
-
pointer.put_bytes(
|
44
|
+
pointer.put_bytes(offset, value.to_ptr.read_bytes(size))
|
45
45
|
end
|
46
46
|
|
47
47
|
def self.wrap(element_type, size, pointer)
|
@@ -72,24 +72,17 @@ module GirFFI
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
-
def copy_from(element_type, size,
|
76
|
-
return unless
|
75
|
+
def copy_from(element_type, size, enumerable)
|
76
|
+
return unless enumerable
|
77
77
|
|
78
|
-
|
79
|
-
when FFI::Pointer
|
80
|
-
wrap(element_type, size, item).to_a
|
81
|
-
when self
|
82
|
-
item.to_a
|
83
|
-
else
|
84
|
-
item
|
85
|
-
end
|
78
|
+
arr = enumerable.to_a
|
86
79
|
case element_type
|
87
80
|
when Array
|
88
81
|
_main_type, sub_type = *element_type
|
89
|
-
|
82
|
+
arr = arr.map { |it| sub_type.copy_from it }
|
90
83
|
end
|
91
84
|
|
92
|
-
from_enumerable element_type, size,
|
85
|
+
from_enumerable element_type, size, arr
|
93
86
|
end
|
94
87
|
|
95
88
|
private
|