gir_ffi 0.13.0 → 0.13.1
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 +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
|