gir_ffi 0.15.3 → 0.15.4

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 (183) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +15 -0
  3. data/README.md +5 -6
  4. data/TODO.md +14 -35
  5. data/docs/Documentation.md +6 -0
  6. data/docs/Subclassing.md +38 -0
  7. data/lib/ffi-glib.rb +8 -3
  8. data/lib/ffi-glib/byte_array.rb +2 -1
  9. data/lib/ffi-glib/destroy_notify.rb +2 -2
  10. data/lib/ffi-glib/hash_table.rb +1 -2
  11. data/lib/ffi-glib/list.rb +11 -5
  12. data/lib/ffi-glib/list_methods.rb +12 -0
  13. data/lib/ffi-glib/s_list.rb +10 -4
  14. data/lib/ffi-gobject.rb +0 -3
  15. data/lib/ffi-gobject/object.rb +77 -73
  16. data/lib/ffi-gobject/object_class.rb +1 -1
  17. data/lib/ffi-gobject/value.rb +107 -108
  18. data/lib/ffi-gobject_introspection/i_base_info.rb +20 -19
  19. data/lib/gir_ffi-base/gobject/lib.rb +4 -0
  20. data/lib/gir_ffi/array_element_convertor.rb +1 -2
  21. data/lib/gir_ffi/boxed_base.rb +1 -5
  22. data/lib/gir_ffi/builder.rb +1 -1
  23. data/lib/gir_ffi/builder_helper.rb +7 -4
  24. data/lib/gir_ffi/builders/base_argument_builder.rb +2 -2
  25. data/lib/gir_ffi/builders/base_method_builder.rb +1 -1
  26. data/lib/gir_ffi/builders/base_type_builder.rb +1 -1
  27. data/lib/gir_ffi/builders/callback_argument_builder.rb +2 -0
  28. data/lib/gir_ffi/builders/callback_builder.rb +14 -12
  29. data/lib/gir_ffi/builders/callback_return_value_builder.rb +4 -6
  30. data/lib/gir_ffi/builders/class_struct_builder.rb +24 -0
  31. data/lib/gir_ffi/builders/enum_builder.rb +3 -3
  32. data/lib/gir_ffi/builders/interface_builder.rb +3 -1
  33. data/lib/gir_ffi/builders/mapping_method_builder.rb +1 -1
  34. data/lib/gir_ffi/builders/marshalling_method_builder.rb +5 -2
  35. data/lib/gir_ffi/builders/method_template.rb +4 -4
  36. data/lib/gir_ffi/builders/null_argument_builder.rb +0 -2
  37. data/lib/gir_ffi/builders/null_return_value_builder.rb +0 -2
  38. data/lib/gir_ffi/builders/object_builder.rb +16 -6
  39. data/lib/gir_ffi/builders/property_builder.rb +1 -2
  40. data/lib/gir_ffi/builders/signal_closure_builder.rb +3 -5
  41. data/lib/gir_ffi/builders/struct_builder.rb +5 -5
  42. data/lib/gir_ffi/builders/user_defined_builder.rb +8 -1
  43. data/lib/gir_ffi/builders/vfunc_argument_builder.rb +1 -1
  44. data/lib/gir_ffi/callback_base.rb +3 -3
  45. data/lib/gir_ffi/core.rb +17 -2
  46. data/lib/gir_ffi/glib_error.rb +1 -2
  47. data/lib/gir_ffi/in_pointer.rb +7 -0
  48. data/lib/gir_ffi/object_base.rb +27 -0
  49. data/lib/gir_ffi/return_value_info.rb +1 -2
  50. data/lib/gir_ffi/struct_base.rb +1 -9
  51. data/lib/gir_ffi/struct_like_base.rb +9 -5
  52. data/lib/gir_ffi/unintrospectable_type_info.rb +1 -1
  53. data/lib/gir_ffi/union_base.rb +1 -9
  54. data/lib/gir_ffi/user_defined_object_info.rb +3 -2
  55. data/lib/gir_ffi/version.rb +1 -1
  56. data/lib/gir_ffi/vfunc_implementation.rb +1 -0
  57. metadata +86 -136
  58. data/Gemfile +0 -14
  59. data/Rakefile +0 -9
  60. data/tasks/test.rake +0 -204
  61. data/test/base_test_helper.rb +0 -70
  62. data/test/ffi-glib/array_test.rb +0 -203
  63. data/test/ffi-glib/byte_array_test.rb +0 -28
  64. data/test/ffi-glib/bytes_test.rb +0 -61
  65. data/test/ffi-glib/closure_test.rb +0 -38
  66. data/test/ffi-glib/destroy_notify_test.rb +0 -18
  67. data/test/ffi-glib/hash_table_test.rb +0 -68
  68. data/test/ffi-glib/list_test.rb +0 -86
  69. data/test/ffi-glib/main_loop_test.rb +0 -53
  70. data/test/ffi-glib/ptr_array_test.rb +0 -112
  71. data/test/ffi-glib/ruby_closure_test.rb +0 -62
  72. data/test/ffi-glib/s_list_test.rb +0 -76
  73. data/test/ffi-glib/strv_test.rb +0 -60
  74. data/test/ffi-glib/variant_test.rb +0 -12
  75. data/test/ffi-gobject/gobject_test.rb +0 -76
  76. data/test/ffi-gobject/object_class_test.rb +0 -31
  77. data/test/ffi-gobject/object_test.rb +0 -123
  78. data/test/ffi-gobject/param_spec_test.rb +0 -32
  79. data/test/ffi-gobject/value_test.rb +0 -390
  80. data/test/ffi-gobject_introspection/gobject_type_init_test.rb +0 -26
  81. data/test/ffi-gobject_introspection/i_base_info_test.rb +0 -52
  82. data/test/ffi-gobject_introspection/i_constant_info_test.rb +0 -29
  83. data/test/ffi-gobject_introspection/i_enum_info_test.rb +0 -18
  84. data/test/ffi-gobject_introspection/i_function_info_test.rb +0 -6
  85. data/test/ffi-gobject_introspection/i_interface_info_test.rb +0 -23
  86. data/test/ffi-gobject_introspection/i_object_info_test.rb +0 -49
  87. data/test/ffi-gobject_introspection/i_property_info_test.rb +0 -47
  88. data/test/ffi-gobject_introspection/i_registered_type_info_test.rb +0 -27
  89. data/test/ffi-gobject_introspection/i_repository_test.rb +0 -81
  90. data/test/ffi-gobject_introspection/i_struct_info_test.rb +0 -23
  91. data/test/ffi-gobject_introspection/i_type_info_test.rb +0 -30
  92. data/test/ffi-gobject_introspection/i_union_info_test.rb +0 -17
  93. data/test/ffi-gobject_introspection/i_vfunc_info_test.rb +0 -41
  94. data/test/ffi-gobject_introspection/lib_test.rb +0 -13
  95. data/test/ffi-gobject_introspection/strv_test.rb +0 -46
  96. data/test/ffi-gobject_test.rb +0 -153
  97. data/test/gir_ffi/allocation_helper_test.rb +0 -36
  98. data/test/gir_ffi/arg_helper_test.rb +0 -146
  99. data/test/gir_ffi/boolean_test.rb +0 -43
  100. data/test/gir_ffi/boxed_base_test.rb +0 -65
  101. data/test/gir_ffi/builder_test.rb +0 -168
  102. data/test/gir_ffi/builders/argument_builder_test.rb +0 -691
  103. data/test/gir_ffi/builders/base_argument_builder_test.rb +0 -6
  104. data/test/gir_ffi/builders/callback_argument_builder_test.rb +0 -130
  105. data/test/gir_ffi/builders/callback_builder_test.rb +0 -117
  106. data/test/gir_ffi/builders/callback_return_value_builder_test.rb +0 -84
  107. data/test/gir_ffi/builders/constant_builder_test.rb +0 -6
  108. data/test/gir_ffi/builders/constructor_builder_test.rb +0 -39
  109. data/test/gir_ffi/builders/enum_builder_test.rb +0 -23
  110. data/test/gir_ffi/builders/field_builder_test.rb +0 -140
  111. data/test/gir_ffi/builders/function_builder_test.rb +0 -570
  112. data/test/gir_ffi/builders/initializer_builder_test.rb +0 -56
  113. data/test/gir_ffi/builders/interface_builder_test.rb +0 -32
  114. data/test/gir_ffi/builders/module_builder_test.rb +0 -43
  115. data/test/gir_ffi/builders/object_builder_test.rb +0 -98
  116. data/test/gir_ffi/builders/property_builder_test.rb +0 -161
  117. data/test/gir_ffi/builders/registered_type_builder_test.rb +0 -54
  118. data/test/gir_ffi/builders/return_value_builder_test.rb +0 -444
  119. data/test/gir_ffi/builders/signal_closure_builder_test.rb +0 -199
  120. data/test/gir_ffi/builders/struct_builder_test.rb +0 -96
  121. data/test/gir_ffi/builders/unintrospectable_boxed_builder_test.rb +0 -29
  122. data/test/gir_ffi/builders/unintrospectable_builder_test.rb +0 -84
  123. data/test/gir_ffi/builders/union_builder_test.rb +0 -28
  124. data/test/gir_ffi/builders/user_defined_builder_test.rb +0 -528
  125. data/test/gir_ffi/builders/vfunc_argument_builder_test.rb +0 -107
  126. data/test/gir_ffi/builders/vfunc_builder_test.rb +0 -245
  127. data/test/gir_ffi/callback_base_test.rb +0 -22
  128. data/test/gir_ffi/class_base_test.rb +0 -171
  129. data/test/gir_ffi/core_test.rb +0 -99
  130. data/test/gir_ffi/enum_base_test.rb +0 -43
  131. data/test/gir_ffi/error_type_info_test.rb +0 -50
  132. data/test/gir_ffi/ffi_ext/pointer_test.rb +0 -22
  133. data/test/gir_ffi/g_type_test.rb +0 -31
  134. data/test/gir_ffi/in_pointer_test.rb +0 -203
  135. data/test/gir_ffi/info_ext/i_callable_info_test.rb +0 -26
  136. data/test/gir_ffi/info_ext/i_callback_info_test.rb +0 -22
  137. data/test/gir_ffi/info_ext/i_field_info_test.rb +0 -37
  138. data/test/gir_ffi/info_ext/i_function_info_test.rb +0 -74
  139. data/test/gir_ffi/info_ext/i_signal_info_test.rb +0 -32
  140. data/test/gir_ffi/info_ext/i_type_info_test.rb +0 -712
  141. data/test/gir_ffi/info_ext/i_unresolved_info_test.rb +0 -19
  142. data/test/gir_ffi/info_ext/safe_constant_name_test.rb +0 -26
  143. data/test/gir_ffi/info_ext/safe_function_name_test.rb +0 -26
  144. data/test/gir_ffi/interface_base_test.rb +0 -20
  145. data/test/gir_ffi/method_stubber_test.rb +0 -67
  146. data/test/gir_ffi/object_base_test.rb +0 -64
  147. data/test/gir_ffi/object_store_test.rb +0 -41
  148. data/test/gir_ffi/receiver_argument_info_test.rb +0 -33
  149. data/test/gir_ffi/sized_array_test.rb +0 -206
  150. data/test/gir_ffi/struct_base_test.rb +0 -23
  151. data/test/gir_ffi/struct_like_base_test.rb +0 -167
  152. data/test/gir_ffi/type_map_test.rb +0 -17
  153. data/test/gir_ffi/unintrospectable_type_info_test.rb +0 -121
  154. data/test/gir_ffi/union_base_test.rb +0 -23
  155. data/test/gir_ffi/user_defined_object_info_test.rb +0 -119
  156. data/test/gir_ffi/user_defined_property_info_test.rb +0 -39
  157. data/test/gir_ffi/variable_name_generator_test.rb +0 -18
  158. data/test/gir_ffi/version_test.rb +0 -9
  159. data/test/gir_ffi/zero_terminated_test.rb +0 -108
  160. data/test/gir_ffi_test_helper.rb +0 -84
  161. data/test/integration/callback_exceptions_test.rb +0 -59
  162. data/test/integration/derived_classes_test.rb +0 -54
  163. data/test/integration/generated_everything_test.rb +0 -453
  164. data/test/integration/generated_gimarshallingtests_test.rb +0 -3109
  165. data/test/integration/generated_gio_test.rb +0 -116
  166. data/test/integration/generated_glib_test.rb +0 -10
  167. data/test/integration/generated_gobject_test.rb +0 -124
  168. data/test/integration/generated_gst_test.rb +0 -38
  169. data/test/integration/generated_gtk_source_test.rb +0 -21
  170. data/test/integration/generated_gtop_test.rb +0 -22
  171. data/test/integration/generated_pango_ft2_test.rb +0 -17
  172. data/test/integration/generated_pango_test.rb +0 -24
  173. data/test/integration/generated_regress_test.rb +0 -4076
  174. data/test/integration/generated_secret_test.rb +0 -14
  175. data/test/integration/generated_utility_test.rb +0 -174
  176. data/test/integration/generated_warnlib_test.rb +0 -45
  177. data/test/integration/method_lookup_test.rb +0 -34
  178. data/test/introspection_test_helper.rb +0 -94
  179. data/test/lib/Makefile.am +0 -110
  180. data/test/lib/autogen.sh +0 -4
  181. data/test/lib/configure.ac +0 -34
  182. data/test/lib/m4/jhflags.m4 +0 -21
  183. data/test/minitest/stats_plugin.rb +0 -30
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- GObject.load_class :ObjectClass
3
+ GObject::Object.object_class
4
4
 
