gir_ffi 0.13.0 → 0.13.1

Sign up to get free protection for your applications and to get access to all the features.
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
@@ -5,11 +5,11 @@ module GObjectIntrospection
5
5
  # Represents a struct.
6
6
  class IStructInfo < IRegisteredTypeInfo
7
7
  def n_fields
8
- Lib.g_struct_info_get_n_fields @gobj
8
+ Lib.g_struct_info_get_n_fields self
9
9
  end
10
10
 
11
11
  def field(index)
12
- IFieldInfo.wrap Lib.g_struct_info_get_field(@gobj, index)
12
+ IFieldInfo.wrap Lib.g_struct_info_get_field(self, index)
13
13
  end
14
14
 
15
15
  ##
@@ -17,11 +17,11 @@ module GObjectIntrospection
17
17
  build_finder_method :find_field
18
18
 
19
19
  def get_n_methods
20
- Lib.g_struct_info_get_n_methods @gobj
20
+ Lib.g_struct_info_get_n_methods self
21
21
  end
22
22
 
23
23
  def get_method(index)
24
- IFunctionInfo.wrap Lib.g_struct_info_get_method(@gobj, index)
24
+ IFunctionInfo.wrap Lib.g_struct_info_get_method(self, index)
25
25
  end
26
26
 
27
27
  ##
@@ -30,15 +30,19 @@ module GObjectIntrospection
30
30
  build_finder_method :find_method, :get_n_methods, :get_method
31
31
 
32
32
  def size
33
- Lib.g_struct_info_get_size @gobj
33
+ Lib.g_struct_info_get_size self
34
+ end
35
+
36
+ def empty?
37
+ size == 0
34
38
  end
35
39
 
36
40
  def alignment
37
- Lib.g_struct_info_get_alignment @gobj
41
+ Lib.g_struct_info_get_alignment self
38
42
  end
39
43
 
40
44
  def gtype_struct?
41
- Lib.g_struct_info_is_gtype_struct @gobj
45
+ Lib.g_struct_info_is_gtype_struct self
42
46
  end
43
47
  end
44
48
  end
@@ -5,36 +5,36 @@ module GObjectIntrospection
5
5
  # Represents type information, direction, transfer etc.
6
6
  class ITypeInfo < IBaseInfo
7
7
  def pointer?
8
- Lib.g_type_info_is_pointer @gobj
8
+ Lib.g_type_info_is_pointer self
9
9
  end
10
10
 
11
11
  def tag
12
- Lib.g_type_info_get_tag @gobj
12
+ Lib.g_type_info_get_tag self
13
13
  end
14
14
 
15
15
  def param_type(index)
16
- ITypeInfo.wrap Lib.g_type_info_get_param_type(@gobj, index)
16
+ ITypeInfo.wrap Lib.g_type_info_get_param_type(self, index)
17
17
  end
18
18
 
19
19
  def interface
20
- ptr = Lib.g_type_info_get_interface @gobj
20
+ ptr = Lib.g_type_info_get_interface self
21
21
  IRepository.wrap_ibaseinfo_pointer ptr
22
22
  end
23
23
 
24
24
  def array_length
25
- Lib.g_type_info_get_array_length @gobj
25
+ Lib.g_type_info_get_array_length self
26
26
  end
27
27
 
28
28
  def array_fixed_size
29
- Lib.g_type_info_get_array_fixed_size @gobj
29
+ Lib.g_type_info_get_array_fixed_size self
30
30
  end
31
31
 
32
32
  def array_type
33
- Lib.g_type_info_get_array_type @gobj
33
+ Lib.g_type_info_get_array_type self
34
34
  end
35
35
 
36
36
  def zero_terminated?
37
- Lib.g_type_info_is_zero_terminated @gobj
37
+ Lib.g_type_info_is_zero_terminated self
38
38
  end
39
39
 
40
40
  def name
@@ -5,37 +5,37 @@ module GObjectIntrospection
5
5
  # Represents a union.
