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.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +9 -0
  3. data/lib/ffi-glib/byte_array.rb +1 -1
  4. data/lib/ffi-glib/bytes.rb +4 -4
  5. data/lib/ffi-glib/container_class_methods.rb +2 -0
  6. data/lib/ffi-glib/iconv.rb +2 -2
  7. data/lib/ffi-glib/variant.rb +10 -2
  8. data/lib/ffi-gobject.rb +6 -14
  9. data/lib/ffi-gobject/object.rb +7 -0
  10. data/lib/ffi-gobject/object_class.rb +1 -1
  11. data/lib/ffi-gobject/param_spec.rb +12 -0
  12. data/lib/ffi-gobject/value.rb +20 -11
  13. data/lib/gir_ffi-base/gobject.rb +35 -3
  14. data/lib/gir_ffi-base/gobject/lib.rb +2 -0
  15. data/lib/gir_ffi/allocation_helper.rb +11 -0
  16. data/lib/gir_ffi/arg_helper.rb +4 -0
  17. data/lib/gir_ffi/boxed_base.rb +28 -32
  18. data/lib/gir_ffi/builders/argument_builder.rb +31 -6
  19. data/lib/gir_ffi/builders/c_to_ruby_convertor.rb +36 -7
  20. data/lib/gir_ffi/builders/callback_argument_builder.rb +24 -10
  21. data/lib/gir_ffi/builders/closure_to_pointer_convertor.rb +1 -1
  22. data/lib/gir_ffi/builders/field_builder.rb +28 -10
  23. data/lib/gir_ffi/builders/full_c_to_ruby_convertor.rb +2 -3
  24. data/lib/gir_ffi/builders/initializer_return_value_builder.rb +5 -1
  25. data/lib/gir_ffi/builders/null_argument_builder.rb +0 -12
  26. data/lib/gir_ffi/builders/pointer_value_convertor.rb +38 -0
  27. data/lib/gir_ffi/builders/return_value_builder.rb +12 -10
  28. data/lib/gir_ffi/builders/ruby_to_c_convertor.rb +21 -2
  29. data/lib/gir_ffi/builders/struct_builder.rb +9 -2
  30. data/lib/gir_ffi/builders/{boxed_builder.rb → struct_like.rb} +2 -5
  31. data/lib/gir_ffi/builders/unintrospectable_boxed_builder.rb +5 -2
  32. data/lib/gir_ffi/builders/union_builder.rb +5 -2
  33. data/lib/gir_ffi/enum_base.rb +4 -0
  34. data/lib/gir_ffi/error_argument_info.rb +0 -16
  35. data/lib/gir_ffi/ffi_ext/pointer.rb +11 -5
  36. data/lib/gir_ffi/flags_base.rb +4 -0
  37. data/lib/gir_ffi/in_out_pointer.rb +5 -30
  38. data/lib/gir_ffi/in_pointer.rb +5 -4
  39. data/lib/gir_ffi/info_ext/i_type_info.rb +3 -5
  40. data/lib/gir_ffi/object_base.rb +4 -0
  41. data/lib/gir_ffi/sized_array.rb +20 -0
  42. data/lib/gir_ffi/struct_base.rb +13 -2
  43. data/lib/gir_ffi/struct_like_base.rb +53 -0
  44. data/lib/gir_ffi/union_base.rb +7 -1
  45. data/lib/gir_ffi/version.rb +1 -1
  46. data/test/ffi-glib/destroy_notify_test.rb +4 -1
  47. data/test/ffi-gobject/param_spec_test.rb +18 -0
  48. data/test/gir_ffi/arg_helper_test.rb +17 -0
  49. data/test/gir_ffi/boxed_base_test.rb +24 -0
  50. data/test/gir_ffi/builders/argument_builder_test.rb +156 -63
  51. data/test/gir_ffi/builders/callback_argument_builder_test.rb +10 -10
  52. data/test/gir_ffi/builders/callback_builder_test.rb +31 -8
  53. data/test/gir_ffi/builders/field_builder_test.rb +32 -30
  54. data/test/gir_ffi/builders/function_builder_test.rb +251 -45
  55. data/test/gir_ffi/builders/initializer_builder_test.rb +17 -1
  56. data/test/gir_ffi/builders/return_value_builder_test.rb +115 -68
  57. data/test/gir_ffi/builders/struct_builder_test.rb +6 -0
  58. data/test/gir_ffi/builders/unintrospectable_builder_test.rb +4 -1
  59. data/test/gir_ffi/builders/vfunc_builder_test.rb +10 -10
  60. data/test/gir_ffi/in_out_pointer_test.rb +12 -81
  61. data/test/gir_ffi/in_pointer_test.rb +0 -17
  62. data/test/gir_ffi/info_ext/i_type_info_test.rb +0 -10
  63. data/test/gir_ffi/sized_array_test.rb +62 -0
  64. data/test/gir_ffi/struct_base_test.rb +24 -0
  65. data/test/gir_ffi/union_base_test.rb +24 -0
  66. data/test/gir_ffi/version_test.rb +1 -1
  67. data/test/integration/generated_gimarshallingtests_test.rb +32 -12
  68. data/test/integration/generated_regress_test.rb +9 -12
  69. metadata +12 -8
  70. data/lib/ffi-gobject/base.rb +0 -27
  71. data/lib/gir_ffi/user_data_argument_info.rb +0 -24
  72. data/lib/gir_ffi/user_data_type_info.rb +0 -22
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+ require 'gir_ffi_test_helper'
3
+
4
+ GirFFI.setup :GIMarshallingTests
5
+
6
+ describe GirFFI::BoxedBase do
7
+ describe 'wrap_copy' do
8
+ it 'returns a wrapped copy with autorelease true' do
9
+ original = GIMarshallingTests::BoxedStruct.new
10
+ copy = GIMarshallingTests::BoxedStruct.wrap_copy(original.to_ptr)
11
+ copy.to_ptr.wont_equal original.to_ptr
12
+ copy.to_ptr.must_be :autorelease?
13
+ end
14
+ end
15
+
16
+ describe 'copy_from' do
17
+ it 'returns a copy with autorelease false' do
18
+ original = GIMarshallingTests::BoxedStruct.new
19
+ copy = GIMarshallingTests::BoxedStruct.copy_from(original)
20
+ copy.to_ptr.wont_equal original.to_ptr
21
+ copy.to_ptr.wont_be :autorelease?
22
+ end
23
+ end
24
+ end
@@ -6,6 +6,23 @@ describe GirFFI::Builders::ArgumentBuilder do
6
6
  let(:builder) { GirFFI::Builders::ArgumentBuilder.new(var_gen, arg_info) }
