gir_ffi 0.7.7 → 0.7.8
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 +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
|