6
6
  class IUnionInfo < IRegisteredTypeInfo
7
7
  def n_fields
8
- Lib.g_union_info_get_n_fields @gobj
8
+ Lib.g_union_info_get_n_fields self
9
9
  end
10
10
 
11
11
  def field(index)
12
- IFieldInfo.wrap Lib.g_union_info_get_field(@gobj, index)
12
+ IFieldInfo.wrap Lib.g_union_info_get_field(self, index)
13
13
  end
14
14
 
15
15
  ##
16
16
  build_array_method :fields
17
17
 
18
18
  def get_n_methods
19
- Lib.g_union_info_get_n_methods @gobj
19
+ Lib.g_union_info_get_n_methods self
20
20
  end
21
21
 
22
22
  def get_method(index)
23
- IFunctionInfo.wrap Lib.g_union_info_get_method(@gobj, index)
23
+ IFunctionInfo.wrap Lib.g_union_info_get_method(self, index)
24
24
  end
25
25
 
26
26
  ##
27
27
  build_array_method :get_methods
28
28
 
29
29
  def find_method(name)
30
- IFunctionInfo.wrap Lib.g_union_info_find_method(@gobj, name.to_s)
30
+ IFunctionInfo.wrap Lib.g_union_info_find_method(self, name.to_s)
31
31
  end
32
32
 
33
33
  def size
34
- Lib.g_union_info_get_size @gobj
34
+ Lib.g_union_info_get_size self
35
35
  end
36
36
 
37
37
  def alignment
38
- Lib.g_union_info_get_alignment @gobj
38
+ Lib.g_union_info_get_alignment self
39
39
  end
40
40
  end
41
41
  end
@@ -5,7 +5,7 @@ module GObjectIntrospection
5
5
  # Represents one of the enum values of an IEnumInfo.
6
6
  class IValueInfo < IBaseInfo
7
7
  def value
8
- Lib.g_value_info_get_value @gobj
8
+ Lib.g_value_info_get_value self
9
9
  end
10
10
  end
11
11
  end
@@ -35,6 +35,7 @@ module GObjectIntrospection
35
35
 
36
36
  def fetch_ptr(offset)
37
37
  return if @ptr.null?
38
+
38
39
  ptr = @ptr.get_pointer offset
39
40
  ptr unless ptr.null?
40
41
  end
@@ -40,4 +40,9 @@ module GObject
40
40
  TYPE_OBJECT = type_from_name('GObject')
41
41
  TYPE_GTYPE = type_from_name('GType')
42
42
  TYPE_VARIANT = type_from_name('GVariant')
43
+
44
+ TYPE_ARRAY = Lib.g_array_get_type
45
+ TYPE_BYTE_ARRAY = Lib.g_byte_array_get_type
46
+ TYPE_HASH_TABLE = Lib.g_hash_table_get_type
47
+ TYPE_STRV = Lib.g_strv_get_type
43
48
  end
@@ -10,5 +10,9 @@ module GObject
10
10
  ffi_lib 'gobject-2.0'
11
11
  attach_function :g_type_from_name, [:string], :size_t
12
12
  attach_function :g_type_fundamental, [:size_t], :size_t
13
+ attach_function :g_array_get_type, [], :size_t
14
+ attach_function :g_byte_array_get_type, [], :size_t
15
+ attach_function :g_hash_table_get_type, [], :size_t
16
+ attach_function :g_strv_get_type, [], :size_t
13
17
  end
14
18
  end
@@ -23,8 +23,8 @@ module GirFFI
23
23
  FFI.type_size FFI::Type::INT
24
24
  end
25
25
 
26
- def self.copy_value_to_pointer(value, pointer)
27
- pointer.put_int 0, to_native(value, nil)
26
+ def self.copy_value_to_pointer(value, pointer, offset = 0)
27
+ pointer.put_int offset, to_native(value, nil)
28
28
  end
29
29
 
30
30
  def self.get_value_from_pointer(pointer, offset)
