gir_ffi 0.7.3 → 0.7.4
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/Rakefile +9 -1
- data/TODO.md +4 -0
- data/lib/ffi-glib.rb +5 -0
- data/lib/ffi-glib/bytes.rb +49 -0
- data/lib/ffi-glib/container_class_methods.rb +1 -4
- data/lib/ffi-glib/error.rb +17 -0
- data/lib/ffi-gobject/value.rb +6 -3
- data/lib/ffi-gobject_introspection/i_callback_info.rb +0 -1
- data/lib/ffi-gobject_introspection/i_constant_info.rb +10 -10
- data/lib/ffi-gobject_introspection/i_repository.rb +20 -20
- data/lib/ffi-gobject_introspection/i_vfunc_info.rb +7 -0
- data/lib/ffi-gobject_introspection/lib.rb +1 -7
- data/lib/gir_ffi/arg_helper.rb +23 -2
- data/lib/gir_ffi/builders/argument_builder.rb +15 -1
- data/lib/gir_ffi/builders/base_argument_builder.rb +1 -0
- data/lib/gir_ffi/builders/callback_argument_builder.rb +49 -7
- data/lib/gir_ffi/builders/callback_return_value_builder.rb +6 -2
- data/lib/gir_ffi/builders/closure_convertor.rb +1 -1
- data/lib/gir_ffi/builders/null_convertor.rb +1 -0
- data/lib/gir_ffi/builders/property_builder.rb +1 -1
- data/lib/gir_ffi/builders/return_value_builder.rb +1 -1
- data/lib/gir_ffi/builders/type_builder.rb +9 -9
- data/lib/gir_ffi/builders/vfunc_builder.rb +3 -1
- data/lib/gir_ffi/callback_base.rb +6 -0
- data/lib/gir_ffi/error_argument_info.rb +12 -3
- data/lib/gir_ffi/error_type_info.rb +21 -0
- data/lib/gir_ffi/ffi_ext/pointer.rb +5 -6
- data/lib/gir_ffi/glib_error.rb +18 -0
- data/lib/gir_ffi/in_pointer.rb +1 -1
- data/lib/gir_ffi/info_ext/i_type_info.rb +44 -30
- data/lib/gir_ffi/info_ext/i_vfunc_info.rb +13 -1
- data/lib/gir_ffi/type_map.rb +30 -29
- data/lib/gir_ffi/user_defined_type_info.rb +1 -0
- data/lib/gir_ffi/version.rb +1 -1
- data/lib/gir_ffi/vfunc_base.rb +1 -0
- data/lib/gir_ffi/zero_terminated.rb +3 -8
- data/test/base_test_helper.rb +1 -0
- data/test/ffi-glib/array_test.rb +2 -2
- data/test/ffi-glib/bytes_test.rb +54 -0
- data/test/ffi-glib/ptr_array_test.rb +2 -2
- data/test/ffi-gobject/value_test.rb +4 -4
- data/test/ffi-gobject_introspection/i_repository_test.rb +1 -1
- data/test/gir_ffi/builders/callback_argument_builder_test.rb +44 -0
- data/test/gir_ffi/builders/callback_builder_test.rb +1 -1
- data/test/gir_ffi/builders/callback_return_value_builder_test.rb +74 -0
- data/test/gir_ffi/builders/function_builder_test.rb +23 -2
- data/test/gir_ffi/builders/property_builder_test.rb +15 -0
- data/test/gir_ffi/builders/return_value_builder_test.rb +26 -26
- data/test/gir_ffi/builders/signal_builder_test.rb +5 -5
- data/test/gir_ffi/builders/union_builder_test.rb +2 -1
- data/test/gir_ffi/builders/vfunc_builder_test.rb +125 -4
- data/test/gir_ffi/error_type_info_test.rb +48 -0
- data/test/gir_ffi/in_pointer_test.rb +1 -1
- data/test/gir_ffi/sized_array_test.rb +2 -2
- data/test/integration/generated_gimarshallingtests_test.rb +199 -31
- data/test/integration/generated_regress_test.rb +37 -33
- metadata +214 -202
@@ -30,7 +30,11 @@ module GirFFI
|
|
30
30
|
|
31
31
|
def post_conversion
|
32
32
|
if has_post_conversion?
|
33
|
-
|
33
|
+
if type_info.flattened_tag == :object
|
34
|
+
[ "#{post_converted_name} = #{post_convertor.conversion}.to_ptr" ]
|
35
|
+
else
|
36
|
+
[ "#{post_converted_name} = #{post_convertor.conversion}" ]
|
37
|
+
end
|
34
38
|
else
|
35
39
|
[]
|
36
40
|
end
|
@@ -39,7 +43,7 @@ module GirFFI
|
|
39
43
|
private
|
40
44
|
|
41
45
|
def has_post_conversion?
|
42
|
-
type_info.
|
46
|
+
type_info.needs_c_to_ruby_conversion_for_callbacks?
|
43
47
|
end
|
44
48
|
|
45
49
|
def post_convertor
|
@@ -17,15 +17,15 @@ module GirFFI
|
|
17
17
|
CACHE = {}
|
18
18
|
|
19
19
|
TYPE_MAP = {
|
20
|
-
:
|
21
|
-
:
|
22
|
-
:
|
23
|
-
:
|
24
|
-
:
|
25
|
-
:
|
26
|
-
:
|
27
|
-
:
|
28
|
-
:
|
20
|
+
callback: CallbackBuilder,
|
21
|
+
constant: ConstantBuilder,
|
22
|
+
enum: EnumBuilder,
|
23
|
+
flags: EnumBuilder,
|
24
|
+
interface: InterfaceBuilder,
|
25
|
+
object: ObjectBuilder,
|
26
|
+
struct: StructBuilder,
|
27
|
+
union: UnionBuilder,
|
28
|
+
unintrospectable: UnintrospectableBuilder
|
29
29
|
}
|
30
30
|
|
31
31
|
def self.build info
|
@@ -25,6 +25,7 @@ module GirFFI
|
|
25
25
|
|
26
26
|
def mapping_method_definition
|
27
27
|
arg_infos = info.args
|
28
|
+
arg_infos << ErrorArgumentInfo.new if info.throws?
|
28
29
|
|
29
30
|
receiver_info = ReceiverArgumentInfo.new(receiver_type_info)
|
30
31
|
|
@@ -46,7 +47,8 @@ module GirFFI
|
|
46
47
|
end
|
47
48
|
|
48
49
|
def argument_ffi_types
|
49
|
-
@argument_ffi_types ||= info.argument_ffi_types.
|
50
|
+
@argument_ffi_types ||= info.argument_ffi_types.
|
51
|
+
unshift(receiver_type_info.to_callback_ffitype)
|
50
52
|
end
|
51
53
|
|
52
54
|
def return_ffi_type
|
@@ -2,6 +2,8 @@ require 'gir_ffi/type_base'
|
|
2
2
|
|
3
3
|
module GirFFI
|
4
4
|
# Base module for callbacks.
|
5
|
+
# NOTE: Another option would be to derive this class from FFI::Function,
|
6
|
+
# allowing a more natural implementation of from_native, to_native and wrap.
|
5
7
|
class CallbackBase < Proc
|
6
8
|
extend TypeBase
|
7
9
|
extend FFI::DataConverter
|
@@ -22,6 +24,10 @@ module GirFFI
|
|
22
24
|
value.to_native
|
23
25
|
end
|
24
26
|
|
27
|
+
def self.wrap ptr
|
28
|
+
from_native ptr, nil
|
29
|
+
end
|
30
|
+
|
25
31
|
CALLBACKS = []
|
26
32
|
|
27
33
|
def self.store_callback prc
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'gir_ffi/error_type_info'
|
2
|
+
|
1
3
|
module GirFFI
|
2
4
|
# Represents an error argument with the same interface as IArgumentInfo
|
3
5
|
class ErrorArgumentInfo
|
@@ -10,12 +12,19 @@ module GirFFI
|
|
10
12
|
end
|
11
13
|
|
12
14
|
def argument_type
|
13
|
-
|
15
|
+
@argument_type ||= ErrorTypeInfo.new
|
14
16
|
end
|
15
17
|
|
16
18
|
def name
|
17
|
-
|
19
|
+
"_error"
|
20
|
+
end
|
21
|
+
|
22
|
+
def closure
|
23
|
+
-1
|
24
|
+
end
|
25
|
+
|
26
|
+
def caller_allocates?
|
27
|
+
true
|
18
28
|
end
|
19
29
|
end
|
20
30
|
end
|
21
|
-
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'gir_ffi/info_ext/i_type_info'
|
2
|
+
|
3
|
+
module GirFFI
|
4
|
+
# Represents the type of an error argument for callbacks and functions,
|
5
|
+
# conforming, as needed, to the interface of GObjectIntrospection::ITypeInfo
|
6
|
+
class ErrorTypeInfo
|
7
|
+
include GirFFI::InfoExt::ITypeInfo
|
8
|
+
|
9
|
+
def array_length
|
10
|
+
-1
|
11
|
+
end
|
12
|
+
|
13
|
+
def tag
|
14
|
+
:error
|
15
|
+
end
|
16
|
+
|
17
|
+
def pointer?
|
18
|
+
true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -9,15 +9,14 @@ module GirFFI
|
|
9
9
|
self
|
10
10
|
end
|
11
11
|
|
12
|
-
def
|
13
|
-
|
14
|
-
wrap_by_gtype gtype
|
12
|
+
def zero?
|
13
|
+
null?
|
15
14
|
end
|
16
15
|
|
17
|
-
def
|
16
|
+
def to_object
|
18
17
|
return nil if self.null?
|
19
|
-
|
20
|
-
|
18
|
+
gtype = GObject.type_from_instance_pointer self
|
19
|
+
Builder.build_by_gtype(gtype).direct_wrap self
|
21
20
|
end
|
22
21
|
|
23
22
|
def to_utf8
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module GirFFI
|
2
|
+
# Exception class to be raised whenever an error is signaled through
|
3
|
+
# GLib::Error.
|
4
|
+
class GLibError < RuntimeError
|
5
|
+
attr_reader :domain_quark
|
6
|
+
attr_reader :code
|
7
|
+
|
8
|
+
def initialize g_error
|
9
|
+
@domain_quark = g_error.domain
|
10
|
+
@code = g_error.code
|
11
|
+
super g_error.message
|
12
|
+
end
|
13
|
+
|
14
|
+
def domain
|
15
|
+
@domain ||= GLib.quark_to_string @domain_quark
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
data/lib/gir_ffi/in_pointer.rb
CHANGED
@@ -7,16 +7,16 @@ module GirFFI
|
|
7
7
|
|
8
8
|
def self.flattened_tag_to_gtype_map
|
9
9
|
@flattened_tag_to_gtype_map ||= {
|
10
|
-
:
|
11
|
-
:
|
12
|
-
:
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:
|
16
|
-
:
|
17
|
-
:
|
18
|
-
:
|
19
|
-
:
|
10
|
+
array: GObject::TYPE_ARRAY,
|
11
|
+
c: GObject::TYPE_POINTER,
|
12
|
+
gboolean: GObject::TYPE_BOOLEAN,
|
13
|
+
ghash: GObject::TYPE_HASH_TABLE,
|
14
|
+
gint32: GObject::TYPE_INT,
|
15
|
+
gint64: GObject::TYPE_INT64,
|
16
|
+
guint64: GObject::TYPE_UINT64,
|
17
|
+
strv: GObject::TYPE_STRV,
|
18
|
+
utf8: GObject::TYPE_STRING,
|
19
|
+
void: GObject::TYPE_NONE
|
20
20
|
}
|
21
21
|
end
|
22
22
|
|
@@ -76,18 +76,18 @@ module GirFFI
|
|
76
76
|
end
|
77
77
|
|
78
78
|
TAG_TO_WRAPPER_CLASS_MAP = {
|
79
|
-
:
|
80
|
-
:
|
81
|
-
:
|
82
|
-
:
|
83
|
-
:
|
84
|
-
:
|
85
|
-
:
|
86
|
-
:
|
87
|
-
:
|
88
|
-
:
|
89
|
-
:
|
90
|
-
:
|
79
|
+
array: 'GLib::Array',
|
80
|
+
byte_array: 'GLib::ByteArray',
|
81
|
+
c: 'GirFFI::SizedArray',
|
82
|
+
error: 'GLib::Error',
|
83
|
+
ghash: 'GLib::HashTable',
|
84
|
+
glist: 'GLib::List',
|
85
|
+
gslist: 'GLib::SList',
|
86
|
+
ptr_array: 'GLib::PtrArray',
|
87
|
+
strv: 'GLib::Strv',
|
88
|
+
utf8: 'GirFFI::InPointer',
|
89
|
+
void: 'GirFFI::InPointer',
|
90
|
+
zero_terminated: 'GirFFI::ZeroTerminated'
|
91
91
|
}
|
92
92
|
|
93
93
|
# TODO: Use class rather than class name
|
@@ -127,19 +127,33 @@ module GirFFI
|
|
127
127
|
end
|
128
128
|
end
|
129
129
|
|
130
|
+
TAGS_NEEDING_RUBY_TO_C_CONVERSION = [
|
131
|
+
:array, :c, :callback, :error, :ghash, :glist, :gslist, :object,
|
132
|
+
:ptr_array, :struct, :strv, :utf8, :void, :zero_terminated
|
133
|
+
]
|
134
|
+
|
135
|
+
TAGS_NEEDING_C_TO_RUBY_CONVERSION = [
|
136
|
+
:array, :byte_array, :c, :error, :filename, :ghash, :glist, :gslist,
|
137
|
+
:interface, :object, :ptr_array, :struct, :strv, :union, :utf8,
|
138
|
+
:zero_terminated
|
139
|
+
]
|
140
|
+
|
130
141
|
def needs_ruby_to_c_conversion_for_functions?
|
131
|
-
|
132
|
-
|
142
|
+
TAGS_NEEDING_RUBY_TO_C_CONVERSION.include?(flattened_tag)
|
143
|
+
end
|
144
|
+
|
145
|
+
def needs_c_to_ruby_conversion_for_functions?
|
146
|
+
TAGS_NEEDING_C_TO_RUBY_CONVERSION.include?(flattened_tag)
|
133
147
|
end
|
134
148
|
|
135
|
-
def
|
136
|
-
[
|
137
|
-
|
138
|
-
:utf8, :zero_terminated ].include?(flattened_tag)
|
149
|
+
def needs_ruby_to_c_conversion_for_callbacks?
|
150
|
+
[:enum].include?(flattened_tag) ||
|
151
|
+
needs_ruby_to_c_conversion_for_functions?
|
139
152
|
end
|
140
153
|
|
141
|
-
def
|
142
|
-
|
154
|
+
def needs_c_to_ruby_conversion_for_callbacks?
|
155
|
+
[:callback, :enum].include?(flattened_tag) ||
|
156
|
+
needs_c_to_ruby_conversion_for_functions?
|
143
157
|
end
|
144
158
|
|
145
159
|
def extra_conversion_arguments
|
@@ -1,9 +1,21 @@
|
|
1
1
|
module GirFFI
|
2
2
|
module InfoExt
|
3
3
|
# Extensions for GObjectIntrospection::IVFuncInfo needed by GirFFI
|
4
|
+
# TODO: Merge implementation with ICallbackInfo and ISignalInfo extensions.
|
4
5
|
module IVFuncInfo
|
6
|
+
def argument_ffi_types
|
7
|
+
args.map { |arg| arg.to_callback_ffitype }.tap do |types|
|
8
|
+
types << :pointer if throws?
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
5
12
|
def return_ffi_type
|
6
|
-
return_type.to_callback_ffitype
|
13
|
+
result = return_type.to_callback_ffitype
|
14
|
+
if result == GLib::Boolean
|
15
|
+
:bool
|
16
|
+
else
|
17
|
+
result
|
18
|
+
end
|
7
19
|
end
|
8
20
|
end
|
9
21
|
end
|
data/lib/gir_ffi/type_map.rb
CHANGED
@@ -3,37 +3,38 @@ require 'gir_ffi/sized_array'
|
|
3
3
|
module GirFFI
|
4
4
|
module TypeMap
|
5
5
|
sz = FFI.type_size(:size_t) * 8
|
6
|
-
|
6
|
+
gsize_type = "uint#{sz}".to_sym
|
7
7
|
|
8
8
|
TAG_TYPE_MAP = {
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
:
|
19
|
-
|
20
|
-
:
|
21
|
-
|
22
|
-
:
|
23
|
-
:
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
:
|
35
|
-
:
|
36
|
-
:
|
9
|
+
enum: :int32,
|
10
|
+
flags: :int32,
|
11
|
+
ghash: :pointer,
|
12
|
+
glist: :pointer,
|
13
|
+
gslist: :pointer,
|
14
|
+
strv: :pointer,
|
15
|
+
object: :pointer,
|
16
|
+
struct: :pointer,
|
17
|
+
error: :pointer,
|
18
|
+
ptr_array: :pointer,
|
19
|
+
array: :pointer,
|
20
|
+
c: GirFFI::SizedArray,
|
21
|
+
utf8: :pointer,
|
22
|
+
GType: gsize_type,
|
23
|
+
gboolean: GLib::Boolean,
|
24
|
+
gunichar: :uint32,
|
25
|
+
gint8: :int8,
|
26
|
+
guint8: :uint8,
|
27
|
+
gint16: :int16,
|
28
|
+
guint16: :uint16,
|
29
|
+
gint: :int,
|
30
|
+
gint32: :int32,
|
31
|
+
guint32: :uint32,
|
32
|
+
gint64: :int64,
|
33
|
+
guint64: :uint64,
|
34
|
+
gsize: gsize_type,
|
35
|
+
gfloat: :float,
|
36
|
+
gdouble: :double,
|
37
|
+
void: :void
|
37
38
|
}
|
38
39
|
|
39
40
|
def self.map_basic_type type
|
@@ -4,6 +4,7 @@ require 'gir_ffi/vfunc_implementation'
|
|
4
4
|
module GirFFI
|
5
5
|
# Represents a user defined type, conforming, as needed, to the interface of
|
6
6
|
# GObjectIntrospection::IObjectInfo.
|
7
|
+
# TODO: Rename to UserDefinedObjectInfo
|
7
8
|
class UserDefinedTypeInfo
|
8
9
|
attr_reader :properties, :vfunc_implementations
|
9
10
|
|
data/lib/gir_ffi/version.rb
CHANGED
data/lib/gir_ffi/vfunc_base.rb
CHANGED
@@ -39,7 +39,7 @@ module GirFFI
|
|
39
39
|
|
40
40
|
def read_value offset
|
41
41
|
val = @ptr.send(getter_method, offset)
|
42
|
-
|
42
|
+
val unless val.zero?
|
43
43
|
end
|
44
44
|
|
45
45
|
def getter_method
|
@@ -61,13 +61,8 @@ module GirFFI
|
|
61
61
|
@ffi_type ||= TypeMap.type_specification_to_ffitype element_type
|
62
62
|
end
|
63
63
|
|
64
|
-
def
|
65
|
-
|
66
|
-
value.null?
|
67
|
-
else
|
68
|
-
value == 0
|
69
|
-
end
|
64
|
+
def ffi_type_size
|
65
|
+
@ffi_type_size ||= FFI.type_size(ffi_type)
|
70
66
|
end
|
71
67
|
end
|
72
68
|
end
|
73
|
-
|