gir_ffi 0.15.2 → 0.15.7

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 (190) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +41 -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/container_class_methods.rb +1 -3
  10. data/lib/ffi-glib/destroy_notify.rb +2 -2
  11. data/lib/ffi-glib/hash_table.rb +1 -2
  12. data/lib/ffi-glib/list.rb +11 -5
  13. data/lib/ffi-glib/list_methods.rb +12 -0
  14. data/lib/ffi-glib/s_list.rb +10 -4
  15. data/lib/ffi-gobject.rb +2 -5
  16. data/lib/ffi-gobject/object.rb +102 -92
  17. data/lib/ffi-gobject/object_class.rb +1 -1
  18. data/lib/ffi-gobject/ruby_closure.rb +1 -1
  19. data/lib/ffi-gobject/value.rb +108 -117
  20. data/lib/ffi-gobject_introspection/i_base_info.rb +35 -27
  21. data/lib/gir_ffi-base/gobject/lib.rb +4 -0
  22. data/lib/gir_ffi/array_element_convertor.rb +3 -4
  23. data/lib/gir_ffi/boxed_base.rb +13 -11
  24. data/lib/gir_ffi/builder.rb +3 -4
  25. data/lib/gir_ffi/builder_helper.rb +10 -2
  26. data/lib/gir_ffi/builders/base_argument_builder.rb +2 -2
  27. data/lib/gir_ffi/builders/base_method_builder.rb +1 -1
  28. data/lib/gir_ffi/builders/base_type_builder.rb +1 -1
  29. data/lib/gir_ffi/builders/callback_argument_builder.rb +2 -0
  30. data/lib/gir_ffi/builders/callback_builder.rb +25 -11
  31. data/lib/gir_ffi/builders/callback_return_value_builder.rb +4 -6
  32. data/lib/gir_ffi/builders/enum_builder.rb +9 -5
  33. data/lib/gir_ffi/builders/field_builder.rb +2 -1
  34. data/lib/gir_ffi/builders/function_builder.rb +1 -1
  35. data/lib/gir_ffi/builders/interface_builder.rb +3 -1
  36. data/lib/gir_ffi/builders/mapping_method_builder.rb +1 -1
  37. data/lib/gir_ffi/builders/marshalling_method_builder.rb +5 -2
  38. data/lib/gir_ffi/builders/method_template.rb +4 -4
  39. data/lib/gir_ffi/builders/module_builder.rb +4 -2
  40. data/lib/gir_ffi/builders/null_argument_builder.rb +0 -2
  41. data/lib/gir_ffi/builders/null_return_value_builder.rb +0 -2
  42. data/lib/gir_ffi/builders/object_builder.rb +18 -6
  43. data/lib/gir_ffi/builders/property_builder.rb +1 -2
  44. data/lib/gir_ffi/builders/signal_closure_builder.rb +3 -5
  45. data/lib/gir_ffi/builders/struct_builder.rb +34 -7
  46. data/lib/gir_ffi/builders/user_defined_builder.rb +8 -1
  47. data/lib/gir_ffi/builders/vfunc_argument_builder.rb +1 -1
  48. data/lib/gir_ffi/callback_base.rb +7 -8
  49. data/lib/gir_ffi/class_base.rb +1 -0
  50. data/lib/gir_ffi/core.rb +17 -2
  51. data/lib/gir_ffi/glib_error.rb +1 -2
  52. data/lib/gir_ffi/in_pointer.rb +10 -2
  53. data/lib/gir_ffi/interface_base.rb +5 -0
  54. data/lib/gir_ffi/object_base.rb +27 -0
  55. data/lib/gir_ffi/return_value_info.rb +1 -2
  56. data/lib/gir_ffi/struct_base.rb +1 -9
  57. data/lib/gir_ffi/struct_like_base.rb +9 -5
  58. data/lib/gir_ffi/type_map.rb +1 -0
  59. data/lib/gir_ffi/unintrospectable_type_info.rb +1 -1
  60. data/lib/gir_ffi/union_base.rb +1 -9
  61. data/lib/gir_ffi/user_defined_object_info.rb +3 -2
  62. data/lib/gir_ffi/version.rb +1 -1
  63. data/lib/gir_ffi/vfunc_implementation.rb +1 -0
  64. metadata +106 -143
  65. data/Gemfile +0 -14
  66. data/Rakefile +0 -9
  67. data/tasks/test.rake +0 -204
  68. data/test/base_test_helper.rb +0 -70
  69. data/test/ffi-glib/array_test.rb +0 -203
  70. data/test/ffi-glib/byte_array_test.rb +0 -28
  71. data/test/ffi-glib/bytes_test.rb +0 -61
  72. data/test/ffi-glib/closure_test.rb +0 -38
  73. data/test/ffi-glib/destroy_notify_test.rb +0 -18
  74. data/test/ffi-glib/hash_table_test.rb +0 -68
  75. data/test/ffi-glib/list_test.rb +0 -86
  76. data/test/ffi-glib/main_loop_test.rb +0 -53
  77. data/test/ffi-glib/ptr_array_test.rb +0 -112
  78. data/test/ffi-glib/ruby_closure_test.rb +0 -62
  79. data/test/ffi-glib/s_list_test.rb +0 -76
  80. data/test/ffi-glib/strv_test.rb +0 -60
  81. data/test/ffi-glib/variant_test.rb +0 -12
  82. data/test/ffi-gobject/gobject_test.rb +0 -76
  83. data/test/ffi-gobject/object_class_test.rb +0 -31
  84. data/test/ffi-gobject/object_test.rb +0 -122
  85. data/test/ffi-gobject/param_spec_test.rb +0 -32
  86. data/test/ffi-gobject/value_test.rb +0 -390
  87. data/test/ffi-gobject_introspection/gobject_type_init_test.rb +0 -26
  88. data/test/ffi-gobject_introspection/i_base_info_test.rb +0 -52
  89. data/test/ffi-gobject_introspection/i_constant_info_test.rb +0 -29
  90. data/test/ffi-gobject_introspection/i_enum_info_test.rb +0 -18
  91. data/test/ffi-gobject_introspection/i_function_info_test.rb +0 -6
  92. data/test/ffi-gobject_introspection/i_interface_info_test.rb +0 -23
  93. data/test/ffi-gobject_introspection/i_object_info_test.rb +0 -49
  94. data/test/ffi-gobject_introspection/i_property_info_test.rb +0 -47
  95. data/test/ffi-gobject_introspection/i_registered_type_info_test.rb +0 -27
  96. data/test/ffi-gobject_introspection/i_repository_test.rb +0 -81
  97. data/test/ffi-gobject_introspection/i_struct_info_test.rb +0 -23
  98. data/test/ffi-gobject_introspection/i_type_info_test.rb +0 -30
  99. data/test/ffi-gobject_introspection/i_union_info_test.rb +0 -17
  100. data/test/ffi-gobject_introspection/i_vfunc_info_test.rb +0 -41
  101. data/test/ffi-gobject_introspection/lib_test.rb +0 -13
  102. data/test/ffi-gobject_introspection/strv_test.rb +0 -46
  103. data/test/ffi-gobject_test.rb +0 -151
  104. data/test/gir_ffi/allocation_helper_test.rb +0 -36
  105. data/test/gir_ffi/arg_helper_test.rb +0 -139
  106. data/test/gir_ffi/boolean_test.rb +0 -43
  107. data/test/gir_ffi/boxed_base_test.rb +0 -65
  108. data/test/gir_ffi/builder_test.rb +0 -322
  109. data/test/gir_ffi/builders/argument_builder_test.rb +0 -651
  110. data/test/gir_ffi/builders/base_argument_builder_test.rb +0 -6
  111. data/test/gir_ffi/builders/callback_argument_builder_test.rb +0 -126
  112. data/test/gir_ffi/builders/callback_builder_test.rb +0 -117
  113. data/test/gir_ffi/builders/callback_return_value_builder_test.rb +0 -81
  114. data/test/gir_ffi/builders/constant_builder_test.rb +0 -6
  115. data/test/gir_ffi/builders/constructor_builder_test.rb +0 -37
  116. data/test/gir_ffi/builders/enum_builder_test.rb +0 -23
  117. data/test/gir_ffi/builders/field_builder_test.rb +0 -134
  118. data/test/gir_ffi/builders/function_builder_test.rb +0 -550
  119. data/test/gir_ffi/builders/initializer_builder_test.rb +0 -54
  120. data/test/gir_ffi/builders/interface_builder_test.rb +0 -32
  121. data/test/gir_ffi/builders/module_builder_test.rb +0 -43
  122. data/test/gir_ffi/builders/object_builder_test.rb +0 -98
  123. data/test/gir_ffi/builders/property_builder_test.rb +0 -158
  124. data/test/gir_ffi/builders/registered_type_builder_test.rb +0 -54
  125. data/test/gir_ffi/builders/return_value_builder_test.rb +0 -433
  126. data/test/gir_ffi/builders/signal_closure_builder_test.rb +0 -197
  127. data/test/gir_ffi/builders/struct_builder_test.rb +0 -93
  128. data/test/gir_ffi/builders/unintrospectable_boxed_builder_test.rb +0 -29
  129. data/test/gir_ffi/builders/unintrospectable_builder_test.rb +0 -84
  130. data/test/gir_ffi/builders/union_builder_test.rb +0 -28
  131. data/test/gir_ffi/builders/user_defined_builder_test.rb +0 -524
  132. data/test/gir_ffi/builders/vfunc_argument_builder_test.rb +0 -101
  133. data/test/gir_ffi/builders/vfunc_builder_test.rb +0 -241
  134. data/test/gir_ffi/callback_base_test.rb +0 -22
  135. data/test/gir_ffi/class_base_test.rb +0 -166
  136. data/test/gir_ffi/core_test.rb +0 -98
  137. data/test/gir_ffi/enum_base_test.rb +0 -43
  138. data/test/gir_ffi/error_type_info_test.rb +0 -50
  139. data/test/gir_ffi/ffi_ext/pointer_test.rb +0 -20
  140. data/test/gir_ffi/g_type_test.rb +0 -31
  141. data/test/gir_ffi/in_pointer_test.rb +0 -203
  142. data/test/gir_ffi/info_ext/i_callable_info_test.rb +0 -26
  143. data/test/gir_ffi/info_ext/i_callback_info_test.rb +0 -21
  144. data/test/gir_ffi/info_ext/i_field_info_test.rb +0 -37
  145. data/test/gir_ffi/info_ext/i_function_info_test.rb +0 -74
  146. data/test/gir_ffi/info_ext/i_signal_info_test.rb +0 -32
  147. data/test/gir_ffi/info_ext/i_type_info_test.rb +0 -711
  148. data/test/gir_ffi/info_ext/i_unresolved_info_test.rb +0 -19
  149. data/test/gir_ffi/info_ext/safe_constant_name_test.rb +0 -26
  150. data/test/gir_ffi/info_ext/safe_function_name_test.rb +0 -26
  151. data/test/gir_ffi/interface_base_test.rb +0 -20
  152. data/test/gir_ffi/method_stubber_test.rb +0 -65
  153. data/test/gir_ffi/object_base_test.rb +0 -64
  154. data/test/gir_ffi/object_store_test.rb +0 -41
  155. data/test/gir_ffi/receiver_argument_info_test.rb +0 -33
  156. data/test/gir_ffi/sized_array_test.rb +0 -206
  157. data/test/gir_ffi/struct_base_test.rb +0 -23
  158. data/test/gir_ffi/struct_like_base_test.rb +0 -167
  159. data/test/gir_ffi/type_map_test.rb +0 -17
  160. data/test/gir_ffi/unintrospectable_type_info_test.rb +0 -121
  161. data/test/gir_ffi/union_base_test.rb +0 -23
  162. data/test/gir_ffi/user_defined_object_info_test.rb +0 -119
  163. data/test/gir_ffi/user_defined_property_info_test.rb +0 -39
  164. data/test/gir_ffi/variable_name_generator_test.rb +0 -18
  165. data/test/gir_ffi/version_test.rb +0 -9
  166. data/test/gir_ffi/zero_terminated_test.rb +0 -108
  167. data/test/gir_ffi_test_helper.rb +0 -84
  168. data/test/integration/callback_exceptions_test.rb +0 -59
  169. data/test/integration/derived_classes_test.rb +0 -53
  170. data/test/integration/generated_everything_test.rb +0 -452
  171. data/test/integration/generated_gimarshallingtests_test.rb +0 -3096
  172. data/test/integration/generated_gio_test.rb +0 -116
  173. data/test/integration/generated_glib_test.rb +0 -10
  174. data/test/integration/generated_gobject_test.rb +0 -124
  175. data/test/integration/generated_gst_test.rb +0 -38
  176. data/test/integration/generated_gtk_source_test.rb +0 -32
  177. data/test/integration/generated_gtop_test.rb +0 -22
  178. data/test/integration/generated_pango_ft2_test.rb +0 -17
  179. data/test/integration/generated_pango_test.rb +0 -24
  180. data/test/integration/generated_regress_test.rb +0 -4062
  181. data/test/integration/generated_secret_test.rb +0 -14
  182. data/test/integration/generated_utility_test.rb +0 -174
  183. data/test/integration/generated_warnlib_test.rb +0 -43
  184. data/test/integration/method_lookup_test.rb +0 -34
  185. data/test/introspection_test_helper.rb +0 -93
  186. data/test/lib/Makefile.am +0 -110
  187. data/test/lib/autogen.sh +0 -4
  188. data/test/lib/configure.ac +0 -34
  189. data/test/lib/m4/jhflags.m4 +0 -21
  190. 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
