gir_ffi 0.13.0 → 0.13.1

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 (102) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +10 -0
  3. data/lib/ffi-glib/array.rb +2 -2
  4. data/lib/ffi-glib/array_methods.rb +1 -0
  5. data/lib/ffi-glib/list_methods.rb +3 -2
  6. data/lib/ffi-glib/main_loop.rb +2 -0
  7. data/lib/ffi-glib/ptr_array.rb +2 -2
  8. data/lib/ffi-gobject.rb +3 -11
  9. data/lib/ffi-gobject/closure.rb +1 -0
  10. data/lib/ffi-gobject/object.rb +30 -16
  11. data/lib/ffi-gobject/object_class.rb +2 -2
  12. data/lib/ffi-gobject/ruby_closure.rb +2 -2
  13. data/lib/ffi-gobject/value.rb +2 -1
  14. data/lib/ffi-gobject_introspection/i_arg_info.rb +11 -11
  15. data/lib/ffi-gobject_introspection/i_base_info.rb +12 -10
  16. data/lib/ffi-gobject_introspection/i_callable_info.rb +8 -8
  17. data/lib/ffi-gobject_introspection/i_enum_info.rb +5 -5
  18. data/lib/ffi-gobject_introspection/i_field_info.rb +4 -4
  19. data/lib/ffi-gobject_introspection/i_function_info.rb +2 -2
  20. data/lib/ffi-gobject_introspection/i_interface_info.rb +15 -15
  21. data/lib/ffi-gobject_introspection/i_object_info.rb +22 -22
  22. data/lib/ffi-gobject_introspection/i_property_info.rb +2 -2
  23. data/lib/ffi-gobject_introspection/i_registered_type_info.rb +3 -3
  24. data/lib/ffi-gobject_introspection/i_repository.rb +16 -10
  25. data/lib/ffi-gobject_introspection/i_struct_info.rb +11 -7
  26. data/lib/ffi-gobject_introspection/i_type_info.rb +8 -8
  27. data/lib/ffi-gobject_introspection/i_union_info.rb +7 -7
  28. data/lib/ffi-gobject_introspection/i_value_info.rb +1 -1
  29. data/lib/ffi-gobject_introspection/strv.rb +1 -0
  30. data/lib/gir_ffi-base/gobject.rb +5 -0
  31. data/lib/gir_ffi-base/gobject/lib.rb +4 -0
  32. data/lib/gir_ffi/boolean.rb +2 -2
  33. data/lib/gir_ffi/builders/argument_builder.rb +41 -14
  34. data/lib/gir_ffi/builders/argument_builder_collection.rb +17 -4
  35. data/lib/gir_ffi/builders/base_argument_builder.rb +12 -16
  36. data/lib/gir_ffi/builders/callback_argument_builder.rb +1 -1
  37. data/lib/gir_ffi/builders/callback_builder.rb +1 -1
  38. data/lib/gir_ffi/builders/closure_to_pointer_convertor.rb +2 -9
  39. data/lib/gir_ffi/builders/field_builder.rb +11 -9
  40. data/lib/gir_ffi/builders/module_builder.rb +2 -1
  41. data/lib/gir_ffi/builders/object_builder.rb +21 -12
  42. data/lib/gir_ffi/builders/pointer_value_convertor.rb +8 -6
  43. data/lib/gir_ffi/builders/property_builder.rb +4 -2
  44. data/lib/gir_ffi/builders/registered_type_builder.rb +30 -19
  45. data/lib/gir_ffi/builders/return_value_builder.rb +2 -2
  46. data/lib/gir_ffi/builders/ruby_to_c_convertor.rb +2 -0
  47. data/lib/gir_ffi/builders/signal_closure_builder.rb +1 -1
  48. data/lib/gir_ffi/builders/struct_builder.rb +7 -8
  49. data/lib/gir_ffi/builders/unintrospectable_builder.rb +4 -1
  50. data/lib/gir_ffi/builders/user_defined_builder.rb +31 -95
  51. data/lib/gir_ffi/builders/vfunc_builder.rb +1 -1
  52. data/lib/gir_ffi/builders/with_layout.rb +3 -1
  53. data/lib/gir_ffi/callback_base.rb +3 -2
  54. data/lib/gir_ffi/class_base.rb +5 -0
  55. data/lib/gir_ffi/enum_like_base.rb +9 -5
  56. data/lib/gir_ffi/error_argument_info.rb +1 -1
  57. data/lib/gir_ffi/ffi_ext/pointer.rb +1 -4
  58. data/lib/gir_ffi/field_argument_info.rb +1 -1
  59. data/lib/gir_ffi/in_pointer.rb +36 -23
  60. data/lib/gir_ffi/info_ext/i_arg_info.rb +2 -0
  61. data/lib/gir_ffi/info_ext/i_callback_info.rb +4 -0
  62. data/lib/gir_ffi/info_ext/i_registered_type_info.rb +4 -0
  63. data/lib/gir_ffi/info_ext/i_type_info.rb +3 -27
  64. data/lib/gir_ffi/info_ext/safe_function_name.rb +1 -0
  65. data/lib/gir_ffi/interface_base.rb +5 -0
  66. data/lib/gir_ffi/module_base.rb +1 -0
  67. data/lib/gir_ffi/object_base.rb +10 -0
  68. data/lib/gir_ffi/object_store.rb +2 -0
  69. data/lib/gir_ffi/receiver_argument_info.rb +1 -1
  70. data/lib/gir_ffi/return_value_info.rb +1 -1
  71. data/lib/gir_ffi/sized_array.rb +7 -14
  72. data/lib/gir_ffi/struct_like_base.rb +3 -0
  73. data/lib/gir_ffi/type_map.rb +21 -0
  74. data/lib/gir_ffi/user_defined_object_info.rb +6 -2
  75. data/lib/gir_ffi/user_defined_property_info.rb +113 -71
  76. data/lib/gir_ffi/version.rb +1 -1
  77. data/lib/gir_ffi/zero_terminated.rb +26 -1
  78. data/tasks/test.rake +1 -0
  79. data/test/ffi-gobject_introspection/i_repository_test.rb +1 -2
  80. data/test/gir_ffi/builder_test.rb +13 -7
  81. data/test/gir_ffi/builders/argument_builder_test.rb +1 -5
  82. data/test/gir_ffi/builders/callback_return_value_builder_test.rb +1 -1
  83. data/test/gir_ffi/builders/field_builder_test.rb +20 -20
  84. data/test/gir_ffi/builders/return_value_builder_test.rb +1 -1
  85. data/test/gir_ffi/builders/signal_closure_builder_test.rb +1 -1
  86. data/test/gir_ffi/builders/unintrospectable_boxed_builder_test.rb +1 -1
  87. data/test/gir_ffi/builders/unintrospectable_builder_test.rb +2 -2
  88. data/test/gir_ffi/builders/vfunc_builder_test.rb +1 -1
  89. data/test/gir_ffi/enum_base_test.rb +43 -0
  90. data/test/gir_ffi/info_ext/i_type_info_test.rb +3 -9
  91. data/test/gir_ffi/object_base_test.rb +30 -0
  92. data/test/gir_ffi/sized_array_test.rb +0 -9
  93. data/test/gir_ffi/user_defined_object_info_test.rb +4 -6
  94. data/test/gir_ffi/user_defined_property_info_test.rb +6 -5
  95. data/test/gir_ffi/zero_terminated_test.rb +22 -0
  96. data/test/gir_ffi_test_helper.rb +2 -0
  97. data/test/integration/generated_gimarshallingtests_test.rb +1 -0
  98. data/test/integration/generated_gio_test.rb +5 -6
  99. data/test/integration/generated_gobject_test.rb +1 -1
  100. data/test/integration/generated_gtop_test.rb +3 -1
  101. data/test/integration/generated_regress_test.rb +3 -4
  102. metadata +3 -2
