gir_ffi 0.9.5 → 0.10.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -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 = GirFFI::InOutPointer.new([:pointer, :zero_terminated], a)']
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.set_value GirFFI::ZeroTerminated.from(:gfloat, _v2)']
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 = GirFFI::InOutPointer.new([:pointer, :error], _error)',
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.set_value GLib::Error.from(_v1)',
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 = GirFFI::InOutPointer.new([:pointer, :c], ints)',
79
- '_v2 = GirFFI::SizedArray.wrap(:gint32, _v3, _v1.to_value)']
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.set_value GirFFI::SizedArray.from(:gint32, -1, _v4)']
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 = GirFFI::InOutPointer.new(:gint32, length)',
101
- '_v2 = _v1.to_value']
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.set_value _v3.length']
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 = GirFFI::InOutPointer.new(:gfloat, a)
61
+ _v1 = a
62
62
  _v2 = _proc.call()
63
- _v1.set_value _v2
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 = GirFFI::InOutPointer.new(:gint32, length)
81
- _v2 = _v1.to_value
82
- _v3 = GirFFI::InOutPointer.new([:pointer, :c], ints)
83
- _v4 = GirFFI::SizedArray.wrap(:gint32, _v2, _v3.to_value)
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.set_value _v5.length
86
- _v3.set_value GirFFI::SizedArray.from(:gint32, -1, _v5)
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 = GirFFI::InOutPointer.new(:gint8, _v1)
14
- _v3 = _v2.to_value
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 = GirFFI::InOutPointer.new(:gint8, _v1)
26
- _v3 = value
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 = GirFFI::InOutPointer.new(Regress::TestSimpleBoxedA, _v1)
41
- _v3 = _v2.to_value
42
- _v4 = Regress::TestSimpleBoxedA.wrap(_v3)
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 = GirFFI::InOutPointer.new(Regress::TestEnum, _v1)
57
- _v3 = _v2.to_value
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::InOutPointer.new(:c, _v1)
72
- _v3 = _v2.to_value
73
- _v4 = GirFFI::SizedArray.wrap(Regress::TestStructE__some_union__union, 2, _v3)
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
- _v3 = GirFFI::SizedArray.from(Regress::TestStructE__some_union__union, 2, value)
87
- _v2.set_value _v3
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 = GirFFI::InOutPointer.new(GObject::ClassInitFunc, _v1)
101
- _v3 = GObject::ClassInitFunc.from(value)
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 = GirFFI::InOutPointer.new(:guint32, _v1)
119
- _v3 = _v2.to_value
120
- _v4 = @struct.to_ptr + #{field_info.offset}
121
- _v5 = GirFFI::InOutPointer.new([:pointer, :c], _v4)
122
- _v6 = _v5.to_value
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 = GirFFI::InOutPointer.for [:pointer, :c]
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.to_value)
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 = GirFFI::InOutPointer.for :gint32
47
- _v1.set_value argc
48
- _v2 = GirFFI::InOutPointer.for [:pointer, :strv]
49
- _v2.set_value GLib::Strv.from(argv)
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.to_value)
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::InPointer.from_closure_data(_v1)
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 = GirFFI::InOutPointer.for [:pointer, GObject::Value]
103
+ _v1 = FFI::MemoryPointer.new :pointer
104
104
  GIMarshallingTests::Lib.gi_marshalling_tests_gvalue_out _v1
105
- _v2 = GObject::Value.wrap(_v1.to_value).get_value
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 = GirFFI::InOutPointer.for :gint32
148
- _v2 = GirFFI::InOutPointer.for [:pointer, :c]
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.to_value
151
- _v4 = GirFFI::SizedArray.wrap(:gint32, _v3, _v2.to_value)
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 = GirFFI::InOutPointer.for :gint32
165
- _v1.set_value length
166
- _v2 = GirFFI::InOutPointer.for [:pointer, :c]
167
- _v2.set_value GirFFI::SizedArray.from(:gint32, -1, ints)
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.to_value
170
- _v4 = GirFFI::SizedArray.wrap(:gint32, _v3, _v2.to_value)
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 = ":guint#{FFI.type_size(:size_t) * 8}"
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 = GirFFI::InOutPointer.for #{size_type}
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 = GirFFI::InOutPointer.for [:pointer, :gint8]
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 = GirFFI::InOutPointer.new(:gint8, _v2.to_value).to_value
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 'for GIMarshallingTests::Object.full_inout' do
242
- let(:function_info) do
243
- get_method_introspection_data('GIMarshallingTests', 'Object',
244
- 'full_inout')
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
- it 'builds a correct definition' do
248
- code.must_equal <<-CODE.reset_indentation
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 = GirFFI::InOutPointer.for [:pointer, GIMarshallingTests::Object]
251
- _v1.set_value GIMarshallingTests::Object.from(object.ref)
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.to_value)
270
+ _v2 = GIMarshallingTests::Object.wrap(_v1.get_pointer(0))
254
271
  return _v2
255
272
  end
256
- CODE
273
+ CODE
274
+ end
257
275
  end
258
- end
259
276
 
260
- describe 'for Regress::TestObj#instance_method_full' do
261
- let(:function_info) do
262
- get_method_introspection_data('Regress', 'TestObj',
263
- 'instance_method_full')
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
- it 'builds a correct definition including self.ref' do
267
- skip unless function_info
268
- code.must_equal <<-CODE.reset_indentation
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
- CODE
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.from(:utf8, in_)
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 = GirFFI::InPointer.from(:void, invocation_hint)
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