@@ -18,7 +18,7 @@ module GObject
18
18
  end
19
19
 
20
20
  def initialize(&block)
21
- raise ArgumentError unless block_given?
21
+ block or raise ArgumentError, "Block needed"
22
22
 
23
23
  initialize_simple(self.class::Struct.size, nil)
24
24
  self.block = block
@@ -5,28 +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
20
-
21
- def self.make_finalizer(struct)
22
- proc do
23
- if struct.owned?
24
- ptr = struct.to_ptr
25
- Lib.g_value_unset ptr unless struct[:g_type] == TYPE_INVALID
26
- GObject.boxed_free gtype, ptr
27
- end
28
- end
29
- end
8
+ setup_instance_method! :init
30
9
 
31
10
  METHOD_MAP = {
32
11
  TYPE_INVALID => [:get_none, :set_none],
@@ -54,37 +33,6 @@ module GObject
54
33
  TYPE_VARIANT => [:get_variant, :set_variant]
55
34
  }.freeze
56
35
 
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
36
  # TODO: Give more generic name
89
37
  def self.wrap_ruby_value(val)
90
38
  new.tap { |gv| gv.__send__ :set_ruby_value, val }
@@ -119,17 +67,6 @@ module GObject
119
67
  Lib.g_value_copy value, target unless value.uninitialized?