@@ -39,12 +39,14 @@ module GirFFI
39
39
  # Create an unowned copy of the struct represented by val
40
40
  def copy_from(val)
41
41
  return unless val
42
+
42
43
  disown copy from(val)
43
44
  end
44
45
 
45
46
  # Wrap an owned copy of the struct represented by val
46
47
  def wrap_copy(val)
47
48
  return unless val
49
+
48
50
  own copy(val)
49
51
  end
50
52
 
@@ -52,6 +54,7 @@ module GirFFI
52
54
  def wrap_own(val)
53
55
  return unless val
54
56
  return if val.null?
57
+
55
58
  own wrap(val)
56
59
  end
57
60
 
@@ -58,5 +58,26 @@ module GirFFI
58
58
  map_basic_type(type)
59
59
  end
60
60
  end
61
+
62
+ FLATTENED_TAG_TO_GTYPE_MAP = {
63
+ [:array, true] => GObject::TYPE_ARRAY,
64
+ [:c, true] => GObject::TYPE_POINTER,
65
+ [:gboolean, false] => GObject::TYPE_BOOLEAN,
66
+ [:ghash, true] => GObject::TYPE_HASH_TABLE,
67
+ [:glist, true] => GObject::TYPE_POINTER,
68
+ [:gint32, false] => GObject::TYPE_INT,
69
+ [:gint64, false] => GObject::TYPE_INT64,
70
+ [:guint64, false] => GObject::TYPE_UINT64,
71
+ [:strv, true] => GObject::TYPE_STRV,
72
+ [:utf8, true] => GObject::TYPE_STRING,
73
+ [:void, true] => GObject::TYPE_POINTER,
74
+ [:void, false] => GObject::TYPE_NONE
75
+ }.freeze
76
+
77
+ def self.type_info_to_gtype(type_info)
78
+ return type_info.interface.gtype if type_info.tag == :interface
79
+
80
+ FLATTENED_TAG_TO_GTYPE_MAP.fetch [type_info.flattened_tag, type_info.pointer?]
81
+ end
61
82
  end