5
5
  module GObject
6
6
  # Overrides for GObjectClass, a struct containing GObject's class data
@@ -5,18 +5,7 @@ GObject.load_class :Value
5
5
  module GObject
6
6
  # Overrides for GValue, GObject's generic value container structure.
7
7
  class Value
8
- remove_method :init
9
-
10
- def initialize
11
- super
12
- struct.owned = true
13
- to_ptr.autorelease = nil
14
- end
15
-
16
- def init(type)
17
- Lib.g_value_init self, type unless [TYPE_NONE, TYPE_INVALID].include? type
18
- self
19
- end
8
+ setup_instance_method! :init
20
9
 
21
10
  def self.make_finalizer(struct)
22
11
  proc do
@@ -54,37 +43,6 @@ module GObject
54
43
  TYPE_VARIANT => [:get_variant, :set_variant]
55
44
  }.freeze
56
45
 
57
- def set_value(val)
58
- send set_method, val
59
- end
60
-
61
- alias value= set_value
62
-
63
- def current_gtype
64
- struct[:g_type]
65
- end
66
-
67
- def current_fundamental_type
68
- GObject.type_fundamental current_gtype
69
- end
70
-
71
- def current_gtype_name
72
- GObject.type_name current_gtype
73
- end
74
-
75
- def get_value
76
- value = get_value_plain
77
- if current_fundamental_type == TYPE_BOXED
78
- wrap_boxed value
79
- else
80
- value
81
- end
82
- end
83
-
84
- def get_value_plain
85
- send get_method
86
- end
87
-
88
46
  # TODO: Give more generic name