120
68
  end
121
69
 
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
70
  CLASS_TO_GTYPE_MAP = {
134
71
  NilClass => TYPE_INVALID,
135
72
  TrueClass => TYPE_BOOLEAN,
@@ -138,76 +75,130 @@ module GObject
138
75
  String => TYPE_STRING
139
76
  }.freeze
140
77
 
141
- def init_for_ruby_value(val)
142
- return init val.class.gtype if val.class.respond_to? :gtype
78
+ # Overrides for existing Value methods
79
+ module Overrides
80
+ def set_value(val)
81
+ send set_method, val
82
+ end
143
83
 
144
- CLASS_TO_GTYPE_MAP.each do |klass, type|
145
- return init type if val.is_a? klass
84
+ alias value= set_value
85
+
86
+ def current_gtype
87
+ struct[:g_type]
146
88
  end
147
- raise "Can't handle #{val.class}"
148
- end
149
89
 
150
- def set_none(_val); end
90
+ def current_fundamental_type
91
+ GObject.type_fundamental current_gtype
92
+ end
151
93
 
152
- def get_none; end
94
+ def current_gtype_name
95
+ GObject.type_name current_gtype
96
+ end
153
97
 
154
- def set_instance_enhanced(val)
155
- check_type_compatibility val if val
156
- set_instance val
157
- end
98
+ def get_value
99
+ value = get_value_plain
100
+ if current_fundamental_type == TYPE_BOXED
101
+ wrap_boxed value
102
+ else
103
+ value
104
+ end
105
+ end
158
106
 