62
83
  end
@@ -20,8 +20,8 @@ module GirFFI
20
20
  @klass
21
21
  end
22
22
 
23
- def install_property(property)
24
- @properties << UserDefinedPropertyInfo.new(property)
23
+ def install_property(param_spec)
24
+ @properties << param_spec
25
25
  end
26
26
 
27
27
  def install_vfunc_implementation(name, implementation = nil)
@@ -58,6 +58,10 @@ module GirFFI
58
58
  nil
59
59
  end
60
60
 
61
+ def abstract?
62
+ false
63
+ end
64
+
61
65
  attr_writer :g_name
62
66
 
63
67
  def g_name
@@ -1,95 +1,137 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GirFFI
4
- # Represents a property of a user defined type.
4
+ # Represents a property of a user defined type. Wraps a GParamSpec with
5
+ # useful helper methods for building property accessors etc.
5
6
  class UserDefinedPropertyInfo
6
- def initialize(param_spec)
7
- @param_spec = param_spec
8
- end
7
+ # Type info for user-defined property
8
+ class UserDefinedTypeInfo
9
+ include InfoExt::ITypeInfo
9
10
 
10
- attr_reader :param_spec
11
+ def initialize(param_spec)
12
+ @param_spec = param_spec
13
+ end
11
14
 