89
47
  def self.wrap_ruby_value(val)
90
48
  new.tap { |gv| gv.__send__ :set_ruby_value, val }
@@ -119,17 +77,6 @@ module GObject
119
77
  Lib.g_value_copy value, target unless value.uninitialized?
120
78
  end
121
79
 
122
- def uninitialized?
123
- current_gtype == TYPE_INVALID
124
- end
125
-
126
- private
127
-
128
- def set_ruby_value(val)
129
- init_for_ruby_value val if uninitialized?
130
- set_value val
131
- end
132
-
133
80
  CLASS_TO_GTYPE_MAP = {
134
81
  NilClass => TYPE_INVALID,
135
82
  TrueClass => TYPE_BOOLEAN,
@@ -138,78 +85,130 @@ module GObject
138
85
  String => TYPE_STRING
139
86
  }.freeze
140
87
 
141
- def init_for_ruby_value(val)
142
- return init val.class.gtype if val.class.respond_to? :gtype
88
+ # Overrides for existing Value methods
89
+ module Overrides
90
+ def set_value(val)
91
+ send set_method, val
92
+ end
93
+
94
+ alias value= set_value
143
95
 
144
- CLASS_TO_GTYPE_MAP.each do |klass, type|
145
- return init type if val.is_a? klass
96
+ def current_gtype
97
+ struct[:g_type]
146
98
  end