159
- def set_enum_enhanced(val)
160
- val = current_gtype_class.to_native(val, nil)
161
- set_enum val
162
- end
107
+ def get_value_plain
108
+ send get_method
109
+ end
163
110
 
164
- def get_enum_enhanced
165
- current_gtype_class.wrap(get_enum)
166
- end
111
+ def uninitialized?
112
+ current_gtype == TYPE_INVALID
113
+ end
167
114
 
168
- def set_flags_enhanced(val)
169
- val = current_gtype_class.to_native(val, nil)
170
- set_flags val
171
- end
115
+ def init(type)
116
+ Lib.g_value_init self, type unless [TYPE_NONE, TYPE_INVALID].include? type
117
+ self
118
+ end
172
119
 
173
- def get_flags_enhanced
174
- current_gtype_class.wrap(get_flags)
175
- end
120
+ private
176
121
 
177
- def current_gtype_class
178
- GirFFI::Builder.build_by_gtype(current_gtype)
179
- end
122
+ def set_ruby_value(val)
123
+ init_for_ruby_value val if uninitialized?
124
+ set_value val
125
+ end
180
126
 
181
- def check_type_compatibility(val)
182
- return if GObject::Value.type_compatible(GObject.type_from_instance(val), current_gtype)
127
+ def init_for_ruby_value(val)
128
+ return init val.class.gtype if val.class.respond_to? :gtype
183
129
 