7
7
 
8
8
  describe 'for an argument with direction :in' do
9
+ describe 'for :c' do
10
+ describe 'with full ownership transfer' do
11
+ let(:arg_info) do
12
+ get_introspection_data('GIMarshallingTests', 'array_struct_take_in').args[0]
13
+ end
14
+
15
+ it 'has the correct value for #pre_conversion' do
16
+ builder.pre_conversion.
17
+ must_equal ['_v1 = GirFFI::SizedArray.copy_from([:pointer, GIMarshallingTests::BoxedStruct], -1, structs)']
18
+ end
19
+
20
+ it 'has the correct value for #post_conversion' do
21
+ builder.post_conversion.must_equal []
22
+ end
23
+ end
24
+ end
25
+
9
26
  describe 'for :callback' do
10
27
  let(:arg_info) do
11
28
  get_introspection_data('Regress', 'test_callback_destroy_notify').args[0]
@@ -48,7 +65,7 @@ describe GirFFI::Builders::ArgumentBuilder do
48
65
  end
49
66
 
50
67
  it 'has the correct value for #pre_conversion' do
51
- builder.pre_conversion.must_equal ['_v1 = GirFFI::InPointer.from(:void, user_data)']
68
+ builder.pre_conversion.must_equal ['_v1 = user_data']
52
69
  end