147
- raise "Can't handle #{val.class}"
148
- end
149
99
 
150
- def set_none(_val); end
100
+ def current_fundamental_type
101
+ GObject.type_fundamental current_gtype
102
+ end
151
103
 
152
- def get_none; end
104
+ def current_gtype_name
105
+ GObject.type_name current_gtype
106
+ end
153
107
 
154
- def set_instance_enhanced(val)
155
- check_type_compatibility val if val
156
- set_instance val
157
- end
108
+ def get_value
109
+ value = get_value_plain
110
+ if current_fundamental_type == TYPE_BOXED
111
+ wrap_boxed value
112
+ else
113
+ value
114
+ end
115
+ end
158
116
 
159
- def set_enum_enhanced(val)
160
- val = current_gtype_class.to_native(val, nil)
161
- set_enum val
162
- end
117
+ def get_value_plain
118
+ send get_method
119
+ end
163
120
 
164
- def get_enum_enhanced
165
- current_gtype_class.wrap(get_enum)
166
- end
121
+ def uninitialized?
122
+ current_gtype == TYPE_INVALID
123
+ end
167
124
 
168
- def set_flags_enhanced(val)
169
- val = current_gtype_class.to_native(val, nil)
170
- set_flags val
171
- end
125
+ def init(type)
126
+ Lib.g_value_init self, type unless [TYPE_NONE, TYPE_INVALID].include? type
127
+ self
128
+ end
172
129
 