184
- raise ArgumentError, "#{val.class} is incompatible with #{current_gtype_name}"
185
- end
130
+ CLASS_TO_GTYPE_MAP.each do |klass, type|
131
+ return init type if val.is_a? klass
132
+ end
133
+ raise "Can't handle #{val.class}"
134
+ end
186
135
 
187
- def wrap_boxed(boxed)
188
- case current_gtype
189
- when TYPE_STRV
190
- GLib::Strv.wrap boxed
191
- when TYPE_HASH_TABLE
192
- GLib::HashTable.wrap [:gpointer, :gpointer], boxed
193
- when TYPE_ARRAY
194
- GLib::Array.wrap nil, boxed
195
- else
196
- current_gtype_class.wrap(boxed) unless boxed.null?
136
+ def set_none(_val); end
137
+
138
+ def get_none; end
139
+
140
+ def set_instance_enhanced(val)
141
+ check_type_compatibility val if val
142
+ set_instance val
197
143
  end
198
- end
199
144
 
200
- def get_method
201
- method_map_entry.first
202
- end
145
+ def set_enum_enhanced(val)
146
+ val = current_gtype_class.to_native(val, nil)
147
+ set_enum val
148
+ end
203
149
 
204
- def set_method
205
- method_map_entry.last
206
- end
150
+ def get_enum_enhanced
151
+ current_gtype_class.wrap(get_enum)
152
+ end
207
153
 
208
- def method_map_entry
209
- METHOD_MAP[current_gtype] || METHOD_MAP[current_fundamental_type] ||
210
- raise("No method map entry for '#{current_gtype_name}'")
154
+ def set_flags_enhanced(val)
155
+ val = current_gtype_class.to_native(val, nil)
156
+ set_flags val
157
+ end
158
+
159
+ def get_flags_enhanced
160
+ current_gtype_class.wrap(get_flags)
161
+ end
162
+
163
+ def current_gtype_class
164
+ GirFFI::Builder.build_by_gtype(current_gtype)
165
+ end
166
+
167
+ def check_type_compatibility(val)
168
+ if GObject::Value.type_compatible(GObject.type_from_instance(val), current_gtype)
169
+ return
170
+ end
171
+
172
+ raise ArgumentError, "#{val.class} is incompatible with #{current_gtype_name}"
173
+ end
174
+
175
+ def wrap_boxed(boxed)
176
+ case current_gtype
177
+ when TYPE_STRV
178
+ GLib::Strv.wrap boxed
179
+ when TYPE_HASH_TABLE
180
+ GLib::HashTable.wrap [:gpointer, :gpointer], boxed
181
+ when TYPE_ARRAY
182
+ GLib::Array.wrap nil, boxed
183
+ else
184
+ current_gtype_class.wrap(boxed) unless boxed.null?
185
+ end
186
+ end
187
+
188
+ def get_method
189
+ method_map_entry.first
190
+ end
191
+
192
+ def set_method
193
+ method_map_entry.last
194
+ end
195
+
196
+ def method_map_entry
197
+ METHOD_MAP[current_gtype] || METHOD_MAP[current_fundamental_type] ||
198
+ raise("No method map entry for '#{current_gtype_name}'")
199
+ end
211
200
  end
201
+
202
+ prepend Overrides
212
203
  end
213
204
  end
@@ -4,19 +4,26 @@ module GObjectIntrospection
4
4
  # Wraps GIBaseInfo struct, the base \type for all info types.
5
5
  # Decendant types will be implemented as needed.
6
6
  class IBaseInfo
7
- def initialize(ptr, lib = Lib)
7
+ def initialize(ptr)
8
8
  raise ArgumentError, "ptr must not be null" if ptr.null?
9
9
 