53
70
 
54
71
  it 'has the correct value for #post_conversion' do
@@ -68,7 +85,7 @@ describe GirFFI::Builders::ArgumentBuilder do
68
85
  end
69
86
 
70
87
  it 'has the correct value for #pre_conversion' do
71
- builder.pre_conversion.must_equal ['_v1 = GirFFI::InPointer.from_closure_data(foo)']
88
+ builder.pre_conversion.must_equal ['_v1 = GirFFI::ArgHelper.store(foo)']
72
89
  end
73
90
 
74
91
  it 'has the correct value for #post_conversion' do
@@ -83,11 +100,11 @@ describe GirFFI::Builders::ArgumentBuilder do
83
100
  let(:arg_info) { get_introspection_data('GIMarshallingTests', 'genum_out').args[0] }
84
101
 
85
102
  it 'has the correct value for #pre_conversion' do
86
- builder.pre_conversion.must_equal ['_v1 = GirFFI::InOutPointer.for GIMarshallingTests::GEnum']
103
+ builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new GIMarshallingTests::GEnum']
87
104
  end
88
105
 
89
106
  it 'has the correct value for #post_conversion' do
90
- builder.post_conversion.must_equal ['_v2 = _v1.to_value']
107
+ builder.post_conversion.must_equal ['_v2 = GIMarshallingTests::GEnum.get_value_from_pointer(_v1, 0)']
91
108
  end
92
109
  end
93
110
 
@@ -97,25 +114,42 @@ describe GirFFI::Builders::ArgumentBuilder do
97
114
  end
98
115
 
99
116
  it 'has the correct value for #pre_conversion' do
100
- builder.pre_conversion.must_equal ['_v1 = GirFFI::InOutPointer.for GIMarshallingTests::Flags']
117
+ builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new GIMarshallingTests::Flags']
101
118
  end
102
119
 
103
120
  it 'has the correct value for #post_conversion' do
104
- builder.post_conversion.must_equal ['_v2 = _v1.to_value']
121
+ builder.post_conversion.must_equal ['_v2 = GIMarshallingTests::Flags.get_value_from_pointer(_v1, 0)']
105
122
  end
106
123
  end
107
124
 
108
125
  describe 'for :object' do
109
- let(:arg_info) do
110
- get_method_introspection_data('Regress', 'TestObj', 'null_out').args[0]
111
- end
126
+ describe 'with full ownership transfer' do
127
+ let(:arg_info) do
128
+ get_method_introspection_data('Regress', 'TestObj', 'null_out').args[0]
129
+ end
112
130
 
113
- it 'has the correct value for #pre_conversion' do
114
- builder.pre_conversion.must_equal ['_v1 = GirFFI::InOutPointer.for [:pointer, Regress::TestObj]']
131
+ it 'has the correct value for #pre_conversion' do
132
+ builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new :pointer']
133
+ end
134
+
135
+ it 'has the correct value for #post_conversion' do
136
+ builder.post_conversion.must_equal ['_v2 = Regress::TestObj.wrap(_v1.get_pointer(0))']
137
+ end
115
138
  end
116
139
 
117
- it 'has the correct value for #post_conversion' do
118
- builder.post_conversion.must_equal ['_v2 = Regress::TestObj.wrap(_v1.to_value)']
140
+ describe 'with no ownership transfer' do
141
+ let(:arg_info) do
142
+ get_method_introspection_data('GIMarshallingTests', 'Object', 'none_out').args[0]
143
+ end
144
+
145
+ it 'has the correct value for #pre_conversion' do
146
+ builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new :pointer']
147
+ end
148
+
149
+ it 'has the correct value for #post_conversion' do
150
+ builder.post_conversion.
151
+ must_equal ['_v2 = GIMarshallingTests::Object.wrap(_v1.get_pointer(0)).tap { |it| it && it.ref }']
152
+ end
119
153
  end