@@ -40,23 +40,16 @@ module GirFFI
40
40
  end
41
41
 
42
42
  def pre_conversion
43
- pr = []
44
- if has_ingoing_component?
45
- pr << fixed_array_size_check if needs_size_check?
46
- pr << array_length_assignment if array_length_parameter?
47
- end
48
43
  case direction
49
44
  when :in
50
- pr << "#{call_argument_name} = #{ingoing_convertor.conversion}"
45
+ pre_conversion_in
51
46
  when :inout
52
- pr << out_parameter_preparation
53
- pr << ingoing_value_storage
47
+ pre_conversion_inout
54
48
  when :out
55
- pr << out_parameter_preparation
49
+ pre_conversion_out
56
50
  when :error
57
- pr << "#{call_argument_name} = FFI::MemoryPointer.new(:pointer).write_pointer nil"
51
+ pre_conversion_error
58
52
  end
59
- pr
60
53
  end
61
54
 
62
55
  def post_conversion
@@ -72,6 +65,31 @@ module GirFFI
72
65
 
73
66
  private
74
67
 
68
+ def pre_conversion_in
69
+ pr = []
70
+ pr << fixed_array_size_check if needs_size_check?
71
+ pr << array_length_assignment if array_length_parameter?
72
+ pr << "#{call_argument_name} = #{ingoing_convertor.conversion}"
73
+ pr
74
+ end
75
+
76
+ def pre_conversion_inout
77
+ pr = []
78
+ pr << fixed_array_size_check if needs_size_check?
79
+ pr << array_length_assignment if array_length_parameter?
80
+ pr << out_parameter_preparation
81
+ pr << ingoing_value_storage
82
+ pr
83
+ end
84
+
85
+ def pre_conversion_out
86
+ [out_parameter_preparation]
87
+ end
88
+
89
+ def pre_conversion_error
90
+ ["#{call_argument_name} = FFI::MemoryPointer.new(:pointer).write_pointer nil"]
91
+ end
92
+
75
93
  def ingoing_value_storage
76
94
  PointerValueConvertor.new(type_spec).
77
95
  value_to_pointer(call_argument_name, ingoing_convertor.conversion)
@@ -83,6 +101,7 @@ module GirFFI
83
101
 
84
102
  def output_value
85
103
  return "#{call_argument_name}.get_value" if caller_allocated_object? && gvalue?
104
+
86
105
  base = pointer_to_value_method_call call_argument_name, type_spec
87
106
  if needs_out_conversion?
88
107
  outgoing_convertor(base).conversion
@@ -191,9 +210,9 @@ module GirFFI
191
210
  NullConvertor.new('0')
192
211
  elsif destroy_notifier?
193
212
  NullConvertor.new(DESTROY_NOTIFIER)
194
- elsif closure?
195
- ClosureToPointerConvertor.new(pre_convertor_argument, @is_closure)
196
- elsif type_info.needs_ruby_to_c_conversion_for_functions?
213
+ elsif user_data?
214
+ ClosureToPointerConvertor.new(callback_argument_name)
215
+ elsif needs_ruby_to_c_conversion?
197
216
  RubyToCConvertor.new(type_info, pre_convertor_argument,
198
217
  ownership_transfer: ownership_transfer)
199
218
  else
@@ -208,6 +227,14 @@ module GirFFI
208
227
  name
209
228
  end
210
229
  end
230
+
231
+ def needs_ruby_to_c_conversion?
232
+ type_info.needs_ruby_to_c_conversion_for_functions?
233
+ end
234
+
235
+ def callback_argument_name
236
+ @related_callback_builder.call_argument_name
237
+ end
211
238
  end
212
239
  end
213
240
  end
@@ -67,20 +67,33 @@ module GirFFI
67
67
  end
68
68
 
69
69
  def set_up_argument_relations
70
+ set_up_user_data_relations
71
+ set_up_destroy_notifier_relations
72
+ set_up_length_argument_relations
73
+ end
74
+
75
+ def set_up_user_data_relations
70
76
  @base_argument_builders.each do |bldr|