12
- def name
13
- @param_spec.get_name
14
- end
15
+ # TODO: Unify with InfoExt::ITypeInfo.flattened_tag_to_gtype_map
16
+ G_TYPE_TAG_MAP = {
17
+ GObject::TYPE_BOOLEAN => :gboolean,
18
+ GObject::TYPE_CHAR => :gint8,
19
+ GObject::TYPE_UCHAR => :guint8,
20
+ GObject::TYPE_FLOAT => :gfloat,
21
+ GObject::TYPE_DOUBLE => :gdouble,
22
+ GObject::TYPE_INT => :gint,
23
+ GObject::TYPE_UINT => :guint,
24
+ GObject::TYPE_LONG => :glong,
25
+ GObject::TYPE_ULONG => :gulong,
26
+ GObject::TYPE_INT64 => :gint64,
27
+ GObject::TYPE_UINT64 => :guint64,
28
+ GObject::TYPE_ENUM => :interface,
29
+ GObject::TYPE_FLAGS => :interface,
30
+ GObject::TYPE_STRING => :utf8,
31
+ GObject::TYPE_BOXED => :interface,
32
+ GObject::TYPE_OBJECT => :interface
33
+ }.freeze
15
34
 
16
- def accessor_name
17
- @param_spec.accessor_name
18
- end
35
+ def tag
36
+ @tag ||= G_TYPE_TAG_MAP.fetch(fundamental_value_type)
37
+ end
19
38
 
20
- def writable?
21
- @param_spec.flags[:writable]
22
- end
39
+ # TODO: Unify with InfoExt::ITypeInfo.flattened_tag_to_gtype_map
40
+ G_TYPE_POINTER_MAP = {
41
+ GObject::TYPE_BOOLEAN => false,
42
+ GObject::TYPE_CHAR => false,
43
+ GObject::TYPE_UCHAR => false,
44
+ GObject::TYPE_FLOAT => false,
45
+ GObject::TYPE_DOUBLE => false,
46
+ GObject::TYPE_INT => false,
47
+ GObject::TYPE_UINT => false,
48
+ GObject::TYPE_LONG => false,
49
+ GObject::TYPE_ULONG => false,
50
+ GObject::TYPE_INT64 => false,
51
+ GObject::TYPE_UINT64 => false,
52
+ GObject::TYPE_ENUM => false,
53
+ GObject::TYPE_FLAGS => false,
54
+ GObject::TYPE_STRING => true,
55
+ GObject::TYPE_BOXED => true,
56
+ GObject::TYPE_OBJECT => true
57
+ }.freeze
58
+
59
+ def pointer?
60
+ G_TYPE_POINTER_MAP.fetch(fundamental_value_type)
61
+ end
62
+
63
+ G_TYPE_INTERFACE_TAG_MAP = {
64
+ GObject::TYPE_ENUM => :enum,
65
+ GObject::TYPE_FLAGS => :flags,
66
+ GObject::TYPE_BOXED => :struct,
67
+ GObject::TYPE_OBJECT => :object
68
+ }.freeze
69
+
70
+ def interface_type
71
+ G_TYPE_INTERFACE_TAG_MAP.fetch(fundamental_value_type) if interface?
72
+ end
73
+
74
+ def hidden_struct_type?
75
+ false
76
+ end
77
+
78
+ def interface_class
79
+ @interface_class ||= Builder.build_by_gtype @param_spec.value_type if interface?
80
+ end
23
81
 
24
- def value_type
25
- @param_spec.value_type
82
+ def interface_class_name
83
+ interface_class.name if interface?
84
+ end
85
+
86
+ def ffi_type
87
+ GirFFI::TypeMap.map_basic_type(tag)
88
+ end
89
+
90
+ private
91
+
92
+ def value_type
93
+ @param_spec.value_type
94
+ end
95
+
96
+ def fundamental_value_type
97
+ @fundamental_value_type ||= GObject.type_fundamental value_type
98
+ end
99
+
100
+ def interface?
101
+ tag == :interface
102
+ end
26
103
  end
27
104
 