173
- def get_flags_enhanced
174
- current_gtype_class.wrap(get_flags)
175
- end
130
+ private
176
131
 
177
- def current_gtype_class
178
- GirFFI::Builder.build_by_gtype(current_gtype)
179
- end
132
+ def set_ruby_value(val)
133
+ init_for_ruby_value val if uninitialized?
134
+ set_value val
135
+ end
136
+
137
+ def init_for_ruby_value(val)
138
+ return init val.class.gtype if val.class.respond_to? :gtype
180
139
 
181
- def check_type_compatibility(val)
182
- if GObject::Value.type_compatible(GObject.type_from_instance(val), current_gtype)
183
- return
140
+ CLASS_TO_GTYPE_MAP.each do |klass, type|
141
+ return init type if val.is_a? klass
142
+ end
143
+ raise "Can't handle #{val.class}"
184
144
  end
185
145
 
186
- raise ArgumentError, "#{val.class} is incompatible with #{current_gtype_name}"
187
- end
146
+ def set_none(_val); end
188
147
 
189
- def wrap_boxed(boxed)
190
- case current_gtype
191
- when TYPE_STRV
192
- GLib::Strv.wrap boxed
193
- when TYPE_HASH_TABLE
194
- GLib::HashTable.wrap [:gpointer, :gpointer], boxed
195
- when TYPE_ARRAY
196
- GLib::Array.wrap nil, boxed
197
- else
198
- current_gtype_class.wrap(boxed) unless boxed.null?
148
+ def get_none; end
149
+
150
+ def set_instance_enhanced(val)
151
+ check_type_compatibility val if val
152
+ set_instance val
199
153
  end
200
- end
201
154
 
202
- def get_method
203
- method_map_entry.first
204
- end
155
+ def set_enum_enhanced(val)
156
+ val = current_gtype_class.to_native(val, nil)
157
+ set_enum val
158
+ end
205
159
 
206
- def set_method
207
- method_map_entry.last
208
- end
160
+ def get_enum_enhanced
161
+ current_gtype_class.wrap(get_enum)
162
+ end
163
+
164
+ def set_flags_enhanced(val)
165
+ val = current_gtype_class.to_native(val, nil)
166
+ set_flags val
167
+ end
209
168
 
210
- def method_map_entry
211
- METHOD_MAP[current_gtype] || METHOD_MAP[current_fundamental_type] ||
212
- raise("No method map entry for '#{current_gtype_name}'")
169
+ def get_flags_enhanced
170
+ current_gtype_class.wrap(get_flags)
171
+ end
172
+
173
+ def current_gtype_class
174
+ GirFFI::Builder.build_by_gtype(current_gtype)
175
+ end
176
+
177
+ def check_type_compatibility(val)
178
+ if GObject::Value.type_compatible(GObject.type_from_instance(val), current_gtype)
179
+ return
180
+ end
181
+
182
+ raise ArgumentError, "#{val.class} is incompatible with #{current_gtype_name}"
183
+ end
184
+
185
+ def wrap_boxed(boxed)
186
+ case current_gtype
187
+ when TYPE_STRV
188
+ GLib::Strv.wrap boxed
189
+ when TYPE_HASH_TABLE
190
+ GLib::HashTable.wrap [:gpointer, :gpointer], boxed
191
+ when TYPE_ARRAY
192
+ GLib::Array.wrap nil, boxed
193
+ else
194
+ current_gtype_class.wrap(boxed) unless boxed.null?
195
+ end
196
+ end
197
+
198
+ def get_method
199
+ method_map_entry.first
200
+ end
201
+
202
+ def set_method
203
+ method_map_entry.last
204
+ end
205
+
206
+ def method_map_entry
207
+ METHOD_MAP[current_gtype] || METHOD_MAP[current_fundamental_type] ||
208
+ raise("No method map entry for '#{current_gtype_name}'")
209
+ end
213
210
  end