120
154
  end
121
155
 
@@ -127,12 +161,13 @@ describe GirFFI::Builders::ArgumentBuilder do
127
161
 
128
162
  it 'has the correct value for #pre_conversion' do
129
163
  builder.pre_conversion.must_equal [
130
- '_v1 = GirFFI::InOutPointer.for [:pointer, GIMarshallingTests::BoxedStruct]'
164
+ '_v1 = FFI::MemoryPointer.new :pointer'
131
165
  ]
132
166
  end
133
167
 
134
168
  it 'has the correct value for #post_conversion' do
135
- builder.post_conversion.must_equal ['_v2 = GIMarshallingTests::BoxedStruct.wrap(_v1.to_value)']
169
+ builder.post_conversion.
170
+ must_equal ['_v2 = GIMarshallingTests::BoxedStruct.wrap_copy(_v1.get_pointer(0))']
136
171
  end
137
172
  end
138
173
 
@@ -157,11 +192,11 @@ describe GirFFI::Builders::ArgumentBuilder do
157
192
  end
158
193
 
159
194
  it 'has the correct value for #pre_conversion' do
160
- builder.pre_conversion.must_equal ['_v1 = GirFFI::InOutPointer.for [:pointer, :strv]']
195
+ builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new :pointer']
161
196
  end
162
197
 
163
198
  it 'has the correct value for #post_conversion' do
164
- builder.post_conversion.must_equal ['_v2 = GLib::Strv.wrap(_v1.to_value)']
199
+ builder.post_conversion.must_equal ['_v2 = GLib::Strv.wrap(_v1.get_pointer(0))']
165
200
  end
166
201
  end
167
202
 
@@ -172,11 +207,11 @@ describe GirFFI::Builders::ArgumentBuilder do
172
207
  end
173
208
 
174
209
  it 'has the correct value for #pre_conversion' do
175
- builder.pre_conversion.must_equal ['_v1 = GirFFI::InOutPointer.for [:pointer, :array]']
210
+ builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new :pointer']
176
211
  end
177
212
 
178
213
  it 'has the correct value for #post_conversion' do
179
- builder.post_conversion.must_equal ['_v2 = GLib::Array.wrap(:utf8, _v1.to_value)']
214
+ builder.post_conversion.must_equal ['_v2 = GLib::Array.wrap(:utf8, _v1.get_pointer(0))']
180
215
  end
181
216
  end
182
217
 
@@ -207,11 +242,11 @@ describe GirFFI::Builders::ArgumentBuilder do
207
242
  end
208
243
 
209
244
  it 'has the correct value for #pre_conversion' do
210
- builder.pre_conversion.must_equal ['_v1 = GirFFI::InOutPointer.for [:pointer, :ptr_array]']
245
+ builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new :pointer']
211
246
  end
212
247
 
213
248
  it 'has the correct value for #post_conversion' do
214
- builder.post_conversion.must_equal ['_v2 = GLib::PtrArray.wrap(:utf8, _v1.to_value)']
249
+ builder.post_conversion.must_equal ['_v2 = GLib::PtrArray.wrap(:utf8, _v1.get_pointer(0))']
215
250
  end
216
251
  end
217
252
 
@@ -221,11 +256,11 @@ describe GirFFI::Builders::ArgumentBuilder do
221
256
  end
222
257
 
223
258
  it 'has the correct value for #pre_conversion' do
224
- builder.pre_conversion.must_equal ['_v1 = GirFFI::InOutPointer.for [:pointer, :error]']
259
+ builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new :pointer']
225
260
  end
226
261
 
227
262
  it 'has the correct value for #post_conversion' do
228
- builder.post_conversion.must_equal ['_v2 = GLib::Error.wrap(_v1.to_value)']
263
+ builder.post_conversion.must_equal ['_v2 = GLib::Error.wrap(_v1.get_pointer(0))']
229
264
  end