71
77
  if (idx = bldr.closure_idx) >= 0
72
- @base_argument_builders[idx].closure = bldr
78
+ @base_argument_builders[idx].mark_as_user_data bldr
73
79
  end
80
+ end
81
+ end
82
+
83
+ def set_up_destroy_notifier_relations
84
+ @base_argument_builders.each do |bldr|
74
85
  if (idx = bldr.destroy_idx) >= 0
75
86
  @base_argument_builders[idx].mark_as_destroy_notifier bldr
76
87
  end
77
88
  end
89
+ end
90
+
91
+ def set_up_length_argument_relations
78
92
  all_builders.each do |bldr|
79
93
  idx = bldr.array_length_idx
80
- next unless idx >= 0
81
- other = @base_argument_builders[idx]
82
- next unless other
94
+ next if idx < 0
83
95
 
96
+ other = @base_argument_builders[idx]
84
97
  bldr.length_arg = other
85
98
  other.array_arg = bldr
86
99
  end
@@ -22,8 +22,8 @@ module GirFFI
22
22
  @arginfo = arginfo
23
23
  @length_arg = nil
24
24
  @array_arg = nil
25
- @is_closure = false
26
- @destroy_notifier = false
25
+ @is_user_data = false
26
+ @is_destroy_notifier = false
27
27
  end
28
28
 
29
29
  def name
@@ -59,34 +59,30 @@ module GirFFI
59
59
  arginfo.destroy
60
60
  end
61
61
 
62
- # TODO: closure unfortunately means two things in GLib: a closure
63
- # argument (user_data), and the Closure class (a callable object). Make
64
- # the distinction more explicit in GirFFI.
65
- def closure=(arg)
66
- @is_closure = arg
62
+ def mark_as_user_data(callback_builder)
63
+ @is_user_data = true
64
+ @related_callback_builder = callback_builder
67
65
  end
68
66
 
69
- # TODO: Unify relationship set-up methods and improve naming. We
70
- # currently have length_arg=, array_arg=, closure= and
71
- # mark_as_destroy_notifier.
72
- def mark_as_destroy_notifier(callback)
73
- @destroy_notifier = callback
67
+ def mark_as_destroy_notifier(callback_builder)
68
+ @is_destroy_notifier = true
69
+ @related_callback_builder = callback_builder
74
70
  end
75
71
 
76
72
  def array_length_parameter?
77
73
  @array_arg
78
74
  end
79
75
 
80
- def closure?
81
- @is_closure
76
+ def user_data?
77
+ @is_user_data
82
78
  end
83
79
 
84
80
  def destroy_notifier?
85
- @destroy_notifier
81
+ @is_destroy_notifier
86
82
  end
87
83
 
88
84
  def helper_argument?
89
- array_length_parameter? || closure? || destroy_notifier?
85
+ array_length_parameter? || user_data? || destroy_notifier?
90
86
  end
91
87
 
92
88
  def ownership_transfer
@@ -104,7 +104,7 @@ module GirFFI
104
104
  end
105
105
 
106
106
  def pre_convertor
107
- @pre_convertor ||= if closure?
107
+ @pre_convertor ||= if user_data?
108
108
  ClosureConvertor.new(pre_convertor_argument)
109
109
  elsif needs_c_to_ruby_conversion?