211
+
212
+ prepend Overrides
214
213
  end
215
214
  end
@@ -35,7 +35,7 @@ module GObjectIntrospection
35
35
  # Examples:
36
36
  #
37
37
  # build_array_method :fields
38
- # build_array_mehtod :properties, :property
38
+ # build_array_method :properties, :property
39
39
  # build_array_method :get_methods
40
40
  #
41
41
  def self.build_array_method(method, single = nil)
@@ -44,12 +44,12 @@ module GObjectIntrospection
44
44
  single ||= method[0..-2]
45
45
  count = method.sub(/^(get_)?/, '\\1n_')
46
46
  class_eval <<-CODE, __FILE__, __LINE__ + 1
47
- def #{method}
48
- #{cache_ivar} ||=
49
- (0..(#{count} - 1)).map do |i|
50
- #{single} i
51
- end
52
- end
47
+ def #{method} # def fields
48
+ #{cache_ivar} ||= # @fields_cache ||=
49
+ (0..(#{count} - 1)).map do |i| # (0..(n_fields - 1)).map do |i|
50
+ #{single} i # field i
51
+ end # end
52
+ end # end
53
53
  CODE
54
54
  end
55
55
 
@@ -76,18 +76,18 @@ module GObjectIntrospection
76
76
  counter ||= "n_#{single}s"
77
77
  fetcher ||= single
78
78
  class_eval <<-CODE, __FILE__, __LINE__ + 1
79
- def #{method}(name)
80
- #{cache_ivar} ||= begin
81
- hash = {}
82
- #{counter}.times do |i|
83
- it = #{fetcher}(i)
84
- hash[it.name] = it
85
- end
86
- hash
87
- end
88
- name = name.to_s
89
- #{cache_ivar}[name]
90
- end
79
+ def #{method}(name) # def find_field(name)
80
+ #{cache_ivar} ||= begin # @find_field_cache ||= begin
81
+ hash = {} # hash = {}
82
+ #{counter}.times do |i| # n_fields.times do |i|
83
+ it = #{fetcher}(i) # it = field(i)
84
+ hash[it.name] = it # hash[it.name] = it
85
+ end # end
86
+ hash # hash
87
+ end # end
88
+ name = name.to_s # name = name.to_s
89
+ #{cache_ivar}[name] # @find_field_cache[name]
90
+ end # end
91
91
  CODE
92
92
  end
93
93
 
@@ -111,6 +111,7 @@ module GObjectIntrospection
111
111
  @container ||= begin
112
112
  ptr = Lib.g_base_info_get_container self
113
113
  return if ptr.null?
114
+
114
115
  Lib.g_base_info_ref ptr
115
116
  IRepository.wrap_ibaseinfo_pointer ptr
116
117
  end
@@ -7,9 +7,13 @@ module GObject
7
7
  module Lib
8
8
  extend FFI::Library
9
9
  extend FFI::BitMasks
10
+
10
11
  ffi_lib "gobject-2.0"
12
+
11
13
  attach_function :g_type_from_name, [:string], :size_t
12
14
  attach_function :g_type_fundamental, [:size_t], :size_t
15
+ attach_function :g_type_class_ref, [:size_t], :pointer
16
+
13
17
  attach_function :g_array_get_type, [], :size_t
14
18
  attach_function :g_byte_array_get_type, [], :size_t
15
19
  attach_function :g_error_get_type, [], :size_t
@@ -4,8 +4,7 @@ module GirFFI
4
4
  # The ArrayElementConvertor class handles conversion from C array elements to
5
5
  # ruby values
6
6
  class ArrayElementConvertor
7
- attr_reader :value_type
8
- attr_reader :pointer
7
+ attr_reader :value_type, :pointer
9
8
 
10
9
  def initialize(type, ptr)
11
10
  @value_type = type
@@ -4,11 +4,7 @@ require "gir_ffi/class_base"
4
4
 
5
5
  module GirFFI
6
6
  # Base class for generated classes representing boxed types.
7
- class BoxedBase < StructBase
8
- def initialize
9
- store_pointer(nil)
10
- end
11
-
7
+ class BoxedBase < StructLikeBase
12
8
  def self.make_finalizer(struct)
13
9
  proc do
14
10
  if struct.owned?
@@ -47,7 +47,7 @@ module GirFFI
47
47
  end
48
48
  Builders::ModuleBuilder.new(module_name,
49
49
  namespace: namespace,
50
- version: version).generate
50
+ version: version).generate
51
51
  end
52
52
 
53
53
  # TODO: Move elsewhere, perhaps to FunctionBuilder.
@@ -11,10 +11,13 @@ module GirFFI
11
11
  end
12
12
  end
13
13
 
14
- def get_or_define_class(namespace, name, parent)
15
- klass = optionally_define_constant(namespace, name) { Class.new parent }
16
- unless klass.superclass == parent
17
- raise "Expected superclass #{parent}, found #{klass.superclass}"
14
+ def get_or_define_class(namespace, name, parent = nil)
15
+ klass = optionally_define_constant(namespace, name) do
16
+ parent ||= yield
17
+ Class.new parent
18
+ end
19
+ if parent && klass.superclass != parent
20
+ raise "Expected #{klass} to have superclass #{parent}, found #{klass.superclass}"
18
21
  end
19
22
 
20
23
  klass
@@ -14,8 +14,8 @@ module GirFFI
14
14
  until when while yield
15
15
  ).freeze
16
16
 
17
- attr_reader :arginfo
18
- attr_reader :related_callback_builder
17
+ attr_reader :arginfo, :related_callback_builder
18
+
19
19
  attr_accessor :length_arg, :array_arg
20
20
 
21
21
  def initialize(var_gen, arginfo)
@@ -59,7 +59,7 @@ module GirFFI
59
59
  @argument_builder_collection ||=
60
60
  ArgumentBuilderCollection.new(return_value_builder, argument_builders,
61
61
  error_argument_builder: error_argument,
62
- receiver_builder: receiver_builder)
62
+ receiver_builder: receiver_builder)
63
63
  end
64
64
 
65
65
  def error_argument
@@ -35,7 +35,7 @@ module GirFFI
35
35
  end
36
36
 
37
37
  def setup_constants
38
- klass.const_set :GIR_INFO, info
38
+ optionally_define_constant(klass, :GIR_INFO) { info }
39
39
  klass.const_set :GIR_FFI_BUILDER, self
40
40
  end
41
41
 
@@ -19,6 +19,8 @@ module GirFFI
19
19
  false
20
20
  end
21
21
 
22
+ # All arguments to the argument mapper must always be provided. They may
23
+ # be nil, though.
22
24
  def allow_none?
23
25
  false
24
26
  end
@@ -16,6 +16,20 @@ module GirFFI
16
16
  klass.class_eval mapping_method_definition, __FILE__, __LINE__
17
17
  end
18
18
 
19
+ def mapping_method_definition
20
+ MappingMethodBuilder.for_callback(info).method_definition
21
+ end
22
+
23
+ def argument_ffi_types
24
+ @argument_ffi_types ||= @info.argument_ffi_types
25
+ end
26
+
27
+ def return_ffi_type
28
+ @return_ffi_type ||= @info.return_ffi_type
29
+ end
30
+
31
+ private
32
+
19
33
  def setup_callback
20
34
  optionally_define_constant klass, :Callback do
21
35
  lib.callback callback_sym, argument_ffi_types, return_ffi_type
@@ -38,21 +52,9 @@ module GirFFI
38
52
  end
39
53
  end
40
54
 
41
- def mapping_method_definition
42
- MappingMethodBuilder.for_callback(info).method_definition
43
- end
44
-
45
55
  def callback_sym
46
56
  @classname.to_sym
47
57
  end
48
-
49
- def argument_ffi_types
50
- @argument_ffi_types ||= @info.argument_ffi_types
51
- end
52
-
53
- def return_ffi_type
54
- @return_ffi_type ||= @info.return_ffi_type
55
- end
56
58
  end
57
59
  end
58
60
  end