28
- # TODO: Unify with InfoExt::ITypeInfo.flattened_tag_to_gtype_map
29
- G_TYPE_POINTER_MAP = {
30
- GObject::TYPE_BOOLEAN => false,
31
- GObject::TYPE_CHAR => false,
32
- GObject::TYPE_UCHAR => false,
33
- GObject::TYPE_FLOAT => false,
34
- GObject::TYPE_DOUBLE => false,
35
- GObject::TYPE_INT => false,
36
- GObject::TYPE_UINT => false,
37
- GObject::TYPE_LONG => false,
38
- GObject::TYPE_ULONG => false,
39
- GObject::TYPE_INT64 => false,
40
- GObject::TYPE_UINT64 => false,
41
- GObject::TYPE_ENUM => false,
42
- GObject::TYPE_FLAGS => false,
43
- GObject::TYPE_STRING => true,
44
- GObject::TYPE_BOXED => true,
45
- GObject::TYPE_OBJECT => true
46
- }.freeze
47
-
48
- def pointer_type?
49
- G_TYPE_POINTER_MAP.fetch(fundamental_value_type)
105
+ def initialize(param_spec, container, offset)
106
+ @param_spec = param_spec
107
+ @container = container
108
+ @offset = offset
50
109
  end
51
110
 
52
- # TODO: Unify with InfoExt::ITypeInfo.flattened_tag_to_gtype_map
53
- G_TYPE_TAG_MAP = {
54
- GObject::TYPE_BOOLEAN => :gboolean,
55
- GObject::TYPE_CHAR => :gint8,
56
- GObject::TYPE_UCHAR => :guint8,
57
- GObject::TYPE_FLOAT => :gfloat,
58
- GObject::TYPE_DOUBLE => :gdouble,
59
- GObject::TYPE_INT => :gint,
60
- GObject::TYPE_UINT => :guint,
61
- GObject::TYPE_LONG => :glong,
62
- GObject::TYPE_ULONG => :gulong,
63
- GObject::TYPE_INT64 => :gint64,
64
- GObject::TYPE_UINT64 => :guint64,
65
- GObject::TYPE_ENUM => :interface,
66
- GObject::TYPE_FLAGS => :interface,
67
- GObject::TYPE_STRING => :utf8,
68
- GObject::TYPE_BOXED => :interface,
69
- GObject::TYPE_OBJECT => :interface
70
- }.freeze
71
-
72
- def type_tag
73
- G_TYPE_TAG_MAP.fetch(fundamental_value_type)
111
+ attr_reader :container, :offset, :param_spec
112
+
113
+ def name
114
+ @param_spec.accessor_name
74
115
  end
75
116
 
76
- G_TYPE_INTERFACE_TAG_MAP = {
77
- GObject::TYPE_ENUM => :enum,
78
- GObject::TYPE_FLAGS => :flags,
79
- GObject::TYPE_BOXED => :struct,
80
- GObject::TYPE_OBJECT => :object
81
- }.freeze
117
+ def field_type
118
+ @field_type ||= UserDefinedTypeInfo.new @param_spec
119
+ end
82
120
 
83
- def interface_type_tag
84
- G_TYPE_INTERFACE_TAG_MAP.fetch(fundamental_value_type)
121
+ def related_array_length_field
122
+ nil
85
123
  end
86
124
 
87
- def fundamental_value_type
88
- @fundamental_value_type ||= GObject.type_fundamental value_type
125
+ def writable?
126
+ param_spec.flags[:writable]
89
127
  end
90
128
 
91
129
  def ffi_type
92
- GirFFI::TypeMap.map_basic_type(type_tag)
130
+ field_type.ffi_type
131
+ end
132
+
133
+ def field_symbol
134
+ name.to_sym
93
135
  end
94
136
  end
95
137
  end
@@ -2,5 +2,5 @@
2
2
 
3
3
  # Current GirFFI version
4
4
  module GirFFI
5
- VERSION = '0.13.0'.freeze
5
+ VERSION = '0.13.1'.freeze
6
6
  end
@@ -26,6 +26,7 @@ module GirFFI
26
26
 
27
27
  def each
28
28
  return if @ptr.null?
29
+
29
30
  offset = 0
30
31
  while (val = read_value(offset))
31
32
  offset += ffi_type_size
@@ -41,7 +42,7 @@ module GirFFI
41
42
 
