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
@@ -16,11 +16,11 @@ describe GirFFI::Builders::CallbackArgumentBuilder do
|
|
16
16
|
before { skip unless vfunc_info }
|
17
17
|
|
18
18
|
it 'has the correct value for #pre_conversion' do
|
19
|
-
builder.pre_conversion.must_equal ['_v1 =
|
19
|
+
builder.pre_conversion.must_equal ['_v1 = a']
|
20
20
|
end
|
21
21
|
|
22
22
|
it 'has the correct value for #post_conversion' do
|
23
|
-
builder.post_conversion.must_equal ['_v1.
|
23
|
+
builder.post_conversion.must_equal ['_v1.put_pointer 0, GirFFI::ZeroTerminated.from(:gfloat, _v2)']
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -30,7 +30,7 @@ describe GirFFI::Builders::CallbackArgumentBuilder do
|
|
30
30
|
|
31
31
|
it 'sets up a rescueing block in #pre_conversion' do
|
32
32
|
builder.pre_conversion.must_equal [
|
33
|
-
'_v1 =
|
33
|
+
'_v1 = _error',
|
34
34
|
'begin'
|
35
35
|
]
|
36
36
|
end
|
@@ -38,7 +38,7 @@ describe GirFFI::Builders::CallbackArgumentBuilder do
|
|
38
38
|
it 'converts any exceptions to GLib::Error in #post_conversion' do
|
39
39
|
builder.post_conversion.must_equal [
|
40
40
|
'rescue => _v1',
|
41
|
-
'_v2.
|
41
|
+
'_v2.put_pointer 0, GLib::Error.from(_v1)',
|
42
42
|
'end'
|
43
43
|
]
|
44
44
|
end
|
@@ -75,14 +75,14 @@ describe GirFFI::Builders::CallbackArgumentBuilder do
|
|
75
75
|
|
76
76
|
it 'has the correct value for #pre_conversion' do
|
77
77
|
array_arg_builder.pre_conversion.
|
78
|
-
must_equal ['_v1 =
|
79
|
-
'_v2 = GirFFI::SizedArray.wrap(:gint32, _v3, _v1.
|
78
|
+
must_equal ['_v1 = ints',
|
79
|
+
'_v2 = GirFFI::SizedArray.wrap(:gint32, _v3, _v1.get_pointer(0))']
|
80
80
|
end
|
81
81
|
|
82
82
|
it 'has the correct value for #post_conversion' do
|
83
83
|
array_arg_builder.pre_conversion
|
84
84
|
array_arg_builder.post_conversion.
|
85
|
-
must_equal ['_v1.
|
85
|
+
must_equal ['_v1.put_pointer 0, GirFFI::SizedArray.from(:gint32, -1, _v4)']
|
86
86
|
end
|
87
87
|
end
|
88
88
|
|
@@ -97,14 +97,14 @@ describe GirFFI::Builders::CallbackArgumentBuilder do
|
|
97
97
|
|
98
98
|
it 'has the correct value for #pre_conversion' do
|
99
99
|
length_arg_builder.pre_conversion.
|
100
|
-
must_equal ['_v1 =
|
101
|
-
'_v2 = _v1.
|
100
|
+
must_equal ['_v1 = length',
|
101
|
+
'_v2 = _v1.get_int32(0)']
|
102
102
|
end
|
103
103
|
|
104
104
|
it 'has the correct value for #post_conversion' do
|
105
105
|
length_arg_builder.pre_conversion
|
106
106
|
length_arg_builder.post_conversion.
|
107
|
-
must_equal ['_v1.
|
107
|
+
must_equal ['_v1.put_int32 0, _v3.length']
|
108
108
|
end
|
109
109
|
end
|
110
110
|
end
|
@@ -58,9 +58,9 @@ describe GirFFI::Builders::CallbackBuilder do
|
|
58
58
|
it 'returns a valid mapping method' do
|
59
59
|
expected = <<-CODE.reset_indentation
|
60
60
|
def self.call_with_argument_mapping(_proc, a)
|
61
|
-
_v1 =
|
61
|
+
_v1 = a
|
62
62
|
_v2 = _proc.call()
|
63
|
-
_v1.
|
63
|
+
_v1.put_float 0, _v2
|
64
64
|
end
|
65
65
|
CODE
|
66
66
|
|
@@ -77,13 +77,36 @@ describe GirFFI::Builders::CallbackBuilder do
|
|
77
77
|
skip unless callback_info
|
78
78
|
expected = <<-CODE.reset_indentation
|
79
79
|
def self.call_with_argument_mapping(_proc, ints, length)
|
80
|
-
_v1 =
|
81
|
-
_v2 = _v1.
|
82
|
-
_v3 =
|
83
|
-
_v4 = GirFFI::SizedArray.wrap(:gint32, _v2, _v3.
|
80
|
+
_v1 = length
|
81
|
+
_v2 = _v1.get_int32(0)
|
82
|
+
_v3 = ints
|
83
|
+
_v4 = GirFFI::SizedArray.wrap(:gint32, _v2, _v3.get_pointer(0))
|
84
84
|
_v5 = _proc.call(_v4)
|
85
|
-
_v1.
|
86
|
-
_v3.
|
85
|
+
_v1.put_int32 0, _v5.length
|
86
|
+
_v3.put_pointer 0, GirFFI::SizedArray.from(:gint32, -1, _v5)
|
87
|
+
end
|
88
|
+
CODE
|
89
|
+
|
90
|
+
builder.mapping_method_definition.must_equal expected
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe 'for a callback with a value in argument' do
|
95
|
+
let(:field_info) do
|
96
|
+
get_field_introspection_data('GObject',
|
97
|
+
'ObjectClass', 'get_property')
|
98
|
+
end
|
99
|
+
let(:callback_info) do
|
100
|
+
field_info.field_type.interface
|
101
|
+
end
|
102
|
+
it 'returns a valid mapping method' do
|
103
|
+
expected = <<-CODE.reset_indentation
|
104
|
+
def self.call_with_argument_mapping(_proc, object, property_id, value, pspec)
|
105
|
+
_v1 = GObject::Object.wrap(object)
|
106
|
+
_v2 = property_id
|
107
|
+
_v3 = GObject::Value.wrap(value)
|
108
|
+
_v4 = GObject::ParamSpec.wrap(pspec)
|
109
|
+
_proc.call(_v1, _v2, _v3, _v4)
|
87
110
|
end
|
88
111
|
CODE
|
89
112
|
|
@@ -10,9 +10,8 @@ describe GirFFI::Builders::FieldBuilder do
|
|
10
10
|
expected = <<-CODE.reset_indentation
|
11
11
|
def some_int8
|
12
12
|
_v1 = @struct.to_ptr + #{field_info.offset}
|
13
|
-
_v2 =
|
14
|
-
|
15
|
-
_v3
|
13
|
+
_v2 = _v1.get_int8(0)
|
14
|
+
_v2
|
16
15
|
end
|
17
16
|
CODE
|
18
17
|
instance.getter_def.must_equal expected
|
@@ -22,9 +21,8 @@ describe GirFFI::Builders::FieldBuilder do
|
|
22
21
|
expected = <<-CODE.reset_indentation
|
23
22
|
def some_int8= value
|
24
23
|
_v1 = @struct.to_ptr + #{field_info.offset}
|
25
|
-
_v2 =
|
26
|
-
|
27
|
-
_v2.set_value _v3
|
24
|
+
_v2 = value
|
25
|
+
_v1.put_int8 0, _v2
|
28
26
|
end
|
29
27
|
CODE
|
30
28
|
instance.setter_def.must_equal expected
|
@@ -37,14 +35,24 @@ describe GirFFI::Builders::FieldBuilder do
|
|
37
35
|
expected = <<-CODE.reset_indentation
|
38
36
|
def nested_a
|
39
37
|
_v1 = @struct.to_ptr + #{field_info.offset}
|
40
|
-
_v2 =
|
41
|
-
_v3 = _v2
|
42
|
-
|
43
|
-
_v4
|
38
|
+
_v2 = Regress::TestSimpleBoxedA.get_value_from_pointer(_v1, 0)
|
39
|
+
_v3 = Regress::TestSimpleBoxedA.wrap(_v2)
|
40
|
+
_v3
|
44
41
|
end
|
45
42
|
CODE
|
46
43
|
instance.getter_def.must_equal expected
|
47
44
|
end
|
45
|
+
|
46
|
+
it 'creates the right setter method' do
|
47
|
+
expected = <<-CODE.reset_indentation
|
48
|
+
def nested_a= value
|
49
|
+
_v1 = @struct.to_ptr + #{field_info.offset}
|
50
|
+
_v2 = Regress::TestSimpleBoxedA.copy_from(value)
|
51
|
+
Regress::TestSimpleBoxedA.copy_value_to_pointer(_v2, _v1)
|
52
|
+
end
|
53
|
+
CODE
|
54
|
+
instance.setter_def.must_equal expected
|
55
|
+
end
|
48
56
|
end
|
49
57
|
|
50
58
|
describe 'for a field of type :enum' do
|
@@ -53,9 +61,8 @@ describe GirFFI::Builders::FieldBuilder do
|
|
53
61
|
expected = <<-CODE.reset_indentation
|
54
62
|
def some_enum
|
55
63
|
_v1 = @struct.to_ptr + #{field_info.offset}
|
56
|
-
_v2 =
|
57
|
-
|
58
|
-
_v3
|
64
|
+
_v2 = Regress::TestEnum.get_value_from_pointer(_v1, 0)
|
65
|
+
_v2
|
59
66
|
end
|
60
67
|
CODE
|
61
68
|
instance.getter_def.must_equal expected
|
@@ -68,10 +75,9 @@ describe GirFFI::Builders::FieldBuilder do
|
|
68
75
|
expected = <<-CODE.reset_indentation
|
69
76
|
def some_union
|
70
77
|
_v1 = @struct.to_ptr + #{field_info.offset}
|
71
|
-
_v2 = GirFFI::
|
72
|
-
_v3 = _v2
|
73
|
-
|
74
|
-
_v4
|
78
|
+
_v2 = GirFFI::SizedArray.get_value_from_pointer(_v1, 0)
|
79
|
+
_v3 = GirFFI::SizedArray.wrap(Regress::TestStructE__some_union__union, 2, _v2)
|
80
|
+
_v3
|
75
81
|
end
|
76
82
|
CODE
|
77
83
|
instance.getter_def.must_equal expected
|
@@ -81,10 +87,9 @@ describe GirFFI::Builders::FieldBuilder do
|
|
81
87
|
expected = <<-CODE.reset_indentation
|
82
88
|
def some_union= value
|
83
89
|
_v1 = @struct.to_ptr + #{field_info.offset}
|
84
|
-
_v2 = GirFFI::InOutPointer.new(:c, _v1)
|
85
90
|
GirFFI::ArgHelper.check_fixed_array_size 2, value, \"value\"
|
86
|
-
|
87
|
-
_v2
|
91
|
+
_v2 = GirFFI::SizedArray.copy_from(Regress::TestStructE__some_union__union, 2, value)
|
92
|
+
GirFFI::SizedArray.copy_value_to_pointer(_v2, _v1)
|
88
93
|
end
|
89
94
|
CODE
|
90
95
|
instance.setter_def.must_equal expected
|
@@ -97,9 +102,8 @@ describe GirFFI::Builders::FieldBuilder do
|
|
97
102
|
expected = <<-CODE.reset_indentation
|
98
103
|
def class_init= value
|
99
104
|
_v1 = @struct.to_ptr + #{field_info.offset}
|
100
|
-
_v2 =
|
101
|
-
|
102
|
-
_v2.set_value _v3
|
105
|
+
_v2 = GObject::ClassInitFunc.from(value)
|
106
|
+
GObject::ClassInitFunc.copy_value_to_pointer(_v2, _v1)
|
103
107
|
end
|
104
108
|
CODE
|
105
109
|
instance.setter_def.must_equal expected
|
@@ -115,13 +119,11 @@ describe GirFFI::Builders::FieldBuilder do
|
|
115
119
|
expected = <<-CODE.reset_indentation
|
116
120
|
def param_types
|
117
121
|
_v1 = @struct.to_ptr + #{n_params_field_info.offset}
|
118
|
-
_v2 =
|
119
|
-
_v3 =
|
120
|
-
_v4 =
|
121
|
-
_v5 = GirFFI::
|
122
|
-
|
123
|
-
_v7 = GirFFI::SizedArray.wrap(:GType, _v3, _v6)
|
124
|
-
_v7
|
122
|
+
_v2 = _v1.get_uint32(0)
|
123
|
+
_v3 = @struct.to_ptr + #{field_info.offset}
|
124
|
+
_v4 = _v3.get_pointer(0)
|
125
|
+
_v5 = GirFFI::SizedArray.wrap(:GType, _v2, _v4)
|
126
|
+
_v5
|
125
127
|
end
|
126
128
|
CODE
|
127
129
|
instance.getter_def.must_equal expected
|
@@ -12,9 +12,9 @@ describe GirFFI::Builders::FunctionBuilder do
|
|
12
12
|
skip unless function_info
|
13
13
|
code.must_equal <<-CODE.reset_indentation
|
14
14
|
def self.test_array_fixed_out_objects
|
15
|
-
_v1 =
|
15
|
+
_v1 = FFI::MemoryPointer.new :pointer
|
16
16
|
Regress::Lib.regress_test_array_fixed_out_objects _v1
|
17
|
-
_v2 = GirFFI::SizedArray.wrap([:pointer, Regress::TestObj], 2, _v1.
|
17
|
+
_v2 = GirFFI::SizedArray.wrap([:pointer, Regress::TestObj], 2, _v1.get_pointer(0))
|
18
18
|
return _v2
|
19
19
|
end
|
20
20
|
CODE
|
@@ -43,12 +43,12 @@ describe GirFFI::Builders::FunctionBuilder do
|
|
43
43
|
code.must_equal <<-CODE.reset_indentation
|
44
44
|
def parse_args(argv)
|
45
45
|
argc = argv.nil? ? 0 : argv.length
|
46
|
-
_v1 =
|
47
|
-
_v1.
|
48
|
-
_v2 =
|
49
|
-
_v2.
|
46
|
+
_v1 = FFI::MemoryPointer.new :int32
|
47
|
+
_v1.put_int32 0, argc
|
48
|
+
_v2 = FFI::MemoryPointer.new :pointer
|
49
|
+
_v2.put_pointer 0, GLib::Strv.from(argv)
|
50
50
|
Regress::Lib.regress_annotation_object_parse_args self, _v1, _v2
|
51
|
-
_v3 = GLib::Strv.wrap(_v2.
|
51
|
+
_v3 = GLib::Strv.wrap(_v2.get_pointer(0))
|
52
52
|
return _v3
|
53
53
|
end
|
54
54
|
CODE
|
@@ -61,7 +61,7 @@ describe GirFFI::Builders::FunctionBuilder do
|
|
61
61
|
code.must_equal <<-CODE.reset_indentation
|
62
62
|
def self.test_callback_destroy_notify(&callback)
|
63
63
|
_v1 = Regress::TestCallbackUserData.from(callback)
|
64
|
-
_v2 = GirFFI::
|
64
|
+
_v2 = GirFFI::ArgHelper.store(_v1)
|
65
65
|
_v3 = GLib::DestroyNotify.default
|
66
66
|
_v4 = Regress::Lib.regress_test_callback_destroy_notify _v1, _v2, _v3
|
67
67
|
return _v4
|
@@ -100,9 +100,9 @@ describe GirFFI::Builders::FunctionBuilder do
|
|
100
100
|
it 'creates a call to #get_value' do
|
101
101
|
code.must_equal <<-CODE.reset_indentation
|
102
102
|
def self.gvalue_out
|
103
|
-
_v1 =
|
103
|
+
_v1 = FFI::MemoryPointer.new :pointer
|
104
104
|
GIMarshallingTests::Lib.gi_marshalling_tests_gvalue_out _v1
|
105
|
-
_v2 = GObject::Value.wrap(_v1.
|
105
|
+
_v2 = GObject::Value.wrap(_v1.get_pointer(0)).get_value
|
106
106
|
return _v2
|
107
107
|
end
|
108
108
|
CODE
|
@@ -144,11 +144,11 @@ describe GirFFI::Builders::FunctionBuilder do
|
|
144
144
|
it 'builds correct definition' do
|
145
145
|
code.must_equal <<-CODE.reset_indentation
|
146
146
|
def self.test_array_int_null_out
|
147
|
-
_v1 =
|
148
|
-
_v2 =
|
147
|
+
_v1 = FFI::MemoryPointer.new :int32
|
148
|
+
_v2 = FFI::MemoryPointer.new :pointer
|
149
149
|
Regress::Lib.regress_test_array_int_null_out _v2, _v1
|
150
|
-
_v3 = _v1.
|
151
|
-
_v4 = GirFFI::SizedArray.wrap(:gint32, _v3, _v2.
|
150
|
+
_v3 = _v1.get_int32(0)
|
151
|
+
_v4 = GirFFI::SizedArray.wrap(:gint32, _v3, _v2.get_pointer(0))
|
152
152
|
return _v4
|
153
153
|
end
|
154
154
|
CODE
|
@@ -161,13 +161,13 @@ describe GirFFI::Builders::FunctionBuilder do
|
|
161
161
|
code.must_equal <<-CODE.reset_indentation
|
162
162
|
def method_array_inout(ints)
|
163
163
|
length = ints.nil? ? 0 : ints.length
|
164
|
-
_v1 =
|
165
|
-
_v1.
|
166
|
-
_v2 =
|
167
|
-
_v2.
|
164
|
+
_v1 = FFI::MemoryPointer.new :int32
|
165
|
+
_v1.put_int32 0, length
|
166
|
+
_v2 = FFI::MemoryPointer.new :pointer
|
167
|
+
_v2.put_pointer 0, GirFFI::SizedArray.from(:gint32, -1, ints)
|
168
168
|
GIMarshallingTests::Lib.gi_marshalling_tests_object_method_array_inout self, _v2, _v1
|
169
|
-
_v3 = _v1.
|
170
|
-
_v4 = GirFFI::SizedArray.wrap(:gint32, _v3, _v2.
|
169
|
+
_v3 = _v1.get_int32(0)
|
170
|
+
_v4 = GirFFI::SizedArray.wrap(:gint32, _v3, _v2.get_pointer(0))
|
171
171
|
return _v4
|
172
172
|
end
|
173
173
|
CODE
|
@@ -190,10 +190,10 @@ describe GirFFI::Builders::FunctionBuilder do
|
|
190
190
|
describe 'for GLib::Variant.get_strv' do
|
191
191
|
let(:function_info) { get_method_introspection_data 'GLib', 'Variant', 'get_strv' }
|
192
192
|
it 'builds a correct definition' do
|
193
|
-
size_type = ":
|
193
|
+
size_type = ":uint#{FFI.type_size(:size_t) * 8}"
|
194
194
|
code.must_equal <<-CODE.reset_indentation
|
195
195
|
def get_strv
|
196
|
-
_v1 =
|
196
|
+
_v1 = FFI::MemoryPointer.new #{size_type}
|
197
197
|
_v2 = GLib::Lib.g_variant_get_strv self, _v1
|
198
198
|
_v3 = GLib::Strv.wrap(_v2)
|
199
199
|
return _v3
|
@@ -229,47 +229,222 @@ describe GirFFI::Builders::FunctionBuilder do
|
|
229
229
|
code.must_equal <<-CODE.reset_indentation
|
230
230
|
def method_int8_arg_and_out_callee(arg)
|
231
231
|
_v1 = arg
|
232
|
-
_v2 =
|
232
|
+
_v2 = FFI::MemoryPointer.new :pointer
|
233
233
|
GIMarshallingTests::Lib.gi_marshalling_tests_object_method_int8_arg_and_out_callee self, _v1, _v2
|
234
|
-
_v3 =
|
234
|
+
_v3 = _v2.get_pointer(0).get_int8(0)
|
235
235
|
return _v3
|
236
236
|
end
|
237
237
|
CODE
|
238
238
|
end
|
239
239
|
end
|
240
240
|
|
241
|
-
describe '
|
242
|
-
|
243
|
-
|
244
|
-
|
241
|
+
describe 'object ownership transfer' do
|
242
|
+
describe 'for GIMarshallingTests::Object#full_in' do
|
243
|
+
let(:function_info) do
|
244
|
+
get_method_introspection_data('GIMarshallingTests', 'Object',
|
245
|
+
'full_in')
|
246
|
+
end
|
247
|
+
|
248
|
+
# NOTE: This method is transfer-ownership: none, despite the name.
|
249
|
+
it 'builds a correct definition' do
|
250
|
+
code.must_equal <<-CODE.reset_indentation
|
251
|
+
def full_in
|
252
|
+
GIMarshallingTests::Lib.gi_marshalling_tests_object_full_in self
|
253
|
+
end
|
254
|
+
CODE
|
255
|
+
end
|
245
256
|
end
|
246
257
|
|
247
|
-
|
248
|
-
|
258
|
+
describe 'for GIMarshallingTests::Object.full_inout' do
|
259
|
+
let(:function_info) do
|
260
|
+
get_method_introspection_data('GIMarshallingTests', 'Object',
|
261
|
+
'full_inout')
|
262
|
+
end
|
263
|
+
|
264
|
+
it 'builds a correct definition' do
|
265
|
+
code.must_equal <<-CODE.reset_indentation
|
249
266
|
def self.full_inout(object)
|
250
|
-
_v1 =
|
251
|
-
_v1.
|
267
|
+
_v1 = FFI::MemoryPointer.new :pointer
|
268
|
+
_v1.put_pointer 0, GIMarshallingTests::Object.from(object.ref)
|
252
269
|
GIMarshallingTests::Lib.gi_marshalling_tests_object_full_inout _v1
|
253
|
-
_v2 = GIMarshallingTests::Object.wrap(_v1.
|
270
|
+
_v2 = GIMarshallingTests::Object.wrap(_v1.get_pointer(0))
|
254
271
|
return _v2
|
255
272
|
end
|
256
|
-
|
273
|
+
CODE
|
274
|
+
end
|
257
275
|
end
|
258
|
-
end
|
259
276
|
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
277
|
+
describe 'for GIMarshallingTests::Object.full_out' do
|
278
|
+
let(:function_info) do
|
279
|
+
get_method_introspection_data('GIMarshallingTests', 'Object',
|
280
|
+
'full_out')
|
281
|
+
end
|
282
|
+
|
283
|
+
it 'builds a correct definition' do
|
284
|
+
code.must_equal <<-CODE.reset_indentation
|
285
|
+
def self.full_out
|
286
|
+
_v1 = FFI::MemoryPointer.new :pointer
|
287
|
+
GIMarshallingTests::Lib.gi_marshalling_tests_object_full_out _v1
|
288
|
+
_v2 = GIMarshallingTests::Object.wrap(_v1.get_pointer(0))
|
289
|
+
return _v2
|
290
|
+
end
|
291
|
+
CODE
|
292
|
+
end
|
264
293
|
end
|
265
294
|
|
266
|
-
|
267
|
-
|
268
|
-
|
295
|
+
describe 'for GIMarshallingTests::Object.full_return' do
|
296
|
+
let(:function_info) do
|
297
|
+
get_method_introspection_data('GIMarshallingTests', 'Object',
|
298
|
+
'full_return')
|
299
|
+
end
|
300
|
+
|
301
|
+
it 'builds a correct definition' do
|
302
|
+
code.must_equal <<-CODE.reset_indentation
|
303
|
+
def self.full_return
|
304
|
+
_v1 = GIMarshallingTests::Lib.gi_marshalling_tests_object_full_return
|
305
|
+
_v2 = GIMarshallingTests::Object.wrap(_v1)
|
306
|
+
return _v2
|
307
|
+
end
|
308
|
+
CODE
|
309
|
+
end
|
310
|
+
end
|
311
|
+
|
312
|
+
describe 'for GIMarshallingTests::Object#none_in' do
|
313
|
+
let(:function_info) do
|
314
|
+
get_method_introspection_data('GIMarshallingTests', 'Object',
|
315
|
+
'none_in')
|
316
|
+
end
|
317
|
+
|
318
|
+
it 'builds a correct definition' do
|
319
|
+
code.must_equal <<-CODE.reset_indentation
|
320
|
+
def none_in
|
321
|
+
GIMarshallingTests::Lib.gi_marshalling_tests_object_none_in self
|
322
|
+
end
|
323
|
+
CODE
|
324
|
+
end
|
325
|
+
end
|
326
|
+
|
327
|
+
describe 'for GIMarshallingTests::Object.none_inout' do
|
328
|
+
let(:function_info) do
|
329
|
+
get_method_introspection_data('GIMarshallingTests', 'Object',
|
330
|
+
'none_inout')
|
331
|
+
end
|
332
|
+
|
333
|
+
it 'builds a correct definition' do
|
334
|
+
code.must_equal <<-CODE.reset_indentation
|
335
|
+
def self.none_inout(object)
|
336
|
+
_v1 = FFI::MemoryPointer.new :pointer
|
337
|
+
_v1.put_pointer 0, GIMarshallingTests::Object.from(object)
|
338
|
+
GIMarshallingTests::Lib.gi_marshalling_tests_object_none_inout _v1
|
339
|
+
_v2 = GIMarshallingTests::Object.wrap(_v1.get_pointer(0)).tap { |it| it && it.ref }
|
340
|
+
return _v2
|
341
|
+
end
|
342
|
+
CODE
|
343
|
+
end
|
344
|
+
end
|
345
|
+
|
346
|
+
describe 'for GIMarshallingTests::Object.none_out' do
|
347
|
+
let(:function_info) do
|
348
|
+
get_method_introspection_data('GIMarshallingTests', 'Object',
|
349
|
+
'none_out')
|
350
|
+
end
|
351
|
+
|
352
|
+
it 'builds a correct definition' do
|
353
|
+
code.must_equal <<-CODE.reset_indentation
|
354
|
+
def self.none_out
|
355
|
+
_v1 = FFI::MemoryPointer.new :pointer
|
356
|
+
GIMarshallingTests::Lib.gi_marshalling_tests_object_none_out _v1
|
357
|
+
_v2 = GIMarshallingTests::Object.wrap(_v1.get_pointer(0)).tap { |it| it && it.ref }
|
358
|
+
return _v2
|
359
|
+
end
|
360
|
+
CODE
|
361
|
+
end
|
362
|
+
end
|
363
|
+
|
364
|
+
describe 'for GIMarshallingTests::Object.none_return' do
|
365
|
+
let(:function_info) do
|
366
|
+
get_method_introspection_data('GIMarshallingTests', 'Object',
|
367
|
+
'none_return')
|
368
|
+
end
|
369
|
+
|
370
|
+
it 'builds a correct definition' do
|
371
|
+
code.must_equal <<-CODE.reset_indentation
|
372
|
+
def self.none_return
|
373
|
+
_v1 = GIMarshallingTests::Lib.gi_marshalling_tests_object_none_return
|
374
|
+
_v2 = GIMarshallingTests::Object.wrap(_v1).tap { |it| it && it.ref }
|
375
|
+
return _v2
|
376
|
+
end
|
377
|
+
CODE
|
378
|
+
end
|
379
|
+
end
|
380
|
+
|
381
|
+
describe 'for Regress::TestObj#instance_method_full' do
|
382
|
+
let(:function_info) do
|
383
|
+
get_method_introspection_data('Regress', 'TestObj',
|
384
|
+
'instance_method_full')
|
385
|
+
end
|
386
|
+
|
387
|
+
it 'builds a correct definition including self.ref' do
|
388
|
+
skip unless function_info
|
389
|
+
code.must_equal <<-CODE.reset_indentation
|
269
390
|
def instance_method_full
|
270
391
|
Regress::Lib.regress_test_obj_instance_method_full self.ref
|
271
392
|
end
|
272
|
-
|
393
|
+
CODE
|
394
|
+
end
|
395
|
+
end
|
396
|
+
end
|
397
|
+
|
398
|
+
describe 'struct ownership transfer' do
|
399
|
+
describe 'for GIMarshallingTests::BoxedStruct.inout' do
|
400
|
+
let(:function_info) do
|
401
|
+
get_method_introspection_data('GIMarshallingTests', 'BoxedStruct', 'inout')
|
402
|
+
end
|
403
|
+
|
404
|
+
it 'builds a correct definition' do
|
405
|
+
code.must_equal <<-CODE.reset_indentation
|
406
|
+
def self.inout(struct_)
|
407
|
+
_v1 = FFI::MemoryPointer.new :pointer
|
408
|
+
_v1.put_pointer 0, GIMarshallingTests::BoxedStruct.copy_from(struct_)
|
409
|
+
GIMarshallingTests::Lib.gi_marshalling_tests_boxed_struct_inout _v1
|
410
|
+
_v2 = GIMarshallingTests::BoxedStruct.wrap_own(_v1.get_pointer(0))
|
411
|
+
return _v2
|
412
|
+
end
|
413
|
+
CODE
|
414
|
+
end
|
415
|
+
end
|
416
|
+
|
417
|
+
describe 'for GIMarshallingTests::BoxedStruct.out' do
|
418
|
+
let(:function_info) do
|
419
|
+
get_method_introspection_data('GIMarshallingTests', 'BoxedStruct', 'out')
|
420
|
+
end
|
421
|
+
|
422
|
+
it 'builds a correct definition' do
|
423
|
+
code.must_equal <<-CODE.reset_indentation
|
424
|
+
def self.out
|
425
|
+
_v1 = FFI::MemoryPointer.new :pointer
|
426
|
+
GIMarshallingTests::Lib.gi_marshalling_tests_boxed_struct_out _v1
|
427
|
+
_v2 = GIMarshallingTests::BoxedStruct.wrap_copy(_v1.get_pointer(0))
|
428
|
+
return _v2
|
429
|
+
end
|
430
|
+
CODE
|
431
|
+
end
|
432
|
+
end
|
433
|
+
|
434
|
+
describe 'for GIMarshallingTests::BoxedStruct.returnv' do
|
435
|
+
let(:function_info) do
|
436
|
+
get_method_introspection_data('GIMarshallingTests', 'BoxedStruct', 'returnv')
|
437
|
+
end
|
438
|
+
|
439
|
+
it 'builds a correct definition' do
|
440
|
+
code.must_equal <<-CODE.reset_indentation
|
441
|
+
def self.returnv
|
442
|
+
_v1 = GIMarshallingTests::Lib.gi_marshalling_tests_boxed_struct_returnv
|
443
|
+
_v2 = GIMarshallingTests::BoxedStruct.wrap_copy(_v1)
|
444
|
+
return _v2
|
445
|
+
end
|
446
|
+
CODE
|
447
|
+
end
|
273
448
|
end
|
274
449
|
end
|
275
450
|
|
@@ -278,7 +453,7 @@ describe GirFFI::Builders::FunctionBuilder do
|
|
278
453
|
it 'builds correct definition with default parameter value' do
|
279
454
|
code.must_equal <<-CODE.reset_indentation
|
280
455
|
def self.test_utf8_null_in(in_ = nil)
|
281
|
-
_v1 = GirFFI::InPointer.
|
456
|
+
_v1 = GirFFI::InPointer.from_utf8(in_)
|
282
457
|
Regress::Lib.regress_test_utf8_null_in _v1
|
283
458
|
end
|
284
459
|
CODE
|
@@ -293,12 +468,43 @@ describe GirFFI::Builders::FunctionBuilder do
|
|
293
468
|
_v1 = GObject::Value.from(return_value)
|
294
469
|
n_param_values = param_values.nil? ? 0 : param_values.length
|
295
470
|
_v2 = n_param_values
|
296
|
-
_v3 =
|
471
|
+
_v3 = invocation_hint
|
297
472
|
_v4 = GirFFI::SizedArray.from(GObject::Value, -1, param_values)
|
298
473
|
GObject::Lib.g_closure_invoke self, _v1, _v2, _v4, _v3
|
299
474
|
end
|
300
475
|
CODE
|
301
476
|
end
|
302
477
|
end
|
478
|
+
|
479
|
+
describe 'ownership transfer for an ingoing array of structs' do
|
480
|
+
describe 'with no ownership transfer of the elements' do
|
481
|
+
let(:function_info) { get_introspection_data 'GIMarshallingTests', 'array_struct_in' }
|
482
|
+
|
483
|
+
it 'builds a correct definition' do
|
484
|
+
code.must_equal <<-CODE.reset_indentation
|
485
|
+
def self.array_struct_in(structs)
|
486
|
+
length = structs.nil? ? 0 : structs.length
|
487
|
+
_v1 = length
|
488
|
+
_v2 = GirFFI::SizedArray.from([:pointer, GIMarshallingTests::BoxedStruct], -1, structs)
|
489
|
+
GIMarshallingTests::Lib.gi_marshalling_tests_array_struct_in _v2, _v1
|
490
|
+
end
|
491
|
+
CODE
|
492
|
+
end
|
493
|
+
end
|
494
|
+
describe 'with ownership transfer of the elements' do
|
495
|
+
let(:function_info) { get_introspection_data 'GIMarshallingTests', 'array_struct_take_in' }
|
496
|
+
|
497
|
+
it 'builds a correct definition' do
|
498
|
+
code.must_equal <<-CODE.reset_indentation
|
499
|
+
def self.array_struct_take_in(structs)
|
500
|
+
length = structs.nil? ? 0 : structs.length
|
501
|
+
_v1 = length
|
502
|
+
_v2 = GirFFI::SizedArray.copy_from([:pointer, GIMarshallingTests::BoxedStruct], -1, structs)
|
503
|
+
GIMarshallingTests::Lib.gi_marshalling_tests_array_struct_take_in _v2, _v1
|
504
|
+
end
|
505
|
+
CODE
|
506
|
+
end
|
507
|
+
end
|
508
|
+
end
|
303
509
|
end
|
304
510
|
end
|