230
265
  end
231
266
 
@@ -236,11 +271,11 @@ describe GirFFI::Builders::ArgumentBuilder do
236
271
  end
237
272
 
238
273
  it 'has the correct value for #pre_conversion' do
239
- builder.pre_conversion.must_equal ['_v1 = GirFFI::InOutPointer.for [:pointer, :c]']
274
+ builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new :pointer']
240
275
  end
241
276
 
242
277
  it 'has the correct value for #post_conversion' do
243
- builder.post_conversion.must_equal ['_v2 = GirFFI::SizedArray.wrap(:gint32, 4, _v1.to_value)']
278
+ builder.post_conversion.must_equal ['_v2 = GirFFI::SizedArray.wrap(:gint32, 4, _v1.get_pointer(0))']
244
279
  end
245
280
  end
246
281
 
@@ -256,11 +291,11 @@ describe GirFFI::Builders::ArgumentBuilder do
256
291
  end
257
292
 
258
293
  it 'has the correct value for #pre_conversion' do
259
- builder.pre_conversion.must_equal ['_v1 = GirFFI::InOutPointer.for [:pointer, :c]']
294
+ builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new :pointer']
260
295
  end
261
296
 
262
297
  it 'has the correct value for #post_conversion' do
263
- builder.post_conversion.must_equal ['_v2 = GirFFI::SizedArray.wrap(:gint32, bar, _v1.to_value)']
298
+ builder.post_conversion.must_equal ['_v2 = GirFFI::SizedArray.wrap(:gint32, bar, _v1.get_pointer(0))']
264
299
  end
265
300
  end
266
301
  end
@@ -271,11 +306,11 @@ describe GirFFI::Builders::ArgumentBuilder do
271
306
  end
272
307
 
273
308
  it 'has the correct value for #pre_conversion' do
274
- builder.pre_conversion.must_equal ['_v1 = GirFFI::InOutPointer.for [:pointer, :glist]']
309
+ builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new :pointer']
275
310
  end
276
311
 
277
312
  it 'has the correct value for #post_conversion' do
278
- builder.post_conversion.must_equal ['_v2 = GLib::List.wrap(:utf8, _v1.to_value)']
313
+ builder.post_conversion.must_equal ['_v2 = GLib::List.wrap(:utf8, _v1.get_pointer(0))']
279
314
  end
280
315
  end
281
316
 
@@ -285,11 +320,11 @@ describe GirFFI::Builders::ArgumentBuilder do
285
320
  end
286
321
 
287
322
  it 'has the correct value for #pre_conversion' do
288
- builder.pre_conversion.must_equal ['_v1 = GirFFI::InOutPointer.for [:pointer, :gslist]']
323
+ builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new :pointer']
289
324
  end
290
325
 
291
326
  it 'has the correct value for #post_conversion' do
292
- builder.post_conversion.must_equal ['_v2 = GLib::SList.wrap(:utf8, _v1.to_value)']
327
+ builder.post_conversion.must_equal ['_v2 = GLib::SList.wrap(:utf8, _v1.get_pointer(0))']
293
328
  end
294
329
  end
295
330
 
@@ -299,11 +334,48 @@ describe GirFFI::Builders::ArgumentBuilder do
299
334
  end
300
335
 
301
336
  it 'has the correct value for #pre_conversion' do
302
- builder.pre_conversion.must_equal ['_v1 = GirFFI::InOutPointer.for [:pointer, [:ghash, :utf8, :utf8]]']
337
+ builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new :pointer']
303
338
  end
304
339
 
305
340
  it 'has the correct value for #post_conversion' do