42
43
  def read_value(offset)
43
44
  val = fetch_value(offset)
44
- val unless val.zero?
45
+ val unless null_value? val
45
46
  end
46
47
 
47
48
  def getter_method
@@ -77,5 +78,29 @@ module GirFFI
77
78
  def ffi_type_size
78
79
  @ffi_type_size ||= FFI.type_size(ffi_type)
79
80
  end
81
+
82
+ def null_check_strategy
83
+ @null_check_strategy ||=
84
+ if ffi_type == :pointer
85
+ :pointer
86
+ elsif ffi_type.is_a? Symbol
87
+ :numeric
88
+ elsif ffi_type < GirFFI::ClassBase
89
+ :pointer
90
+ elsif ffi_type.singleton_class.include? GirFFI::EnumBase
91
+ :enum
92
+ end
93
+ end
94
+
95
+ def null_value?(val)
96
+ case null_check_strategy
97
+ when :pointer
98
+ val.null?
99
+ when :enum
100
+ ffi_type.to_native(val, nil) == 0
101
+ else
102
+ val == 0
103
+ end
104
+ end
80
105
  end
81
106
  end
data/tasks/test.rake CHANGED
@@ -110,6 +110,7 @@ class Listener
110
110
  return true if attrs['disguised'] == '1'
111
111
  return true if attrs['introspectable'] == '0'
112
112
  return true if attrs['glib:is-gtype-struct-for']
113
+
113
114
  false
114
115
  end
115
116
  end
@@ -69,14 +69,13 @@ describe GObjectIntrospection::IRepository do
69
69
 
70
70
  it 'passes its struct pointer to the c function just in case' do
71
71
  gir.require 'GObject', '2.0'
72
- ptr = gir.instance_variable_get(:@gobj)
73
72
  allow(GObjectIntrospection::Lib).to receive(:g_irepository_get_dependencies).
74
73
  and_call_original
75
74
 
76
75
  gir.dependencies('GObject')
77
76
 
78
77
  expect(GObjectIntrospection::Lib).to have_received(:g_irepository_get_dependencies).
79
- with(ptr, 'GObject')
78
+ with(gir, 'GObject')
80
79
  end
81
80
  end
82
81
  end
@@ -87,7 +87,7 @@ describe GirFFI::Builder do
87
87
 
88
88
  found_klass = GirFFI::Builder.build_by_gtype gtype
89
89
  found_klass.name.must_be_nil
90
- found_klass.ancestors.must_include GirFFI::BoxedBase
90
+ found_klass.superclass.must_equal GirFFI::BoxedBase
91
91
  end
92
92
  end
93
93
 
@@ -136,6 +136,14 @@ describe GirFFI::Builder do
136
136
  GirFFI::Builder.attach_ffi_function(lib, info)
137
137
  end
138
138
 
139
+ it 'calls attach_function with the correct types for Regress.test_enum_param' do
140
+ info = get_introspection_data 'Regress', 'test_enum_param'
141
+ expect(lib).to receive(:attach_function).
142
+ with('regress_test_enum_param', [Regress::TestEnum], :pointer).
143
+ and_return true
144
+ GirFFI::Builder.attach_ffi_function(lib, info)
145
+ end
146
+
139
147
  it 'does not attach the function if it is already defined' do
140
148
  info = get_introspection_data 'Regress', 'test_array_gint32_in'
141
149
  allow(lib).to receive(:method_defined?).and_return true
@@ -275,12 +283,10 @@ describe GirFFI::Builder do
275
283
  end
276
284
 
277
285
  it 'sets up the inheritance chain' do
278
- ancestors = Regress::TestSubObj.ancestors
279
- assert_equal [
280
- Regress::TestSubObj,
281
- Regress::TestObj,
282
- GObject::Object
283
- ], ancestors[0..2]
286
+ Regress::TestSubObj.registered_ancestors.
287
+ must_equal [Regress::TestSubObj,
288
+ Regress::TestObj,
289
+ GObject::Object]
284
290
  end