10
- ObjectSpace.define_finalizer self, self.class.make_finalizer(lib, ptr)
10
+ ObjectSpace.define_finalizer self, self.class.make_finalizer(ptr)
11
11
 
12
12
  @pointer = ptr
13
- @lib = lib
14
13
  end
15
14
 
16
15
  attr_reader :pointer
17
16
 
18
- def self.make_finalizer(lib, ptr)
19
- proc { lib.g_base_info_unref ptr }
17
+ def self.make_finalizer(ptr)
18
+ proc { finalize ptr }
19
+ end
20
+
21
+ class << self
22
+ protected
23
+
24
+ def finalize(ptr)
25
+ Lib.g_base_info_unref ptr
26
+ end
20
27
  end
21
28
 
22
29
  def to_ptr
@@ -35,7 +42,7 @@ module GObjectIntrospection
35
42
  # Examples:
36
43
  #
37
44
  # build_array_method :fields
38
- # build_array_mehtod :properties, :property
45
+ # build_array_method :properties, :property
39
46
  # build_array_method :get_methods
40
47
  #
41
48
  def self.build_array_method(method, single = nil)
@@ -44,12 +51,12 @@ module GObjectIntrospection
44
51
  single ||= method[0..-2]
45
52
  count = method.sub(/^(get_)?/, '\\1n_')
46
53
  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
54
+ def #{method} # def fields
55
+ #{cache_ivar} ||= # @fields_cache ||=
56
+ (0..(#{count} - 1)).map do |i| # (0..(n_fields - 1)).map do |i|
57
+ #{single} i # field i
58
+ end # end
59
+ end # end
53
60
  CODE
54
61
  end
55
62
 
@@ -76,18 +83,18 @@ module GObjectIntrospection
76
83
  counter ||= "n_#{single}s"
77
84
  fetcher ||= single
78
85
  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
86
+ def #{method}(name) # def find_field(name)
87
+ #{cache_ivar} ||= begin # @find_field_cache ||= begin
88
+ hash = {} # hash = {}
89
+ #{counter}.times do |i| # n_fields.times do |i|
90
+ it = #{fetcher}(i) # it = field(i)
91
+ hash[it.name] = it # hash[it.name] = it
92
+ end # end
93
+ hash # hash
94
+ end # end
95
+ name = name.to_s # name = name.to_s
96
+ #{cache_ivar}[name] # @find_field_cache[name]
97
+ end # end
91
98
  CODE
92
99
  end
93
100
 
@@ -107,12 +114,13 @@ module GObjectIntrospection
107
114
  namespace.sub(/^[a-z]/, &:upcase)
108
115
  end
109
116
 
110
- # TODO: Avoid calling for IStructInfo
111
117
  def container
112
118
  @container ||= begin
113
119
  ptr = Lib.g_base_info_get_container self
114
- Lib.g_base_info_ref ptr
115
- IRepository.wrap_ibaseinfo_pointer ptr
120
+ unless ptr.null?
121
+ Lib.g_base_info_ref ptr
122
+ IRepository.wrap_ibaseinfo_pointer ptr
123
+ end
116
124
  end
117
125
  end
118
126
 
@@ -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
@@ -15,11 +14,11 @@ module GirFFI
15
14
  def to_ruby_value
16
15
  bare_value = to_value
17
16
  case value_type
18
- when :utf8
17
+ when :utf8, :filename
19
18
  bare_value.to_utf8
20
19
  when Array
21
20
  value_type[1].wrap bare_value
22
- when Class
21
+ when Module
23
22
  value_type.wrap bare_value
24
23
  else
25
24
  bare_value
@@ -4,18 +4,9 @@ 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
- proc do
14
- if struct.owned?
15
- struct.owned = nil
16
- GObject.boxed_free gtype, struct.to_ptr
17
- end
18
- end
9
+ proc { finalize(struct) }
19
10
  end
20
11
 
21
12
  def self.copy(val)
@@ -23,6 +14,17 @@ module GirFFI
23
14
  wrap(ptr)
24
15
  end
25
16
 
17
+ class << self
18
+ protected
19
+
20
+ def finalize(struct)
21
+ struct.owned? or return
22
+
23
+ struct.owned = nil
24
+ GObject.boxed_free gtype, struct.to_ptr
25
+ end
26
+ end
27
+
26
28
  private
27
29
 
28
30
  def store_pointer(*)