306
- builder.post_conversion.must_equal ['_v2 = GLib::HashTable.wrap([:utf8, :utf8], _v1.to_value)']
341
+ builder.post_conversion.must_equal ['_v2 = GLib::HashTable.wrap([:utf8, :utf8], _v1.get_pointer(0))']
342
+ end
343
+ end
344
+
345
+ describe 'for :utf8' do
346
+ describe 'with full ownership transfer' do
347
+ let(:arg_info) do
348
+ get_introspection_data('GIMarshallingTests', 'utf8_full_out').args[0]
349
+ end
350
+
351
+ it 'has the correct value for #pre_conversion' do
352
+ builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new :pointer']
353
+ end
354
+
355
+ it 'has the correct value for #post_conversion' do
356
+ builder.post_conversion.must_equal [
357
+ '_v2 = _v1.get_pointer(0).tap { |it| it.autorelease = true }.to_utf8'
358
+ ]
359
+ end
360
+
361
+ it 'has the correct value for #return_value_name' do
362
+ builder.post_conversion
363
+ builder.return_value_name.must_equal '_v2'
364
+ end
365
+ end
366
+
367
+ describe 'with no ownership transfer' do
368
+ let(:arg_info) do
369
+ get_introspection_data('GIMarshallingTests', 'utf8_none_out').args[0]
370
+ end
371
+
372
+ it 'has the correct value for #pre_conversion' do
373
+ builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new :pointer']
374
+ end
375
+
376
+ it 'has the correct value for #post_conversion' do
377
+ builder.post_conversion.must_equal ['_v2 = _v1.get_pointer(0).to_utf8']
378
+ end
307
379
  end
308
380
  end
309
381
  end
@@ -315,12 +387,12 @@ describe GirFFI::Builders::ArgumentBuilder do
315
387
  end
316
388
 
317
389
  it 'has the correct value for #pre_conversion' do
318
- builder.pre_conversion.must_equal ['_v1 = GirFFI::InOutPointer.for GIMarshallingTests::Enum',
319
- "_v1.set_value #{arg_info.name}"]
390
+ builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new GIMarshallingTests::Enum',
391
+ "GIMarshallingTests::Enum.copy_value_to_pointer(#{arg_info.name}, _v1)"]
320
392
  end
321
393
 
322
394
  it 'has the correct value for #post_conversion' do
323
- builder.post_conversion.must_equal ['_v2 = _v1.to_value']
395
+ builder.post_conversion.must_equal ['_v2 = GIMarshallingTests::Enum.get_value_from_pointer(_v1, 0)']
324
396
  end
325
397
  end
326
398
 
@@ -330,12 +402,13 @@ describe GirFFI::Builders::ArgumentBuilder do
330
402
  end
331
403
 
332
404
  it 'has the correct value for #pre_conversion' do
333
- builder.pre_conversion.must_equal ['_v1 = GirFFI::InOutPointer.for GIMarshallingTests::NoTypeFlags',
334
- "_v1.set_value #{arg_info.name}"]
405
+ builder.pre_conversion.
406
+ must_equal ['_v1 = FFI::MemoryPointer.new GIMarshallingTests::NoTypeFlags',
407
+ "GIMarshallingTests::NoTypeFlags.copy_value_to_pointer(#{arg_info.name}, _v1)"]
335
408
  end
336
409
 
337
410
  it 'has the correct value for #post_conversion' do
338
- builder.post_conversion.must_equal ['_v2 = _v1.to_value']
411
+ builder.post_conversion.must_equal ['_v2 = GIMarshallingTests::NoTypeFlags.get_value_from_pointer(_v1, 0)']
339
412
  end
340
413
  end
341
414
 
@@ -349,12 +422,12 @@ describe GirFFI::Builders::ArgumentBuilder do
349
422
  end
350
423
 
351
424
  it 'has the correct value for #pre_conversion' do
352
- builder.pre_conversion.must_equal ['_v1 = GirFFI::InOutPointer.for :gint32',
353
- "_v1.set_value #{arg_info.name}"]
425
+ builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new :int32',
426
+ "_v1.put_int32 0, #{arg_info.name}"]
354
427
  end
355
428
 
356
429
  it 'has the correct value for #post_conversion' do
