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
@@ -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