gir_ffi 0.9.5 → 0.10.0.pre1
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/byte_array.rb +1 -1
- data/lib/ffi-glib/bytes.rb +4 -4
- data/lib/ffi-glib/container_class_methods.rb +2 -0
- data/lib/ffi-glib/iconv.rb +2 -2
- data/lib/ffi-glib/variant.rb +10 -2
- data/lib/ffi-gobject.rb +6 -14
- data/lib/ffi-gobject/object.rb +7 -0
- data/lib/ffi-gobject/object_class.rb +1 -1
- data/lib/ffi-gobject/param_spec.rb +12 -0
- data/lib/ffi-gobject/value.rb +20 -11
- data/lib/gir_ffi-base/gobject.rb +35 -3
- data/lib/gir_ffi-base/gobject/lib.rb +2 -0
- data/lib/gir_ffi/allocation_helper.rb +11 -0
- data/lib/gir_ffi/arg_helper.rb +4 -0
- data/lib/gir_ffi/boxed_base.rb +28 -32
- data/lib/gir_ffi/builders/argument_builder.rb +31 -6
- data/lib/gir_ffi/builders/c_to_ruby_convertor.rb +36 -7
- data/lib/gir_ffi/builders/callback_argument_builder.rb +24 -10
- data/lib/gir_ffi/builders/closure_to_pointer_convertor.rb +1 -1
- data/lib/gir_ffi/builders/field_builder.rb +28 -10
- data/lib/gir_ffi/builders/full_c_to_ruby_convertor.rb +2 -3
- data/lib/gir_ffi/builders/initializer_return_value_builder.rb +5 -1
- data/lib/gir_ffi/builders/null_argument_builder.rb +0 -12
- data/lib/gir_ffi/builders/pointer_value_convertor.rb +38 -0
- data/lib/gir_ffi/builders/return_value_builder.rb +12 -10
- data/lib/gir_ffi/builders/ruby_to_c_convertor.rb +21 -2
- data/lib/gir_ffi/builders/struct_builder.rb +9 -2
- data/lib/gir_ffi/builders/{boxed_builder.rb → struct_like.rb} +2 -5
- data/lib/gir_ffi/builders/unintrospectable_boxed_builder.rb +5 -2
- data/lib/gir_ffi/builders/union_builder.rb +5 -2
- data/lib/gir_ffi/enum_base.rb +4 -0
- data/lib/gir_ffi/error_argument_info.rb +0 -16
- data/lib/gir_ffi/ffi_ext/pointer.rb +11 -5
- data/lib/gir_ffi/flags_base.rb +4 -0
- data/lib/gir_ffi/in_out_pointer.rb +5 -30
- data/lib/gir_ffi/in_pointer.rb +5 -4
- data/lib/gir_ffi/info_ext/i_type_info.rb +3 -5
- data/lib/gir_ffi/object_base.rb +4 -0
- data/lib/gir_ffi/sized_array.rb +20 -0
- data/lib/gir_ffi/struct_base.rb +13 -2
- data/lib/gir_ffi/struct_like_base.rb +53 -0
- data/lib/gir_ffi/union_base.rb +7 -1
- data/lib/gir_ffi/version.rb +1 -1
- data/test/ffi-glib/destroy_notify_test.rb +4 -1
- data/test/ffi-gobject/param_spec_test.rb +18 -0
- data/test/gir_ffi/arg_helper_test.rb +17 -0
- data/test/gir_ffi/boxed_base_test.rb +24 -0
- data/test/gir_ffi/builders/argument_builder_test.rb +156 -63
- data/test/gir_ffi/builders/callback_argument_builder_test.rb +10 -10
- data/test/gir_ffi/builders/callback_builder_test.rb +31 -8
- data/test/gir_ffi/builders/field_builder_test.rb +32 -30
- data/test/gir_ffi/builders/function_builder_test.rb +251 -45
- data/test/gir_ffi/builders/initializer_builder_test.rb +17 -1
- data/test/gir_ffi/builders/return_value_builder_test.rb +115 -68
- data/test/gir_ffi/builders/struct_builder_test.rb +6 -0
- data/test/gir_ffi/builders/unintrospectable_builder_test.rb +4 -1
- data/test/gir_ffi/builders/vfunc_builder_test.rb +10 -10
- data/test/gir_ffi/in_out_pointer_test.rb +12 -81
- data/test/gir_ffi/in_pointer_test.rb +0 -17
- data/test/gir_ffi/info_ext/i_type_info_test.rb +0 -10
- data/test/gir_ffi/sized_array_test.rb +62 -0
- data/test/gir_ffi/struct_base_test.rb +24 -0
- data/test/gir_ffi/union_base_test.rb +24 -0
- data/test/gir_ffi/version_test.rb +1 -1
- data/test/integration/generated_gimarshallingtests_test.rb +32 -12
- data/test/integration/generated_regress_test.rb +9 -12
- metadata +12 -8
- data/lib/ffi-gobject/base.rb +0 -27
- data/lib/gir_ffi/user_data_argument_info.rb +0 -24
- data/lib/gir_ffi/user_data_type_info.rb +0 -22
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 35f0c0d049d4d368c306162a75fbc3e2f5d15f7a
|
4
|
+
data.tar.gz: 2bc5789912987309b031c94477290b4988e26f4d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cfe43dd9795cc18eb70b096306a7bb7413d581b7df91fbcbe0339788a379f73c4357b5d997db6064fd907563ae23f8943df3cf2b16153de10e3d7f0761f51427
|
7
|
+
data.tar.gz: 667648adf9dc0ccfb8371af90fce175c4d28d3c450f2500a7b7715a05c07431d878a508ff4362a77307697554cabccb9f9051462ac840e9b8c8b91c57c633fe1
|
data/Changelog.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 0.10.0.pre1 / 2016-03-22
|
4
|
+
|
5
|
+
* Rework generated method code to use less indirection.
|
6
|
+
* Remove unused classes and methods
|
7
|
+
* Clearly distinguish boxed types from other structs
|
8
|
+
* Take ownership transfer into account in generated methods
|
9
|
+
* Properly free unions, structs and boxed types owned by gir_ffi
|
10
|
+
* Block access to fields that have disguised types
|
11
|
+
|
3
12
|
## 0.9.5 / 2016-03-05
|
4
13
|
|
5
14
|
* Abort if modules were defined earlier, e.g., through the gems from the ruby-gnome family.
|
data/lib/ffi-glib/byte_array.rb
CHANGED
data/lib/ffi-glib/bytes.rb
CHANGED
@@ -9,12 +9,12 @@ module GLib
|
|
9
9
|
remove_method :get_data if method_defined? :get_data
|
10
10
|
|
11
11
|
# @override
|
12
|
+
# NOTE: Needed due to mis-identification of the element-type of the
|
13
|
+
# resulting sized array for the default binding.
|
12
14
|
def get_data
|
13
|
-
length_ptr =
|
15
|
+
length_ptr = FFI::MemoryPointer.new :size_t
|
14
16
|
data_ptr = Lib.g_bytes_get_data self, length_ptr
|
15
|
-
length = length_ptr.
|
16
|
-
# NOTE: Needed due to mis-identification of the element-type of the
|
17
|
-
# resulting sized array for the default binding.
|
17
|
+
length = length_ptr.get_size_t(0)
|
18
18
|
GirFFI::SizedArray.wrap(:guint8, length, data_ptr)
|
19
19
|
end
|
20
20
|
|
data/lib/ffi-glib/iconv.rb
CHANGED
@@ -5,8 +5,8 @@ module GLib
|
|
5
5
|
# Overrides for IConv
|
6
6
|
class IConv
|
7
7
|
def self.open(to_codeset, from_codeset)
|
8
|
-
to_ptr = GirFFI::InPointer.
|
9
|
-
from_ptr = GirFFI::InPointer.
|
8
|
+
to_ptr = GirFFI::InPointer.from_utf8 to_codeset
|
9
|
+
from_ptr = GirFFI::InPointer.from_utf8 from_codeset
|
10
10
|
result_ptr = Lib.g_iconv_open(to_ptr, from_ptr)
|
11
11
|
wrap(result_ptr)
|
12
12
|
end
|
data/lib/ffi-glib/variant.rb
CHANGED
@@ -10,18 +10,26 @@ module GLib
|
|
10
10
|
get_string_without_override.first
|
11
11
|
end
|
12
12
|
|
13
|
+
alias_method :get_string_without_override, :get_string
|
14
|
+
alias_method :get_string, :get_string_with_override
|
15
|
+
|
13
16
|
# Initializing method used in constructors. For Variant, this needs to sink
|
14
17
|
# the variant's floating reference.
|
15
18
|
#
|
16
19
|
# NOTE: This is very hard to test since it is not possible to get the
|
17
20
|
# variant's ref count directely. However, there is an error when running
|
18
21
|
# the tests on 32-bit systems.
|
22
|
+
# TODO: Move this logic elsewhere
|
19
23
|
def store_pointer(ptr)
|
20
24
|
super
|
25
|
+
|
26
|
+
# TODO: Ensure ptr is not autorelease
|
21
27
|
::GLib::Lib.g_variant_ref_sink ptr
|
22
28
|
end
|
23
29
|
|
24
|
-
|
25
|
-
|
30
|
+
# TODO: Update ref?
|
31
|
+
def self.wrap_copy(val)
|
32
|
+
wrap(val)
|
33
|
+
end
|
26
34
|
end
|
27
35
|
end
|
data/lib/ffi-gobject.rb
CHANGED
@@ -4,13 +4,12 @@ require 'gir_ffi/core'
|
|
4
4
|
# Bypass check for existing modules
|
5
5
|
GirFFI::Builders::ModuleBuilder.new('GObject').generate
|
6
6
|
|
7
|
-
require 'ffi-gobject/base'
|
8
|
-
|
9
7
|
require 'ffi-gobject/value'
|
10
8
|
require 'ffi-gobject/initially_unowned'
|
11
9
|
require 'ffi-gobject/closure'
|
12
10
|
require 'ffi-gobject/object'
|
13
11
|
require 'ffi-gobject/object_class'
|
12
|
+
require 'ffi-gobject/param_spec'
|
14
13
|
require 'ffi-gobject/ruby_closure'
|
15
14
|
require 'gir_ffi/signal_not_found_error'
|
16
15
|
|
@@ -19,7 +18,7 @@ module GObject
|
|
19
18
|
def self.type_from_instance_pointer(inst_ptr)
|
20
19
|
return nil if inst_ptr.null?
|
21
20
|
klsptr = inst_ptr.get_pointer 0
|
22
|
-
|
21
|
+
klsptr.get_gtype 0
|
23
22
|
end
|
24
23
|
|
25
24
|
def self.type_from_instance(instance)
|
@@ -76,14 +75,6 @@ module GObject
|
|
76
75
|
signal_connect object, detailed_signal, data, true, &block
|
77
76
|
end
|
78
77
|
|
79
|
-
# Smells of :reek:LongParameterList: due to the C interface.
|
80
|
-
# rubocop:disable Metrics/ParameterLists
|
81
|
-
def self.param_spec_int(name, nick, blurb, minimum, maximum, default_value, flags)
|
82
|
-
ptr = Lib.g_param_spec_int(name, nick, blurb, minimum, maximum,
|
83
|
-
default_value, flags)
|
84
|
-
ParamSpecInt.wrap(ptr)
|
85
|
-
end
|
86
|
-
|
87
78
|
load_class :Callback
|
88
79
|
load_class :ClosureNotify
|
89
80
|
load_class :ConnectFlags
|
@@ -96,6 +87,8 @@ module GObject
|
|
96
87
|
attach_function :g_object_ref, [:pointer], :pointer
|
97
88
|
attach_function :g_object_unref, [:pointer], :pointer
|
98
89
|
|
90
|
+
attach_function :g_value_copy, [:pointer, :pointer], :void
|
91
|
+
attach_function :g_value_init, [:pointer, :size_t], :pointer
|
99
92
|
attach_function :g_value_unset, [:pointer], :pointer
|
100
93
|
|
101
94
|
attach_function :g_array_get_type, [], :size_t
|
@@ -109,9 +102,8 @@ module GObject
|
|
109
102
|
attach_function :g_closure_set_marshal,
|
110
103
|
[:pointer, ClosureMarshal], :void
|
111
104
|
|
112
|
-
attach_function :
|
113
|
-
|
114
|
-
:pointer
|
105
|
+
attach_function :g_param_spec_ref, [:pointer], :pointer
|
106
|
+
attach_function :g_param_spec_sink, [:pointer], :pointer
|
115
107
|
end
|
116
108
|
|
117
109
|
TYPE_ARRAY = Lib.g_array_get_type
|
data/lib/ffi-gobject/object.rb
CHANGED
data/lib/ffi-gobject/value.rb
CHANGED
@@ -4,17 +4,13 @@ GObject.load_class :Value
|
|
4
4
|
module GObject
|
5
5
|
# Overrides for GValue, GObject's generic value container structure.
|
6
6
|
class Value
|
7
|
-
|
7
|
+
remove_method :init
|
8
8
|
|
9
|
-
def
|
10
|
-
|
11
|
-
init_without_finalizer(type)
|
9
|
+
def init(type)
|
10
|
+
Lib.g_value_init self, type unless [TYPE_NONE, TYPE_INVALID].include? type
|
12
11
|
self
|
13
12
|
end
|
14
13
|
|
15
|
-
alias_method :init_without_finalizer, :init
|
16
|
-
alias_method :init, :init_with_finalizer
|
17
|
-
|
18
14
|
def self.make_finalizer(struct, gtype)
|
19
15
|
proc do
|
20
16
|
ptr = struct.to_ptr
|
@@ -115,10 +111,22 @@ module GObject
|
|
115
111
|
|
116
112
|
def self.copy_value_to_pointer(value, pointer, offset = 0)
|
117
113
|
super(value, pointer, offset).tap do
|
114
|
+
# FIXME: Check if this is still needed.
|
118
115
|
value.to_ptr.autorelease = false if value
|
119
116
|
end
|
120
117
|
end
|
121
118
|
|
119
|
+
def self.copy(val)
|
120
|
+
return unless val
|
121
|
+
result = for_gtype(val.current_gtype)
|
122
|
+
Lib.g_value_copy val, result unless val.uninitialized?
|
123
|
+
result
|
124
|
+
end
|
125
|
+
|
126
|
+
def uninitialized?
|
127
|
+
current_gtype == TYPE_INVALID
|
128
|
+
end
|
129
|
+
|
122
130
|
private
|
123
131
|
|
124
132
|
def set_ruby_value(val)
|
@@ -150,10 +158,6 @@ module GObject
|
|
150
158
|
def get_none
|
151
159
|
end
|
152
160
|
|
153
|
-
def uninitialized?
|
154
|
-
current_gtype == TYPE_INVALID
|
155
|
-
end
|
156
|
-
|
157
161
|
def set_instance_enhanced(val)
|
158
162
|
check_type_compatibility val if val
|
159
163
|
set_instance val
|
@@ -203,5 +207,10 @@ module GObject
|
|
203
207
|
METHOD_MAP[current_gtype] || METHOD_MAP[current_fundamental_type] ||
|
204
208
|
raise("No method map entry for #{current_gtype_name}")
|
205
209
|
end
|
210
|
+
|
211
|
+
def make_finalizer
|
212
|
+
gtype = self.class.gtype
|
213
|
+
ObjectSpace.define_finalizer self, self.class.make_finalizer(@struct, gtype)
|
214
|
+
end
|
206
215
|
end
|
207
216
|
end
|
data/lib/gir_ffi-base/gobject.rb
CHANGED
@@ -1,13 +1,45 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
# Ensure
|
3
|
+
# Ensure GObject is defined by GirFFI itself
|
4
4
|
raise 'The module GObject was already defined elsewhere' if Kernel.const_defined? :GObject
|
5
5
|
|
6
|
+
require 'gir_ffi-base/gobject/lib'
|
7
|
+
|
6
8
|
# The part of the GObject namespace that is needed by GObjectIntrospection.
|
7
9
|
module GObject
|
8
10
|
def self.type_init
|
9
11
|
Lib.g_type_init
|
10
12
|
end
|
11
|
-
end
|
12
13
|
|
13
|
-
|
14
|
+
def self.type_from_name(name)
|
15
|
+
Lib.g_type_from_name name
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.type_fundamental(gtype)
|
19
|
+
Lib.g_type_fundamental gtype
|
20
|
+
end
|
21
|
+
|
22
|
+
TYPE_INVALID = type_from_name('invalid')
|
23
|
+
TYPE_NONE = type_from_name('void')
|
24
|
+
TYPE_INTERFACE = type_from_name('GInterface')
|
25
|
+
TYPE_CHAR = type_from_name('gchar')
|
26
|
+
TYPE_UCHAR = type_from_name('guchar')
|
27
|
+
TYPE_BOOLEAN = type_from_name('gboolean')
|
28
|
+
TYPE_INT = type_from_name('gint')
|
29
|
+
TYPE_UINT = type_from_name('guint')
|
30
|
+
TYPE_LONG = type_from_name('glong')
|
31
|
+
TYPE_ULONG = type_from_name('gulong')
|
32
|
+
TYPE_INT64 = type_from_name('gint64')
|
33
|
+
TYPE_UINT64 = type_from_name('guint64')
|
34
|
+
TYPE_ENUM = type_from_name('GEnum')
|
35
|
+
TYPE_FLAGS = type_from_name('GFlags')
|
36
|
+
TYPE_FLOAT = type_from_name('gfloat')
|
37
|
+
TYPE_DOUBLE = type_from_name('gdouble')
|
38
|
+
TYPE_STRING = type_from_name('gchararray')
|
39
|
+
TYPE_POINTER = type_from_name('gpointer')
|
40
|
+
TYPE_BOXED = type_from_name('GBoxed')
|
41
|
+
TYPE_PARAM = type_from_name('GParam')
|
42
|
+
TYPE_OBJECT = type_from_name('GObject')
|
43
|
+
TYPE_GTYPE = type_from_name('GType')
|
44
|
+
TYPE_VARIANT = type_from_name('GVariant')
|
45
|
+
end
|
@@ -5,10 +5,21 @@ module GirFFI
|
|
5
5
|
# Helper module providing a safe allocation method that raises an exception
|
6
6
|
# if memory cannot be allocated.
|
7
7
|
module AllocationHelper
|
8
|
+
# NOTE: It would be preferable to use FFI::MemoryPointer.new(size), but
|
9
|
+
# there is a bug in FFI which means this gives a problem:
|
10
|
+
# # let ptr be a pointer not allocated by FFI.
|
11
|
+
# ptr2 = FFI::MemoryPointer.new(1)
|
12
|
+
# ptr.put_pointer ptr2 # This raises an out-of-bounds error.
|
13
|
+
# This occurs in method_int8_arg_and_out_callee
|
8
14
|
def self.safe_malloc(size)
|
9
15
|
ptr = LibC.malloc size
|
10
16
|
raise NoMemoryError if ptr.null?
|
11
17
|
ptr
|
12
18
|
end
|
19
|
+
|
20
|
+
def self.allocate(type)
|
21
|
+
type_size = FFI.type_size type
|
22
|
+
safe_malloc(type_size)
|
23
|
+
end
|
13
24
|
end
|
14
25
|
end
|
data/lib/gir_ffi/arg_helper.rb
CHANGED
data/lib/gir_ffi/boxed_base.rb
CHANGED
@@ -3,50 +3,46 @@ require 'gir_ffi/class_base'
|
|
3
3
|
|
4
4
|
module GirFFI
|
5
5
|
# Base class for generated classes representing boxed types.
|
6
|
-
class BoxedBase <
|
7
|
-
|
8
|
-
|
9
|
-
def self.native_type
|
10
|
-
FFI::Type::Struct.new(self::Struct)
|
6
|
+
class BoxedBase < StructBase
|
7
|
+
def initialize
|
8
|
+
store_pointer(self.class::Struct.new.to_ptr)
|
11
9
|
end
|
12
10
|
|
13
|
-
def self.
|
14
|
-
|
11
|
+
def self.make_finalizer(ptr, gtype)
|
12
|
+
proc do
|
13
|
+
if ptr.autorelease?
|
14
|
+
ptr.autorelease = false
|
15
|
+
GObject.boxed_free gtype, ptr
|
16
|
+
end
|
17
|
+
end
|
15
18
|
end
|
16
19
|
|
17
|
-
#
|
18
|
-
def self.
|
19
|
-
|
20
|
+
# Create an unowned copy of the struct represented by val
|
21
|
+
def self.copy_from(val)
|
22
|
+
copy from(val)
|
20
23
|
end
|
21
24
|
|
22
|
-
|
23
|
-
|
25
|
+
# Wrap an owned copy of the struct represented by val
|
26
|
+
def self.wrap_copy(val)
|
27
|
+
copy(wrap(val)).tap { |it| it && it.to_ptr.autorelease = true }
|
24
28
|
end
|
25
29
|
|
26
|
-
def self.
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
else
|
31
|
-
"\x00" * size
|
32
|
-
end
|
33
|
-
pointer.put_bytes offset, bytes, 0, size
|
30
|
+
def self.copy(val)
|
31
|
+
return unless val
|
32
|
+
ptr = GObject.boxed_copy(gtype, val)
|
33
|
+
wrap(ptr)
|
34
34
|
end
|
35
35
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
end
|
36
|
+
private
|
37
|
+
|
38
|
+
def store_pointer(ptr)
|
39
|
+
super
|
40
|
+
make_finalizer
|
42
41
|
end
|
43
42
|
|
44
|
-
def
|
45
|
-
|
46
|
-
|
47
|
-
ptr.autorelease = false
|
48
|
-
GObject.boxed_free gtype, struct.to_ptr
|
49
|
-
end
|
43
|
+
def make_finalizer
|
44
|
+
gtype = self.class.gtype
|
45
|
+
ObjectSpace.define_finalizer self, self.class.make_finalizer(to_ptr, gtype)
|
50
46
|
end
|
51
47
|
end
|
52
48
|
end
|
@@ -3,6 +3,7 @@ require 'gir_ffi/builders/base_argument_builder'
|
|
3
3
|
require 'gir_ffi/builders/closure_to_pointer_convertor'
|
4
4
|
require 'gir_ffi/builders/full_c_to_ruby_convertor'
|
5
5
|
require 'gir_ffi/builders/ruby_to_c_convertor'
|
6
|
+
require 'gir_ffi/builders/pointer_value_convertor'
|
6
7
|
require 'gir_ffi/builders/null_convertor'
|
7
8
|
|
8
9
|
module GirFFI
|
@@ -51,7 +52,7 @@ module GirFFI
|
|
51
52
|
pr << "#{call_argument_name} = #{ingoing_convertor.conversion}"
|
52
53
|
when :inout
|
53
54
|
pr << out_parameter_preparation
|
54
|
-
pr <<
|
55
|
+
pr << ingoing_value_storage
|
55
56
|
when :out
|
56
57
|
pr << out_parameter_preparation
|
57
58
|
when :error
|
@@ -73,6 +74,11 @@ module GirFFI
|
|
73
74
|
|
74
75
|
private
|
75
76
|
|
77
|
+
def ingoing_value_storage
|
78
|
+
PointerValueConvertor.new(type_spec).
|
79
|
+
value_to_pointer(call_argument_name, ingoing_convertor.conversion)
|
80
|
+
end
|
81
|
+
|
76
82
|
def has_post_conversion?
|
77
83
|
has_output_value? && (!caller_allocated_object? || gvalue?)
|
78
84
|
end
|
@@ -81,16 +87,29 @@ module GirFFI
|
|
81
87
|
if caller_allocated_object? && gvalue?
|
82
88
|
return "#{call_argument_name}.get_value"
|
83
89
|
end
|
84
|
-
base =
|
90
|
+
base = pointer_to_value_method_call call_argument_name, type_spec
|
85
91
|
if needs_out_conversion?
|
86
|
-
|
92
|
+
outgoing_convertor(base).conversion
|
87
93
|
elsif allocated_by_them?
|
88
|
-
|
94
|
+
pointer_to_value_method_call base, sub_type_spec
|
89
95
|
else
|
90
96
|
base
|
91
97
|
end
|
92
98
|
end
|
93
99
|
|
100
|
+
def outgoing_convertor(base)
|
101
|
+
FullCToRubyConvertor.new(@type_info, base, length_argument_name,
|
102
|
+
ownership_transfer: @arginfo.ownership_transfer)
|
103
|
+
end
|
104
|
+
|
105
|
+
def sub_type_spec
|
106
|
+
type_spec[1]
|
107
|
+
end
|
108
|
+
|
109
|
+
def pointer_to_value_method_call(ptr_exp, spec)
|
110
|
+
PointerValueConvertor.new(spec).pointer_to_value(ptr_exp)
|
111
|
+
end
|
112
|
+
|
94
113
|
def needs_out_conversion?
|
95
114
|
@type_info.needs_c_to_ruby_conversion_for_functions?
|
96
115
|
end
|
@@ -154,11 +173,16 @@ module GirFFI
|
|
154
173
|
"#{argument_class_name}.new"
|
155
174
|
end
|
156
175
|
else
|
157
|
-
|
176
|
+
ffi_type_spec = TypeMap.type_specification_to_ffi_type type_spec
|
177
|
+
"FFI::MemoryPointer.new #{ffi_type_spec.inspect}"
|
158
178
|
end
|
159
179
|
"#{call_argument_name} = #{value}"
|
160
180
|
end
|
161
181
|
|
182
|
+
def type_spec
|
183
|
+
type_info.tag_or_class
|
184
|
+
end
|
185
|
+
|
162
186
|
def caller_allocated_object?
|
163
187
|
[:struct, :array].include?(specialized_type_tag) &&
|
164
188
|
@arginfo.caller_allocates?
|
@@ -174,7 +198,8 @@ module GirFFI
|
|
174
198
|
elsif closure?
|
175
199
|
ClosureToPointerConvertor.new(pre_convertor_argument, @is_closure)
|
176
200
|
elsif @type_info.needs_ruby_to_c_conversion_for_functions?
|
177
|
-
RubyToCConvertor.new(@type_info, pre_convertor_argument
|
201
|
+
RubyToCConvertor.new(@type_info, pre_convertor_argument,
|
202
|
+
ownership_transfer: ownership_transfer)
|
178
203
|
else
|
179
204
|
NullConvertor.new(pre_convertor_argument)
|
180
205
|
end
|