110
110
  CToRubyConvertor.new(type_info,
@@ -13,7 +13,7 @@ module GirFFI
13
13
  def setup_class
14
14
  setup_callback
15
15
  setup_constants
16
- klass.class_eval mapping_method_definition
16
+ klass.class_eval mapping_method_definition, __FILE__, __LINE__
17
17
  end
18
18
 
19
19
  def setup_callback
@@ -5,19 +5,12 @@ module GirFFI
5
5
  # Builder that generates code to convert closure arguments ('user data')
6
6
  # from Ruby to C. Used by argument builders.
7
7
  class ClosureToPointerConvertor
8
- def initialize(argument_name, callback_argument)
8
+ def initialize(argument_name)
9
9
  @argument_name = argument_name
10
- @callback_argument = callback_argument
11
10
  end
12
11
 
13
12
  def conversion
14
- "GirFFI::ArgHelper.store(#{callback_argument_name})"
15
- end
16
-
17
- private
18
-
19
- def callback_argument_name
20
- @callback_argument.call_argument_name
13
+ "GirFFI::ArgHelper.store(#{@argument_name})"
21
14
  end
22
15
  end
23
16
  end
@@ -26,7 +26,7 @@ module GirFFI
26
26
 
27
27
  def pre_conversion
28
28
  [
29
- "#{field_ptr} = @struct.to_ptr + #{field_offset}",
29
+ "#{field_ptr} = @struct.to_ptr",
30
30
  "#{bare_value} = #{pointer_to_value_conversion}"
31
31
  ]
32
32
  end
@@ -58,7 +58,7 @@ module GirFFI
58
58
  private
59
59
 
60
60
  def pointer_to_value_conversion
61
- PointerValueConvertor.new(field_type_tag).pointer_to_value(field_ptr)
61
+ PointerValueConvertor.new(field_type_tag).pointer_to_value(field_ptr, field_offset)
62
62
  end
63
63
 
64
64
  def field_offset
@@ -78,7 +78,7 @@ module GirFFI
78
78
  end
79
79
 
80
80
  def field_type_tag
81
- @field_type_tag ||= @field_info.field_type.tag_or_class
81
+ @field_type_tag ||= field_type.tag_or_class
82
82
  end
83
83
 
84
84
  def field_type
@@ -97,7 +97,7 @@ module GirFFI
97
97
  end
98
98
 
99
99
  # Class to represent argument info for the argument of a getter method.
100
- # Implements the necessary parts of IArgumentInfo's interface.
100
+ # Implements the necessary parts of IArgInfo's interface.
101
101
  class GetterArgumentInfo
102
102
  attr_reader :name, :argument_type
103
103
 
@@ -216,7 +216,7 @@ module GirFFI
216
216
  end
217
217
 
218
218
  def field_type_tag
219
- @field_type_tag ||= @info.field_type.tag_or_class.inspect
219
+ @field_type_tag ||= field_type.tag_or_class.inspect
220
220
  end
221
221
 
222
222
  def field_type
@@ -243,7 +243,8 @@ module GirFFI
243
243
  def setup_getter
244
244
  return if container_defines_getter_method?
245
245
  return if hidden_struct_type?
246
- container_class.class_eval getter_def
246
+
247
+ container_class.class_eval getter_def, __FILE__, __LINE__
247
248
  end
248
249
 
249
250
  def container_defines_getter_method?
@@ -253,7 +254,8 @@ module GirFFI
253
254
  def setup_setter
254
255
  return unless info.writable?
255
256
  return if hidden_struct_type?
256
- container_class.class_eval setter_def
257
+
258
+ container_class.class_eval setter_def, __FILE__, __LINE__
257
259
  end
258
260
 
259
261
  def getter_def
@@ -269,7 +271,7 @@ module GirFFI
269
271
 
270
272
  <<-CODE.reset_indentation
271
273
  def #{info.name}= #{builder.method_argument_name}
272
- #{field_ptr} = @struct.to_ptr + #{info.offset}
274
+ #{field_ptr} = @struct.to_ptr
273
275
  #{builder.pre_conversion.join("\n ")}
274
276
  #{value_storage(field_ptr, builder)}
275
277
  end
@@ -280,7 +282,7 @@ module GirFFI
280
282
 
281
283
  def value_storage(typed_ptr, builder)
282
284
  PointerValueConvertor.new(field_type_tag).
283
- value_to_pointer(typed_ptr, builder.call_argument_name)
285
+ value_to_pointer(typed_ptr, builder.call_argument_name, info.offset)
284
286
  end
285
287
 
286
288
  def field_type_tag