gir_ffi 0.7.7 → 0.7.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changelog.md +9 -0
- data/lib/ffi-glib/array.rb +1 -1
- data/lib/ffi-glib/error.rb +1 -2
- data/lib/ffi-glib/hash_table.rb +2 -2
- data/lib/ffi-glib/variant.rb +1 -1
- data/lib/ffi-gobject/base.rb +23 -23
- data/lib/ffi-gobject/object.rb +7 -3
- data/lib/ffi-gobject/value.rb +6 -1
- data/lib/ffi-gobject.rb +9 -6
- data/lib/ffi-gobject_introspection/i_base_info.rb +3 -3
- data/lib/ffi-gobject_introspection/i_constant_info.rb +1 -1
- data/lib/ffi-gobject_introspection/i_repository.rb +4 -1
- data/lib/ffi-gobject_introspection/i_type_info.rb +1 -1
- data/lib/ffi-gobject_introspection/i_unresolved_info.rb +7 -0
- data/lib/ffi-gobject_introspection/lib.rb +1 -1
- data/lib/gir_ffi/builders/argument_builder.rb +1 -1
- data/lib/gir_ffi/builders/c_to_ruby_convertor.rb +37 -29
- data/lib/gir_ffi/builders/callback_argument_builder.rb +57 -27
- data/lib/gir_ffi/builders/closure_convertor.rb +12 -8
- data/lib/gir_ffi/builders/closure_to_pointer_convertor.rb +12 -8
- data/lib/gir_ffi/builders/constructor_result_convertor.rb +11 -7
- data/lib/gir_ffi/builders/field_builder.rb +1 -1
- data/lib/gir_ffi/builders/function_builder.rb +1 -1
- data/lib/gir_ffi/builders/mapping_method_builder.rb +1 -1
- data/lib/gir_ffi/builders/marshalling_method_builder.rb +2 -2
- data/lib/gir_ffi/builders/method_template.rb +1 -1
- data/lib/gir_ffi/builders/null_convertor.rb +11 -7
- data/lib/gir_ffi/builders/property_builder.rb +1 -1
- data/lib/gir_ffi/builders/ruby_to_c_convertor.rb +17 -13
- data/lib/gir_ffi/error_argument_info.rb +1 -1
- data/lib/gir_ffi/ffi_ext/pointer.rb +1 -1
- data/lib/gir_ffi/info_ext/i_unresolved_info.rb +12 -0
- data/lib/gir_ffi/info_ext/safe_constant_name.rb +2 -2
- data/lib/gir_ffi/info_ext/safe_function_name.rb +1 -1
- data/lib/gir_ffi/info_ext.rb +1 -0
- data/lib/gir_ffi/module_base.rb +1 -1
- data/lib/gir_ffi/receiver_argument_info.rb +15 -12
- data/lib/gir_ffi/user_data_argument_info.rb +17 -15
- data/lib/gir_ffi/user_data_type_info.rb +14 -12
- data/lib/gir_ffi/version.rb +1 -1
- data/lib/gir_ffi-base/gobject/lib.rb +1 -1
- data/test/base_test_helper.rb +15 -15
- data/test/ffi-glib/array_test.rb +38 -38
- data/test/ffi-glib/byte_array_test.rb +6 -7
- data/test/ffi-glib/bytes_test.rb +9 -9
- data/test/ffi-glib/hash_table_test.rb +26 -23
- data/test/ffi-glib/iconv_test.rb +5 -5
- data/test/ffi-glib/list_test.rb +16 -16
- data/test/ffi-glib/main_loop_test.rb +6 -6
- data/test/ffi-glib/ptr_array_test.rb +45 -45
- data/test/ffi-glib/ruby_closure_test.rb +6 -6
- data/test/ffi-glib/s_list_test.rb +15 -15
- data/test/ffi-glib/strv_test.rb +21 -21
- data/test/ffi-glib/variant_test.rb +4 -4
- data/test/ffi-gobject/gobject_test.rb +35 -35
- data/test/ffi-gobject/object_class_test.rb +1 -1
- data/test/ffi-gobject/object_test.rb +29 -6
- data/test/ffi-gobject/value_test.rb +66 -52
- data/test/ffi-gobject_introspection/i_base_info_test.rb +10 -11
- data/test/ffi-gobject_introspection/i_constant_info_test.rb +6 -6
- data/test/ffi-gobject_introspection/i_enum_info_test.rb +4 -5
- data/test/ffi-gobject_introspection/i_function_info_test.rb +0 -2
- data/test/ffi-gobject_introspection/i_object_info_test.rb +5 -5
- data/test/ffi-gobject_introspection/i_registered_type_info_test.rb +9 -8
- data/test/ffi-gobject_introspection/i_repository_test.rb +16 -16
- data/test/ffi-gobject_introspection/i_type_info_test.rb +16 -2
- data/test/ffi-gobject_introspection/lib_test.rb +2 -2
- data/test/ffi-gobject_test.rb +50 -40
- data/test/gir_ffi/arg_helper_test.rb +5 -5
- data/test/gir_ffi/builder_test.rb +41 -41
- data/test/gir_ffi/builders/argument_builder_test.rb +240 -207
- data/test/gir_ffi/builders/base_argument_builder_test.rb +0 -1
- data/test/gir_ffi/builders/callback_argument_builder_test.rb +81 -15
- data/test/gir_ffi/builders/callback_builder_test.rb +39 -14
- data/test/gir_ffi/builders/callback_return_value_builder_test.rb +41 -33
- data/test/gir_ffi/builders/enum_builder_test.rb +3 -3
- data/test/gir_ffi/builders/field_builder_test.rb +17 -17
- data/test/gir_ffi/builders/function_builder_test.rb +16 -16
- data/test/gir_ffi/builders/interface_builder_test.rb +9 -7
- data/test/gir_ffi/builders/module_builder_test.rb +5 -6
- data/test/gir_ffi/builders/object_builder_test.rb +24 -19
- data/test/gir_ffi/builders/property_builder_test.rb +25 -23
- data/test/gir_ffi/builders/registered_type_builder_test.rb +11 -11
- data/test/gir_ffi/builders/return_value_builder_test.rb +237 -197
- data/test/gir_ffi/builders/signal_closure_builder_test.rb +29 -22
- data/test/gir_ffi/builders/struct_builder_test.rb +10 -10
- data/test/gir_ffi/builders/unintrospectable_builder_test.rb +8 -8
- data/test/gir_ffi/builders/union_builder_test.rb +5 -6
- data/test/gir_ffi/builders/user_defined_builder_test.rb +42 -33
- data/test/gir_ffi/builders/vfunc_builder_test.rb +37 -30
- data/test/gir_ffi/callback_base_test.rb +4 -5
- data/test/gir_ffi/class_base_test.rb +35 -28
- data/test/gir_ffi/error_type_info_test.rb +14 -14
- data/test/gir_ffi/ffi_ext/pointer_test.rb +4 -4
- data/test/gir_ffi/g_type_test.rb +6 -6
- data/test/gir_ffi/in_out_pointer_test.rb +27 -27
- data/test/gir_ffi/in_pointer_test.rb +54 -50
- data/test/gir_ffi/info_ext/i_callable_info_test.rb +8 -7
- data/test/gir_ffi/info_ext/i_callback_info_test.rb +7 -7
- data/test/gir_ffi/info_ext/i_field_info_test.rb +10 -8
- data/test/gir_ffi/info_ext/i_function_info_test.rb +17 -15
- data/test/gir_ffi/info_ext/i_signal_info_test.rb +10 -8
- data/test/gir_ffi/info_ext/i_type_info_test.rb +158 -155
- data/test/gir_ffi/info_ext/i_unresolved_info_test.rb +17 -0
- data/test/gir_ffi/info_ext/safe_constant_name_test.rb +12 -10
- data/test/gir_ffi/info_ext/safe_function_name_test.rb +12 -10
- data/test/gir_ffi/interface_base_test.rb +6 -6
- data/test/gir_ffi/method_stubber_test.rb +16 -13
- data/test/gir_ffi/object_base_test.rb +6 -6
- data/test/gir_ffi/sized_array_test.rb +23 -23
- data/test/gir_ffi/type_map_test.rb +3 -3
- data/test/gir_ffi/unintrospectable_type_info_test.rb +18 -18
- data/test/gir_ffi/user_defined_property_info_test.rb +4 -4
- data/test/gir_ffi/user_defined_type_info_test.rb +16 -16
- data/test/gir_ffi/variable_name_generator_test.rb +6 -6
- data/test/gir_ffi/version_test.rb +1 -1
- data/test/gir_ffi/zero_terminated_test.rb +16 -17
- data/test/gir_ffi-base/glib/boolean_test.rb +13 -13
- data/test/gir_ffi-base/glib/strv_test.rb +11 -11
- data/test/gir_ffi_test.rb +18 -18
- data/test/gir_ffi_test_helper.rb +13 -18
- data/test/integration/derived_classes_test.rb +8 -8
- data/test/integration/generated_gimarshallingtests_test.rb +794 -792
- data/test/integration/generated_gio_test.rb +25 -26
- data/test/integration/generated_glib_test.rb +8 -2
- data/test/integration/generated_gobject_test.rb +16 -9
- data/test/integration/generated_pango_ft2_test.rb +1 -2
- data/test/integration/generated_pango_test.rb +2 -2
- data/test/integration/generated_regress_test.rb +785 -705
- data/test/integration/generated_secret_test.rb +5 -5
- data/test/integration/method_lookup_test.rb +5 -5
- data/test/introspection_test_helper.rb +3 -1
- data/test/minitest/stats_plugin.rb +3 -3
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 58dffbf9a2115d4ddfe8ca620557382d27510bb5
|
4
|
+
data.tar.gz: 6f0e46d81b16c5d29468acc9fce70e4249b44f37
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 80c91f162cc4b515d85a77de746ba8305c1a8f241bf28e739bbbb46bd5e34ee4029f553ff57764f7824a33dedcb2486931c979a3d612432601e92aa2867e02d3
|
7
|
+
data.tar.gz: e5e38438a0b57c2ac477a60d464dbf7e0547f74ae7b8326c54f79a486c6bbc205e7e90f484a95a9c628abd927023b771c94b1c0f1272537ac480dcc85a958cdf
|
data/Changelog.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 0.7.8 / 2014-12-09
|
4
|
+
|
5
|
+
* Support constants with a falsy value
|
6
|
+
* Support type aliases that resolve to a type that is not introspectable
|
7
|
+
* Support callback arguments with direction :inout
|
8
|
+
* Provide GObject.signal_connect_after and GObject::Object.signal_connect_after
|
9
|
+
* Handle setting GValues (and hence, properties) that have enum values
|
10
|
+
* Various refactorings & coding style cleanups
|
11
|
+
|
3
12
|
## 0.7.7 / 2014-10-21
|
4
13
|
|
5
14
|
* Handle introspecting boolean constants
|
data/lib/ffi-glib/array.rb
CHANGED
data/lib/ffi-glib/error.rb
CHANGED
@@ -3,8 +3,7 @@ GLib.load_class :Error
|
|
3
3
|
module GLib
|
4
4
|
# Overrides for GError, used by GLib for handling non-fatal errors.
|
5
5
|
class Error
|
6
|
-
|
7
|
-
GIR_FFI_DOMAIN = GLib.quark_from_string("gir_ffi")
|
6
|
+
GIR_FFI_DOMAIN = GLib.quark_from_string('gir_ffi')
|
8
7
|
|
9
8
|
def self.from_exception ex
|
10
9
|
new_literal GIR_FFI_DOMAIN, 0, ex.message
|
data/lib/ffi-glib/hash_table.rb
CHANGED
@@ -56,7 +56,7 @@ module GLib
|
|
56
56
|
when :utf8
|
57
57
|
FFI::Function.new(:uint,
|
58
58
|
[:pointer],
|
59
|
-
find_support_function(
|
59
|
+
find_support_function('g_str_hash'))
|
60
60
|
else
|
61
61
|
nil
|
62
62
|
end
|
@@ -67,7 +67,7 @@ module GLib
|
|
67
67
|
when :utf8
|
68
68
|
FFI::Function.new(:int,
|
69
69
|
[:pointer, :pointer],
|
70
|
-
find_support_function(
|
70
|
+
find_support_function('g_str_equal'))
|
71
71
|
else
|
72
72
|
nil
|
73
73
|
end
|
data/lib/ffi-glib/variant.rb
CHANGED
data/lib/ffi-gobject/base.rb
CHANGED
@@ -1,26 +1,26 @@
|
|
1
1
|
# Preload type contants
|
2
2
|
module GObject
|
3
|
-
TYPE_INVALID = type_from_name(
|
4
|
-
TYPE_NONE = type_from_name(
|
5
|
-
TYPE_INTERFACE = type_from_name(
|
6
|
-
TYPE_CHAR = type_from_name(
|
7
|
-
TYPE_UCHAR = type_from_name(
|
8
|
-
TYPE_BOOLEAN = type_from_name(
|
9
|
-
TYPE_INT = type_from_name(
|
10
|
-
TYPE_UINT = type_from_name(
|
11
|
-
TYPE_LONG = type_from_name(
|
12
|
-
TYPE_ULONG = type_from_name(
|
13
|
-
TYPE_INT64 = type_from_name(
|
14
|
-
TYPE_UINT64 = type_from_name(
|
15
|
-
TYPE_ENUM = type_from_name(
|
16
|
-
TYPE_FLAGS = type_from_name(
|
17
|
-
TYPE_FLOAT = type_from_name(
|
18
|
-
TYPE_DOUBLE = type_from_name(
|
19
|
-
TYPE_STRING = type_from_name(
|
20
|
-
TYPE_POINTER = type_from_name(
|
21
|
-
TYPE_BOXED = type_from_name(
|
22
|
-
TYPE_PARAM = type_from_name(
|
23
|
-
TYPE_OBJECT = type_from_name(
|
24
|
-
TYPE_GTYPE = type_from_name(
|
25
|
-
TYPE_VARIANT = type_from_name(
|
3
|
+
TYPE_INVALID = type_from_name('invalid')
|
4
|
+
TYPE_NONE = type_from_name('void')
|
5
|
+
TYPE_INTERFACE = type_from_name('GInterface')
|
6
|
+
TYPE_CHAR = type_from_name('gchar')
|
7
|
+
TYPE_UCHAR = type_from_name('guchar')
|
8
|
+
TYPE_BOOLEAN = type_from_name('gboolean')
|
9
|
+
TYPE_INT = type_from_name('gint')
|
10
|
+
TYPE_UINT = type_from_name('guint')
|
11
|
+
TYPE_LONG = type_from_name('glong')
|
12
|
+
TYPE_ULONG = type_from_name('gulong')
|
13
|
+
TYPE_INT64 = type_from_name('gint64')
|
14
|
+
TYPE_UINT64 = type_from_name('guint64')
|
15
|
+
TYPE_ENUM = type_from_name('GEnum')
|
16
|
+
TYPE_FLAGS = type_from_name('GFlags')
|
17
|
+
TYPE_FLOAT = type_from_name('gfloat')
|
18
|
+
TYPE_DOUBLE = type_from_name('gdouble')
|
19
|
+
TYPE_STRING = type_from_name('gchararray')
|
20
|
+
TYPE_POINTER = type_from_name('gpointer')
|
21
|
+
TYPE_BOXED = type_from_name('GBoxed')
|
22
|
+
TYPE_PARAM = type_from_name('GParam')
|
23
|
+
TYPE_OBJECT = type_from_name('GObject')
|
24
|
+
TYPE_GTYPE = type_from_name('GType')
|
25
|
+
TYPE_VARIANT = type_from_name('GVariant')
|
26
26
|
end
|
data/lib/ffi-gobject/object.rb
CHANGED
@@ -3,7 +3,7 @@ GObject.load_class :Object
|
|
3
3
|
module GObject
|
4
4
|
# Overrides for GObject, GObject's generic base class.
|
5
5
|
class Object
|
6
|
-
setup_method
|
6
|
+
setup_method 'new'
|
7
7
|
|
8
8
|
# TODO: Generate accessor methods from GIR at class definition time
|
9
9
|
def method_missing method, *args
|
@@ -20,8 +20,12 @@ module GObject
|
|
20
20
|
GObject.signal_connect(self, event, data, &block)
|
21
21
|
end
|
22
22
|
|
23
|
-
|
24
|
-
|
23
|
+
def signal_connect_after event, data = nil, &block
|
24
|
+
GObject.signal_connect_after(self, event, data, &block)
|
25
|
+
end
|
26
|
+
|
27
|
+
setup_instance_method 'get_property'
|
28
|
+
setup_instance_method 'set_property'
|
25
29
|
|
26
30
|
def get_property_extended property_name
|
27
31
|
gvalue = get_property property_name
|
data/lib/ffi-gobject/value.rb
CHANGED
@@ -14,7 +14,7 @@ module GObject
|
|
14
14
|
TYPE_BOXED => [:get_boxed, :set_boxed],
|
15
15
|
TYPE_CHAR => [:get_char, :set_char],
|
16
16
|
TYPE_DOUBLE => [:get_double, :set_double],
|
17
|
-
TYPE_ENUM => [:get_enum_enhanced, :
|
17
|
+
TYPE_ENUM => [:get_enum_enhanced, :set_enum_enhanced],
|
18
18
|
TYPE_FLAGS => [:get_flags, :set_flags],
|
19
19
|
TYPE_FLOAT => [:get_float, :set_float],
|
20
20
|
TYPE_GTYPE => [:get_gtype, :set_gtype],
|
@@ -116,6 +116,11 @@ module GObject
|
|
116
116
|
set_instance val
|
117
117
|
end
|
118
118
|
|
119
|
+
def set_enum_enhanced val
|
120
|
+
val = current_gtype_class[val] if val.is_a? Symbol
|
121
|
+
set_enum val
|
122
|
+
end
|
123
|
+
|
119
124
|
def get_enum_enhanced
|
120
125
|
current_gtype_class.wrap(get_enum)
|
121
126
|
end
|
data/lib/ffi-gobject.rb
CHANGED
@@ -18,8 +18,7 @@ module GObject
|
|
18
18
|
def self.type_from_instance_pointer inst_ptr
|
19
19
|
return nil if inst_ptr.null?
|
20
20
|
klsptr = inst_ptr.get_pointer 0
|
21
|
-
|
22
|
-
klsptr.send "get_#{GirFFI::TypeMap::TAG_TYPE_MAP[:GType]}", 0
|
21
|
+
GirFFI::InOutPointer.new(:GType, klsptr).to_value
|
23
22
|
end
|
24
23
|
|
25
24
|
def self.type_from_instance instance
|
@@ -54,18 +53,22 @@ module GObject
|
|
54
53
|
return_gvalue
|
55
54
|
end
|
56
55
|
|
57
|
-
def self.signal_connect object, detailed_signal, data = nil, &block
|
58
|
-
raise ArgumentError,
|
56
|
+
def self.signal_connect object, detailed_signal, data = nil, after = false, &block
|
57
|
+
raise ArgumentError, 'Block needed' unless block_given?
|
59
58
|
signal_name, _ = detailed_signal.split('::')
|
60
59
|
sig_info = object.class.find_signal signal_name
|
61
60
|
|
62
61
|
closure = sig_info.wrap_in_closure { |*args| block.call(*args << data) }
|
63
62
|
|
64
|
-
|
65
|
-
|
63
|
+
signal_connect_closure object, detailed_signal, closure, after
|
64
|
+
end
|
65
|
+
|
66
|
+
def self.signal_connect_after object, detailed_signal, data = nil, &block
|
67
|
+
signal_connect object, detailed_signal, data, true, &block
|
66
68
|
end
|
67
69
|
|
68
70
|
# Smells of :reek:LongParameterList: due to the C interface.
|
71
|
+
# rubocop:disable Metrics/ParameterLists
|
69
72
|
def self.param_spec_int name, nick, blurb, minimum, maximum, default_value, flags
|
70
73
|
ptr = Lib.g_param_spec_int(name, nick, blurb, minimum, maximum,
|
71
74
|
default_value, flags)
|
@@ -3,7 +3,7 @@ module GObjectIntrospection
|
|
3
3
|
# Decendant types will be implemented as needed.
|
4
4
|
class IBaseInfo
|
5
5
|
def initialize ptr, lib = Lib
|
6
|
-
raise ArgumentError,
|
6
|
+
raise ArgumentError, 'ptr must not be null' if ptr.null?
|
7
7
|
|
8
8
|
unless defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
|
9
9
|
ObjectSpace.define_finalizer self, self.class.make_finalizer(lib, ptr)
|
@@ -39,7 +39,7 @@ module GObjectIntrospection
|
|
39
39
|
def self.build_array_method method, single = nil
|
40
40
|
method = method.to_s
|
41
41
|
single ||= method.to_s[0..-2]
|
42
|
-
count = method.sub(/^(get_)?/,
|
42
|
+
count = method.sub(/^(get_)?/, '\\1n_')
|
43
43
|
class_eval <<-CODE
|
44
44
|
def #{method}
|
45
45
|
(0..(#{count} - 1)).map do |i|
|
@@ -67,7 +67,7 @@ module GObjectIntrospection
|
|
67
67
|
#
|
68
68
|
def self.build_finder_method method, counter = nil, fetcher = nil
|
69
69
|
method = method.to_s
|
70
|
-
single = method.sub(/^find_/,
|
70
|
+
single = method.sub(/^find_/, '')
|
71
71
|
counter ||= "n_#{single}s"
|
72
72
|
fetcher ||= "#{single}"
|
73
73
|
class_eval <<-CODE
|
@@ -21,6 +21,7 @@ require 'ffi-gobject_introspection/i_value_info'
|
|
21
21
|
require 'ffi-gobject_introspection/i_union_info'
|
22
22
|
require 'ffi-gobject_introspection/i_enum_info'
|
23
23
|
require 'ffi-gobject_introspection/i_flags_info'
|
24
|
+
require 'ffi-gobject_introspection/i_unresolved_info'
|
24
25
|
|
25
26
|
GObject.type_init
|
26
27
|
|
@@ -30,6 +31,8 @@ module GObjectIntrospection
|
|
30
31
|
# This class wraps the GIRepository struct.
|
31
32
|
class IRepository
|
32
33
|
# Map info type to class. Default is IBaseInfo.
|
34
|
+
# SMELL: This doesn't really belong here, since it is used by IBaseInfo and
|
35
|
+
# descendants as well.
|
33
36
|
TYPEMAP = {
|
34
37
|
invalid: IBaseInfo,
|
35
38
|
function: IFunctionInfo,
|
@@ -51,7 +54,7 @@ module GObjectIntrospection
|
|
51
54
|
field: IFieldInfo,
|
52
55
|
arg: IArgInfo,
|
53
56
|
type: ITypeInfo,
|
54
|
-
unresolved:
|
57
|
+
unresolved: IUnresolvedInfo
|
55
58
|
}
|
56
59
|
|
57
60
|
def initialize
|
@@ -1,36 +1,44 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
1
|
+
module GirFFI
|
2
|
+
module Builders
|
3
|
+
# Builder that generates code to convert values from C to Ruby. Used by
|
4
|
+
# argument builders.
|
5
|
+
class CToRubyConvertor
|
6
|
+
def initialize type_info, argument_name, length_arg
|
7
|
+
@type_info = type_info
|
8
|
+
@argument_name = argument_name
|
9
|
+
@length_arg = length_arg
|
10
|
+
end
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
12
|
+
def conversion
|
13
|
+
case @type_info.flattened_tag
|
14
|
+
when :utf8, :filename
|
15
|
+
"#{@argument_name}.to_utf8"
|
16
|
+
else
|
17
|
+
"#{@type_info.argument_class_name}.wrap(#{conversion_argument_list})"
|
18
|
+
end
|
19
|
+
end
|
18
20
|
|
19
|
-
|
21
|
+
private
|
20
22
|
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
23
|
+
def conversion_argument_list
|
24
|
+
conversion_arguments.join(', ')
|
25
|
+
end
|
26
|
+
|
27
|
+
def conversion_arguments
|
28
|
+
if @type_info.flattened_tag == :c
|
29
|
+
[@type_info.element_type.inspect, array_size, @argument_name]
|
30
|
+
else
|
31
|
+
@type_info.extra_conversion_arguments.map(&:inspect).push(@argument_name)
|
32
|
+
end
|
33
|
+
end
|
28
34
|
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
35
|
+
def array_size
|
36
|
+
if @length_arg
|
37
|
+
@length_arg
|
38
|
+
else
|
39
|
+
@type_info.array_fixed_size
|
40
|
+
end
|
41
|
+
end
|
34
42
|
end
|
35
43
|
end
|
36
44
|
end
|
@@ -16,39 +16,47 @@ module GirFFI
|
|
16
16
|
@pre_converted_name ||= new_variable
|
17
17
|
end
|
18
18
|
|
19
|
+
def out_parameter_name
|
20
|
+
@out_parameter_name ||=
|
21
|
+
if direction == :inout
|
22
|
+
new_variable
|
23
|
+
else
|
24
|
+
pre_converted_name
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
19
28
|
def call_argument_name
|
20
|
-
if
|
29
|
+
if [:in, :inout].include? direction
|
21
30
|
pre_converted_name unless array_arg
|
22
31
|
end
|
23
32
|
end
|
24
33
|
|
25
34
|
def capture_variable_name
|
26
|
-
result_name if direction
|
35
|
+
result_name if [:out, :inout].include? direction unless array_arg
|
27
36
|
end
|
28
37
|
|
29
38
|
def pre_conversion
|
30
39
|
case direction
|
31
40
|
when :in
|
32
|
-
[
|
41
|
+
[ingoing_pre_conversion]
|
33
42
|
when :out
|
34
|
-
[
|
43
|
+
[out_parameter_preparation]
|
44
|
+
when :inout
|
45
|
+
[out_parameter_preparation, ingoing_pre_conversion]
|
35
46
|
when :error
|
36
|
-
[
|
37
|
-
"#{pre_converted_name} = #{out_parameter_preparation}",
|
38
|
-
"begin"
|
39
|
-
]
|
47
|
+
[out_parameter_preparation, 'begin']
|
40
48
|
end
|
41
49
|
end
|
42
50
|
|
43
51
|
def post_conversion
|
44
52
|
case direction
|
45
|
-
when :out
|
53
|
+
when :out, :inout
|
46
54
|
[outgoing_post_conversion]
|
47
55
|
when :error
|
48
56
|
[
|
49
57
|
"rescue => #{result_name}",
|
50
58
|
outgoing_post_conversion,
|
51
|
-
|
59
|
+
'end'
|
52
60
|
]
|
53
61
|
else
|
54
62
|
[]
|
@@ -61,15 +69,23 @@ module GirFFI
|
|
61
69
|
@result_name ||= new_variable
|
62
70
|
end
|
63
71
|
|
72
|
+
def pre_convertor_argument
|
73
|
+
if direction == :inout
|
74
|
+
"#{out_parameter_name}.to_value"
|
75
|
+
else
|
76
|
+
method_argument_name
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
64
80
|
def pre_convertor
|
65
81
|
@pre_convertor ||= if closure?
|
66
|
-
ClosureConvertor.new(
|
82
|
+
ClosureConvertor.new(pre_convertor_argument)
|
67
83
|
elsif needs_c_to_ruby_conversion?
|
68
84
|
CToRubyConvertor.new(type_info,
|
69
|
-
|
85
|
+
pre_convertor_argument,
|
70
86
|
length_argument_name)
|
71
87
|
else
|
72
|
-
NullConvertor.new(
|
88
|
+
NullConvertor.new(pre_convertor_argument)
|
73
89
|
end
|
74
90
|
end
|
75
91
|
|
@@ -77,34 +93,48 @@ module GirFFI
|
|
77
93
|
type_info.needs_c_to_ruby_conversion_for_callbacks?
|
78
94
|
end
|
79
95
|
|
96
|
+
def ingoing_pre_conversion
|
97
|
+
"#{pre_converted_name} = #{pre_convertor.conversion}"
|
98
|
+
end
|
99
|
+
|
80
100
|
def outgoing_post_conversion
|
81
|
-
"#{
|
101
|
+
"#{out_parameter_name}.set_value #{post_convertor.conversion}"
|
82
102
|
end
|
83
103
|
|
84
|
-
def
|
85
|
-
@
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
104
|
+
def post_convertor
|
105
|
+
@post_convertor ||= if type_info.needs_ruby_to_c_conversion_for_callbacks?
|
106
|
+
RubyToCConvertor.new(type_info, post_convertor_argument)
|
107
|
+
else
|
108
|
+
NullConvertor.new(post_convertor_argument)
|
109
|
+
end
|
90
110
|
end
|
91
111
|
|
92
|
-
def
|
93
|
-
|
94
|
-
|
95
|
-
"GirFFI::InOutPointer.new(#{type_spec[1].inspect})" \
|
96
|
-
".tap { |ptr| #{method_argument_name}.put_pointer 0, ptr }"
|
112
|
+
def post_convertor_argument
|
113
|
+
if array_arg
|
114
|
+
"#{array_arg.capture_variable_name}.length"
|
97
115
|
else
|
98
|
-
|
116
|
+
result_name
|
99
117
|
end
|
100
118
|
end
|
101
119
|
|
120
|
+
def out_parameter_preparation
|
121
|
+
type_spec = type_info.tag_or_class
|
122
|
+
value = if allocated_by_us?
|
123
|
+
"GirFFI::InOutPointer.new(#{type_spec[1].inspect})" \
|
124
|
+
".tap { |ptr| #{method_argument_name}.put_pointer 0, ptr }"
|
125
|
+
else
|
126
|
+
"GirFFI::InOutPointer.new(#{type_spec.inspect}, #{method_argument_name})"
|
127
|
+
end
|
128
|
+
"#{out_parameter_name} = #{value}"
|
129
|
+
end
|
130
|
+
|
102
131
|
# Check if an out argument needs to be allocated by us, the callee. Since
|
103
132
|
# caller_allocates is false by default, we must also check that the type
|
104
133
|
# is a pointer. For example, an out parameter of type gint8* will always
|
105
134
|
# be allocate by the caller.
|
106
135
|
def allocated_by_us?
|
107
|
-
|
136
|
+
direction == :out &&
|
137
|
+
!@arginfo.caller_allocates? &&
|
108
138
|
type_info.pointer? &&
|
109
139
|
![:object, :zero_terminated].include?(specialized_type_tag)
|
110
140
|
end
|
@@ -1,11 +1,15 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
module GirFFI
|
2
|
+
module Builders
|
3
|
+
# Builder that generates code to convert closure arguments ('user data')
|
4
|
+
# from C to Ruby. Used by argument builders.
|
5
|
+
class ClosureConvertor
|
6
|
+
def initialize argument_name
|
7
|
+
@argument_name = argument_name
|
8
|
+
end
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
+
def conversion
|
11
|
+
"GirFFI::ArgHelper::OBJECT_STORE.fetch(#{@argument_name})"
|
12
|
+
end
|
13
|
+
end
|
10
14
|
end
|
11
15
|
end
|
@@ -1,11 +1,15 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
1
|
+
module GirFFI
|
2
|
+
module Builders
|
3
|
+
# Builder that generates code to convert closure arguments ('user data')
|
4
|
+
# from Ruby to C. Used by argument builders.
|
5
|
+
class ClosureToPointerConvertor
|
6
|
+
def initialize argument_name
|
7
|
+
@argument_name = argument_name
|
8
|
+
end
|
7
9
|
|
8
|
-
|
9
|
-
|
10
|
+
def conversion
|
11
|
+
"GirFFI::InPointer.from_closure_data(#{@argument_name})"
|
12
|
+
end
|
13
|
+
end
|
10
14
|
end
|
11
15
|
end
|
@@ -1,10 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
1
|
+
module GirFFI
|
2
|
+
module Builders
|
3
|
+
# Builds conversion code for the result of a GObject constructor method.
|
4
|
+
class ConstructorResultConvertor
|
5
|
+
def initialize argument_name
|
6
|
+
@argument_name = argument_name
|
7
|
+
end
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
+
def conversion
|
10
|
+
"self.constructor_wrap(#{@argument_name})"
|
11
|
+
end
|
12
|
+
end
|
9
13
|
end
|
10
14
|
end
|