285
291
 
286
292
  it 'creates a Regress::TestSubObj#to_ptr method' do
@@ -57,10 +57,6 @@ describe GirFFI::Builders::ArgumentBuilder do
57
57
  let(:arg_info) { get_introspection_data('Regress', 'test_callback_user_data').args[1] }
58
58
 
59
59
  describe 'when it is a regular argument' do
60
- before do
61
- builder.closure = false
62
- end
63
-
64
60
  it 'has the correct value for method_argument_name' do
65
61
  builder.method_argument_name.must_equal arg_info.name
66
62
  end
@@ -78,7 +74,7 @@ describe GirFFI::Builders::ArgumentBuilder do
78
74
  before do
79
75
  callback = Object.new
80
76
  allow(callback).to receive(:call_argument_name).and_return 'foo'
81
- builder.closure = callback
77
+ builder.mark_as_user_data callback
82
78
  end
83
79
 
84
80
  it 'has the correct value for method_argument_name' do
@@ -55,7 +55,7 @@ describe GirFFI::Builders::CallbackReturnValueBuilder do
55
55
  it 'converts the result' do
56
56
  # Ensure variable names are generated in order
57
57
  builder.capture_variable_name.must_equal '_v1'
58
- builder.post_conversion.must_equal ['_v2 = GIMarshallingTests::Enum.from(_v1)']
58
+ builder.post_conversion.must_equal ['_v2 = GIMarshallingTests::Enum.to_int(_v1)']
59
59
  end
60
60
 
61
61
  it 'returns the result of the conversion' do
@@ -11,8 +11,8 @@ describe GirFFI::Builders::FieldBuilder do
11
11
  it 'creates the right getter method' do
12
12
  expected = <<-CODE.reset_indentation
13
13
  def some_int8
