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