357
- builder.post_conversion.must_equal ['_v2 = _v1.to_value']
430
+ builder.post_conversion.must_equal ['_v2 = _v1.get_int32(0)']
358
431
  end
359
432
  end
360
433
 
@@ -374,12 +447,12 @@ describe GirFFI::Builders::ArgumentBuilder do
374
447
 
375
448
  it 'has the correct value for #pre_conversion' do
376
449
  builder.pre_conversion.must_equal ['n_ints = ints.nil? ? 0 : ints.length',
377
- '_v1 = GirFFI::InOutPointer.for :gint32',
378
- '_v1.set_value n_ints']
450
+ '_v1 = FFI::MemoryPointer.new :int32',
451
+ '_v1.put_int32 0, n_ints']
379
452
  end
380
453
 
381
454
  it 'has the correct value for #post_conversion' do
382
- builder.post_conversion.must_equal ['_v2 = _v1.to_value']
455
+ builder.post_conversion.must_equal ['_v2 = _v1.get_int32(0)']
383
456
  end
384
457
  end
385
458
 
@@ -389,12 +462,12 @@ describe GirFFI::Builders::ArgumentBuilder do
389
462
  end
390
463
 
391
464
  it 'has the correct value for #pre_conversion' do
392
- builder.pre_conversion.must_equal ['_v1 = GirFFI::InOutPointer.for [:pointer, :strv]',
393
- '_v1.set_value GLib::Strv.from(g_strv)']
465
+ builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new :pointer',
466
+ '_v1.put_pointer 0, GLib::Strv.from(g_strv)']
394
467
  end
395
468
 
396
469
  it 'has the correct value for #post_conversion' do
397
- builder.post_conversion.must_equal ['_v2 = GLib::Strv.wrap(_v1.to_value)']
470
+ builder.post_conversion.must_equal ['_v2 = GLib::Strv.wrap(_v1.get_pointer(0))']
398
471
  end
399
472
  end
400
473
 
@@ -404,12 +477,12 @@ describe GirFFI::Builders::ArgumentBuilder do
404
477
  end
405
478
 
406
479
  it 'has the correct value for #pre_conversion' do
407
- builder.pre_conversion.must_equal ['_v1 = GirFFI::InOutPointer.for [:pointer, :ptr_array]',
408
- '_v1.set_value GLib::PtrArray.from(:utf8, parray_)']
480
+ builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new :pointer',
481
+ '_v1.put_pointer 0, GLib::PtrArray.from(:utf8, parray_)']
409
482
  end
410
483
 
411
484
  it 'has the correct value for #post_conversion' do
412
- builder.post_conversion.must_equal ['_v2 = GLib::PtrArray.wrap(:utf8, _v1.to_value)']
485
+ builder.post_conversion.must_equal ['_v2 = GLib::PtrArray.wrap(:utf8, _v1.get_pointer(0))']
413
486
  end
414
487
  end
415
488
 
@@ -419,12 +492,32 @@ describe GirFFI::Builders::ArgumentBuilder do
419
492
  end
420
493
 
421
494
  it 'has the correct value for #pre_conversion' do
422
- builder.pre_conversion.must_equal ['_v1 = GirFFI::InOutPointer.for :utf8',
423
- '_v1.set_value GirFFI::InPointer.from(:utf8, utf8)']
495
+ builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new :pointer',
496
+ '_v1.put_pointer 0, GirFFI::InPointer.from_utf8(utf8)']
424
497
  end
425
498
 
426
499
  it 'has the correct value for #post_conversion' do