14
- _v1 = @struct.to_ptr + #{field_info.offset}
15
- _v2 = _v1.get_int8(0)
14
+ _v1 = @struct.to_ptr
15
+ _v2 = _v1.get_int8(#{field_info.offset})
16
16
  _v2
17
17
  end
18
18
  CODE
@@ -22,9 +22,9 @@ describe GirFFI::Builders::FieldBuilder do
22
22
  it 'creates the right setter method' do
23
23
  expected = <<-CODE.reset_indentation
24
24
  def some_int8= value
25
- _v1 = @struct.to_ptr + #{field_info.offset}
25
+ _v1 = @struct.to_ptr
26
26
  _v2 = value
27
- _v1.put_int8 0, _v2
27
+ _v1.put_int8 #{field_info.offset}, _v2
28
28
  end
29
29
  CODE
30
30
  instance.setter_def.must_equal expected
@@ -36,8 +36,8 @@ describe GirFFI::Builders::FieldBuilder do
36
36
  it 'creates the right getter method' do
37
37
  expected = <<-CODE.reset_indentation
38
38
  def nested_a
39
- _v1 = @struct.to_ptr + #{field_info.offset}
40
- _v2 = Regress::TestSimpleBoxedA.get_value_from_pointer(_v1, 0)
39
+ _v1 = @struct.to_ptr
40
+ _v2 = Regress::TestSimpleBoxedA.get_value_from_pointer(_v1, #{field_info.offset})
41
41
  _v3 = Regress::TestSimpleBoxedA.wrap(_v2)
42
42
  _v3
43
43
  end
@@ -48,9 +48,9 @@ describe GirFFI::Builders::FieldBuilder do
48
48
  it 'creates the right setter method' do
49
49
  expected = <<-CODE.reset_indentation
50
50
  def nested_a= value
51
- _v1 = @struct.to_ptr + #{field_info.offset}
51
+ _v1 = @struct.to_ptr
52
52
  _v2 = Regress::TestSimpleBoxedA.copy_from(value)
53
- Regress::TestSimpleBoxedA.copy_value_to_pointer(_v2, _v1)
53
+ Regress::TestSimpleBoxedA.copy_value_to_pointer(_v2, _v1, #{field_info.offset})
54
54
  end
55
55
  CODE
56
56
  instance.setter_def.must_equal expected
@@ -62,8 +62,8 @@ describe GirFFI::Builders::FieldBuilder do
62
62
  it 'creates the right getter method' do
63
63
  expected = <<-CODE.reset_indentation
64
64
  def some_enum
65
- _v1 = @struct.to_ptr + #{field_info.offset}
66
- _v2 = Regress::TestEnum.get_value_from_pointer(_v1, 0)
65
+ _v1 = @struct.to_ptr
66
+ _v2 = Regress::TestEnum.get_value_from_pointer(_v1, #{field_info.offset})
67
67
  _v2
68
68
  end
69
69
  CODE
@@ -76,8 +76,8 @@ describe GirFFI::Builders::FieldBuilder do
76
76
  it 'creates the right getter method' do
77
77
  expected = <<-CODE.reset_indentation
78
78
  def some_union
79
- _v1 = @struct.to_ptr + #{field_info.offset}
80
- _v2 = GirFFI::SizedArray.get_value_from_pointer(_v1, 0)
79
+ _v1 = @struct.to_ptr
80
+ _v2 = GirFFI::SizedArray.get_value_from_pointer(_v1, #{field_info.offset})
81
81
  _v3 = GirFFI::SizedArray.wrap(Regress::TestStructE__some_union__union, 2, _v2)
82
82
  _v3
83
83
  end
@@ -88,10 +88,10 @@ describe GirFFI::Builders::FieldBuilder do
88
88
  it 'creates the right setter method' do
89
89
  expected = <<-CODE.reset_indentation
90
90
  def some_union= value
91
- _v1 = @struct.to_ptr + #{field_info.offset}
91
+ _v1 = @struct.to_ptr
92
92
  GirFFI::ArgHelper.check_fixed_array_size 2, value, \"value\"
93
93
  _v2 = GirFFI::SizedArray.copy_from(Regress::TestStructE__some_union__union, 2, value)
94
- GirFFI::SizedArray.copy_value_to_pointer(_v2, _v1)
94
+ GirFFI::SizedArray.copy_value_to_pointer(_v2, _v1, #{field_info.offset})
95
95
  end
96
96
  CODE
97
97
  instance.setter_def.must_equal expected
@@ -103,9 +103,9 @@ describe GirFFI::Builders::FieldBuilder do
103
103
  it 'creates the right setter method' do
104
104
  expected = <<-CODE.reset_indentation
105
105
  def class_init= value
106
- _v1 = @struct.to_ptr + #{field_info.offset}
106
+ _v1 = @struct.to_ptr
107
107
  _v2 = GObject::ClassInitFunc.from(value)
108
- GObject::ClassInitFunc.copy_value_to_pointer(_v2, _v1)
108
+ GObject::ClassInitFunc.copy_value_to_pointer(_v2, _v1, #{field_info.offset})
109
109
  end
110
110
  CODE
111
111
  instance.setter_def.must_equal expected
@@ -120,10 +120,10 @@ describe GirFFI::Builders::FieldBuilder do
120
120
  skip if field_info.field_type.array_length < 0
121
121
  expected = <<-CODE.reset_indentation
122
122
  def param_types
123
- _v1 = @struct.to_ptr + #{n_params_field_info.offset}
124
- _v2 = _v1.get_uint32(0)
125
- _v3 = @struct.to_ptr + #{field_info.offset}
126
- _v4 = _v3.get_pointer(0)
123
+ _v1 = @struct.to_ptr
124
+ _v2 = _v1.get_uint32(#{n_params_field_info.offset})
125
+ _v3 = @struct.to_ptr
126
+ _v4 = _v3.get_pointer(#{field_info.offset})
127
127
  _v5 = GirFFI::SizedArray.wrap(:GType, _v2, _v4)
128
128
  _v5
129
129
  end