427
- builder.post_conversion.must_equal ['_v2 = _v1.to_value.to_utf8']
500
+ builder.post_conversion.must_equal ['_v2 = _v1.get_pointer(0).to_utf8']
501
+ end
502
+ end
503
+
504
+ describe 'for :struct' do
505
+ describe 'with full ownership transfer' do
506
+ let(:arg_info) do
507
+ get_introspection_data('GIMarshallingTests', 'boxed_struct_inout').args[0]
508
+ end
509
+
510
+ it 'has the correct value for #pre_conversion' do
511
+ builder.pre_conversion.must_equal [
512
+ '_v1 = FFI::MemoryPointer.new :pointer',
513
+ '_v1.put_pointer 0, GIMarshallingTests::BoxedStruct.copy_from(struct_)'
514
+ ]
515
+ end
516
+
517
+ it 'has the correct value for #post_conversion' do
518
+ builder.post_conversion.
519
+ must_equal ['_v2 = GIMarshallingTests::BoxedStruct.wrap_own(_v1.get_pointer(0))']
520
+ end
428
521
  end
429
522
  end
430
523
 
@@ -437,13 +530,13 @@ describe GirFFI::Builders::ArgumentBuilder do
437
530
  it 'has the correct value for #pre_conversion' do
438
531
  builder.pre_conversion.must_equal [
439
532
  'GirFFI::ArgHelper.check_fixed_array_size 4, ints, "ints"',
440
- '_v1 = GirFFI::InOutPointer.for [:pointer, :c]',
441
- '_v1.set_value GirFFI::SizedArray.from(:gint32, 4, ints)'
533
+ '_v1 = FFI::MemoryPointer.new :pointer',
534
+ '_v1.put_pointer 0, GirFFI::SizedArray.from(:gint32, 4, ints)'
442
535
  ]
443
536
  end
444
537
 
445
538
  it 'has the correct value for #post_conversion' do
446
- builder.post_conversion.must_equal ['_v2 = GirFFI::SizedArray.wrap(:gint32, 4, _v1.to_value)']
539
+ builder.post_conversion.must_equal ['_v2 = GirFFI::SizedArray.wrap(:gint32, 4, _v1.get_pointer(0))']
447
540
  end
448
541
  end
449
542
 
@@ -463,13 +556,13 @@ describe GirFFI::Builders::ArgumentBuilder do
463
556
 
464
557
  it 'has the correct value for #pre_conversion' do
465
558
  builder.pre_conversion.must_equal [
466
- '_v1 = GirFFI::InOutPointer.for [:pointer, :c]',
467
- '_v1.set_value GirFFI::SizedArray.from(:gint32, -1, ints)'
559
+ '_v1 = FFI::MemoryPointer.new :pointer',
560
+ '_v1.put_pointer 0, GirFFI::SizedArray.copy_from(:gint32, -1, ints)'
468
561
  ]
469
562
  end
470
563
 
471
564
  it 'has the correct value for #post_conversion' do
472
- builder.post_conversion.must_equal ['_v3 = GirFFI::SizedArray.wrap(:gint32, _v2, _v1.to_value)']
565
+ builder.post_conversion.must_equal ['_v3 = GirFFI::SizedArray.wrap(:gint32, _v2, _v1.get_pointer(0))']
473
566
  end
474
567
  end
475
568
  end
@@ -503,8 +596,8 @@ describe GirFFI::Builders::ArgumentBuilder do
503
596
  end
504
597
 
505
598
  it 'has the correct value for #pre_conversion' do
506
- builder.pre_conversion.must_equal ['_v1 = GirFFI::InOutPointer.for :gint32',
507
- '_v1.set_value 0']
599
+ builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new :int32',
600
+ '_v1.put_int32 0, 0']
508
601
  end
509
602
 
510
603
  it 'has the correct value for #post_conversion' do
@@ -522,7 +615,7 @@ describe GirFFI::Builders::ArgumentBuilder do
522
615
  end
523
616
 
524
617
  it 'has the correct value for #pre_conversion' do
525
- builder.pre_conversion.must_equal ['_v1 = GirFFI::InOutPointer.for :gint32']
618
+ builder.pre_conversion.must_equal ['_v1 = FFI::MemoryPointer.new :int32']
526
619
  end
527
620
 
528
621
  it 'has the correct value for #post_conversion' do