gir_ffi 0.14.1 → 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 (281) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +56 -0
  3. data/README.md +12 -12
  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 +26 -21
  8. data/lib/ffi-glib/array.rb +14 -4
  9. data/lib/ffi-glib/byte_array.rb +9 -3
  10. data/lib/ffi-glib/container_class_methods.rb +1 -1
  11. data/lib/ffi-glib/destroy_notify.rb +2 -2
  12. data/lib/ffi-glib/error.rb +1 -1
  13. data/lib/ffi-glib/hash_table.rb +4 -5
  14. data/lib/ffi-glib/list.rb +12 -6
  15. data/lib/ffi-glib/list_methods.rb +13 -1
  16. data/lib/ffi-glib/main_loop.rb +3 -3
  17. data/lib/ffi-glib/ptr_array.rb +30 -8
  18. data/lib/ffi-glib/s_list.rb +11 -5
  19. data/lib/ffi-glib/variant.rb +1 -1
  20. data/lib/ffi-gobject.rb +13 -16
  21. data/lib/ffi-gobject/object.rb +82 -87
  22. data/lib/ffi-gobject/object_class.rb +1 -1
  23. data/lib/ffi-gobject/param_spec.rb +1 -1
  24. data/lib/ffi-gobject/ruby_closure.rb +2 -2
  25. data/lib/ffi-gobject/value.rb +136 -126
  26. data/lib/ffi-gobject_introspection.rb +20 -20
  27. data/lib/ffi-gobject_introspection/gobject_type_init.rb +2 -2
  28. data/lib/ffi-gobject_introspection/i_arg_info.rb +2 -2
  29. data/lib/ffi-gobject_introspection/i_base_info.rb +34 -23
  30. data/lib/ffi-gobject_introspection/i_callable_info.rb +4 -4
  31. data/lib/ffi-gobject_introspection/i_constant_info.rb +2 -2
  32. data/lib/ffi-gobject_introspection/i_enum_info.rb +1 -0
  33. data/lib/ffi-gobject_introspection/i_field_info.rb +1 -1
  34. data/lib/ffi-gobject_introspection/i_function_info.rb +1 -1
  35. data/lib/ffi-gobject_introspection/i_interface_info.rb +1 -1
  36. data/lib/ffi-gobject_introspection/i_object_info.rb +2 -2
  37. data/lib/ffi-gobject_introspection/i_property_info.rb +2 -2
  38. data/lib/ffi-gobject_introspection/i_repository.rb +9 -6
  39. data/lib/ffi-gobject_introspection/i_struct_info.rb +2 -1
  40. data/lib/ffi-gobject_introspection/i_type_info.rb +13 -7
  41. data/lib/ffi-gobject_introspection/i_unresolved_info.rb +1 -1
  42. data/lib/ffi-gobject_introspection/i_vfunc_info.rb +1 -1
  43. data/lib/ffi-gobject_introspection/lib.rb +30 -19
  44. data/lib/ffi-gobject_introspection/strv.rb +1 -1
  45. data/lib/gir_ffi-base.rb +1 -1
  46. data/lib/gir_ffi-base/gobject.rb +26 -25
  47. data/lib/gir_ffi-base/gobject/lib.rb +7 -2
  48. data/lib/gir_ffi.rb +3 -3
  49. data/lib/gir_ffi/allocation_helper.rb +1 -1
  50. data/lib/gir_ffi/arg_helper.rb +4 -4
  51. data/lib/gir_ffi/{in_out_pointer.rb → array_element_convertor.rb} +16 -24
  52. data/lib/gir_ffi/boolean.rb +1 -1
  53. data/lib/gir_ffi/boxed_base.rb +2 -6
  54. data/lib/gir_ffi/builder.rb +19 -11
  55. data/lib/gir_ffi/builder_helper.rb +10 -2
  56. data/lib/gir_ffi/builders/argument_builder.rb +19 -19
  57. data/lib/gir_ffi/builders/argument_builder_collection.rb +2 -2
  58. data/lib/gir_ffi/builders/base_argument_builder.rb +2 -1
  59. data/lib/gir_ffi/builders/base_method_builder.rb +8 -8
  60. data/lib/gir_ffi/builders/base_return_value_builder.rb +1 -1
  61. data/lib/gir_ffi/builders/base_type_builder.rb +2 -2
  62. data/lib/gir_ffi/builders/c_to_ruby_convertor.rb +5 -5
  63. data/lib/gir_ffi/builders/callback_argument_builder.rb +10 -8
  64. data/lib/gir_ffi/builders/callback_builder.rb +28 -14
  65. data/lib/gir_ffi/builders/callback_return_value_builder.rb +6 -8
  66. data/lib/gir_ffi/builders/class_struct_builder.rb +24 -0
  67. data/lib/gir_ffi/builders/closure_argument_builder.rb +1 -1
  68. data/lib/gir_ffi/builders/closure_return_value_builder.rb +1 -1
  69. data/lib/gir_ffi/builders/constant_builder.rb +1 -1
  70. data/lib/gir_ffi/builders/constructor_builder.rb +9 -9
  71. data/lib/gir_ffi/builders/enum_builder.rb +11 -7
  72. data/lib/gir_ffi/builders/field_builder.rb +20 -18
  73. data/lib/gir_ffi/builders/flags_builder.rb +2 -2
  74. data/lib/gir_ffi/builders/full_c_to_ruby_convertor.rb +1 -1
  75. data/lib/gir_ffi/builders/function_builder.rb +11 -5
  76. data/lib/gir_ffi/builders/initializer_builder.rb +3 -3
  77. data/lib/gir_ffi/builders/initializer_return_value_builder.rb +2 -2
  78. data/lib/gir_ffi/builders/interface_builder.rb +5 -3
  79. data/lib/gir_ffi/builders/mapping_method_builder.rb +10 -10
  80. data/lib/gir_ffi/builders/marshalling_method_builder.rb +12 -9
  81. data/lib/gir_ffi/builders/method_template.rb +5 -5
  82. data/lib/gir_ffi/builders/module_builder.rb +7 -7
  83. data/lib/gir_ffi/builders/null_argument_builder.rb +0 -2
  84. data/lib/gir_ffi/builders/null_return_value_builder.rb +0 -2
  85. data/lib/gir_ffi/builders/object_builder.rb +22 -12
  86. data/lib/gir_ffi/builders/property_argument_builder.rb +1 -1
  87. data/lib/gir_ffi/builders/property_builder.rb +14 -14
  88. data/lib/gir_ffi/builders/property_return_value_builder.rb +1 -1
  89. data/lib/gir_ffi/builders/registered_type_builder.rb +14 -5
  90. data/lib/gir_ffi/builders/return_value_builder.rb +4 -4
  91. data/lib/gir_ffi/builders/ruby_to_c_convertor.rb +6 -6
  92. data/lib/gir_ffi/builders/signal_closure_builder.rb +5 -7
  93. data/lib/gir_ffi/builders/struct_builder.rb +8 -6
  94. data/lib/gir_ffi/builders/struct_like.rb +1 -1
  95. data/lib/gir_ffi/builders/type_builder.rb +12 -12
  96. data/lib/gir_ffi/builders/unintrospectable_boxed_builder.rb +2 -2
  97. data/lib/gir_ffi/builders/unintrospectable_builder.rb +2 -2
  98. data/lib/gir_ffi/builders/union_builder.rb +4 -4
  99. data/lib/gir_ffi/builders/user_defined_builder.rb +10 -3
  100. data/lib/gir_ffi/builders/vfunc_argument_builder.rb +2 -2
  101. data/lib/gir_ffi/builders/vfunc_builder.rb +8 -8
  102. data/lib/gir_ffi/builders/with_layout.rb +2 -2
  103. data/lib/gir_ffi/callback_base.rb +7 -9
  104. data/lib/gir_ffi/class_base.rb +6 -5
  105. data/lib/gir_ffi/core.rb +36 -22
  106. data/lib/gir_ffi/enum_base.rb +1 -1
  107. data/lib/gir_ffi/enum_like_base.rb +2 -2
  108. data/lib/gir_ffi/error_argument_info.rb +2 -2
  109. data/lib/gir_ffi/error_type_info.rb +1 -1
  110. data/lib/gir_ffi/ffi_ext.rb +1 -1
  111. data/lib/gir_ffi/ffi_ext/pointer.rb +1 -1
  112. data/lib/gir_ffi/flags_base.rb +1 -1
  113. data/lib/gir_ffi/glib_error.rb +1 -2
  114. data/lib/gir_ffi/in_pointer.rb +17 -0
  115. data/lib/gir_ffi/info_ext.rb +15 -15
  116. data/lib/gir_ffi/info_ext/full_type_name.rb +3 -3
  117. data/lib/gir_ffi/info_ext/i_arg_info.rb +1 -1
  118. data/lib/gir_ffi/info_ext/i_callable_info.rb +1 -1
  119. data/lib/gir_ffi/info_ext/i_callback_info.rb +1 -1
  120. data/lib/gir_ffi/info_ext/i_field_info.rb +1 -1
  121. data/lib/gir_ffi/info_ext/i_function_info.rb +1 -1
  122. data/lib/gir_ffi/info_ext/i_property_info.rb +2 -2
  123. data/lib/gir_ffi/info_ext/i_registered_type_info.rb +4 -5
  124. data/lib/gir_ffi/info_ext/i_signal_info.rb +7 -3
  125. data/lib/gir_ffi/info_ext/i_type_info.rb +48 -26
  126. data/lib/gir_ffi/info_ext/i_unresolved_info.rb +1 -1
  127. data/lib/gir_ffi/info_ext/i_value_info.rb +2 -2
  128. data/lib/gir_ffi/info_ext/i_vfunc_info.rb +2 -2
  129. data/lib/gir_ffi/info_ext/safe_constant_name.rb +8 -8
  130. data/lib/gir_ffi/info_ext/safe_function_name.rb +2 -2
  131. data/lib/gir_ffi/interface_base.rb +3 -3
  132. data/lib/gir_ffi/lib_c.rb +1 -1
  133. data/lib/gir_ffi/method_stubber.rb +1 -1
  134. data/lib/gir_ffi/module_base.rb +1 -1
  135. data/lib/gir_ffi/object_base.rb +30 -4
  136. data/lib/gir_ffi/receiver_argument_info.rb +1 -1
  137. data/lib/gir_ffi/receiver_type_info.rb +2 -2
  138. data/lib/gir_ffi/registered_type_base.rb +1 -1
  139. data/lib/gir_ffi/return_value_info.rb +1 -2
  140. data/lib/gir_ffi/sized_array.rb +4 -2
  141. data/lib/gir_ffi/struct.rb +1 -1
  142. data/lib/gir_ffi/struct_base.rb +2 -10
  143. data/lib/gir_ffi/struct_like_base.rb +9 -5
  144. data/lib/gir_ffi/type_map.rb +2 -23
  145. data/lib/gir_ffi/unintrospectable_boxed_info.rb +2 -2
  146. data/lib/gir_ffi/unintrospectable_type_info.rb +6 -2
  147. data/lib/gir_ffi/union.rb +1 -1
  148. data/lib/gir_ffi/union_base.rb +2 -10
  149. data/lib/gir_ffi/user_defined_object_info.rb +9 -4
  150. data/lib/gir_ffi/user_defined_property_info.rb +33 -33
  151. data/lib/gir_ffi/version.rb +1 -1
  152. data/lib/gir_ffi/vfunc_implementation.rb +1 -0
  153. metadata +102 -155
  154. data/Gemfile +0 -12
  155. data/Rakefile +0 -9
  156. data/lib/ffi-glib/array_methods.rb +0 -16
  157. data/tasks/test.rake +0 -203
  158. data/test/base_test_helper.rb +0 -63
  159. data/test/ffi-glib/array_test.rb +0 -188
  160. data/test/ffi-glib/byte_array_test.rb +0 -22
  161. data/test/ffi-glib/bytes_test.rb +0 -56
  162. data/test/ffi-glib/closure_test.rb +0 -38
  163. data/test/ffi-glib/destroy_notify_test.rb +0 -18
  164. data/test/ffi-glib/hash_table_test.rb +0 -68
  165. data/test/ffi-glib/list_test.rb +0 -86
  166. data/test/ffi-glib/main_loop_test.rb +0 -53
  167. data/test/ffi-glib/ptr_array_test.rb +0 -112
  168. data/test/ffi-glib/ruby_closure_test.rb +0 -62
  169. data/test/ffi-glib/s_list_test.rb +0 -76
  170. data/test/ffi-glib/strv_test.rb +0 -60
  171. data/test/ffi-glib/variant_test.rb +0 -12
  172. data/test/ffi-gobject/gobject_test.rb +0 -72
  173. data/test/ffi-gobject/object_class_test.rb +0 -31
  174. data/test/ffi-gobject/object_test.rb +0 -140
  175. data/test/ffi-gobject/param_spec_test.rb +0 -32
  176. data/test/ffi-gobject/value_test.rb +0 -370
  177. data/test/ffi-gobject_introspection/gobject_type_init_test.rb +0 -26
  178. data/test/ffi-gobject_introspection/i_base_info_test.rb +0 -53
  179. data/test/ffi-gobject_introspection/i_constant_info_test.rb +0 -33
  180. data/test/ffi-gobject_introspection/i_enum_info_test.rb +0 -18
  181. data/test/ffi-gobject_introspection/i_function_info_test.rb +0 -6
  182. data/test/ffi-gobject_introspection/i_interface_info_test.rb +0 -23
  183. data/test/ffi-gobject_introspection/i_object_info_test.rb +0 -49
  184. data/test/ffi-gobject_introspection/i_property_info_test.rb +0 -47
  185. data/test/ffi-gobject_introspection/i_registered_type_info_test.rb +0 -27
  186. data/test/ffi-gobject_introspection/i_repository_test.rb +0 -81
  187. data/test/ffi-gobject_introspection/i_struct_info_test.rb +0 -23
  188. data/test/ffi-gobject_introspection/i_type_info_test.rb +0 -33
  189. data/test/ffi-gobject_introspection/i_union_info_test.rb +0 -17
  190. data/test/ffi-gobject_introspection/i_vfunc_info_test.rb +0 -41
  191. data/test/ffi-gobject_introspection/lib_test.rb +0 -13
  192. data/test/ffi-gobject_introspection/strv_test.rb +0 -46
  193. data/test/ffi-gobject_test.rb +0 -151
  194. data/test/gir_ffi/allocation_helper_test.rb +0 -36
  195. data/test/gir_ffi/arg_helper_test.rb +0 -140
  196. data/test/gir_ffi/boolean_test.rb +0 -43
  197. data/test/gir_ffi/boxed_base_test.rb +0 -65
  198. data/test/gir_ffi/builder_test.rb +0 -300
  199. data/test/gir_ffi/builders/argument_builder_test.rb +0 -657
  200. data/test/gir_ffi/builders/base_argument_builder_test.rb +0 -6
  201. data/test/gir_ffi/builders/callback_argument_builder_test.rb +0 -129
  202. data/test/gir_ffi/builders/callback_builder_test.rb +0 -118
  203. data/test/gir_ffi/builders/callback_return_value_builder_test.rb +0 -85
  204. data/test/gir_ffi/builders/constant_builder_test.rb +0 -6
  205. data/test/gir_ffi/builders/constructor_builder_test.rb +0 -37
  206. data/test/gir_ffi/builders/enum_builder_test.rb +0 -23
  207. data/test/gir_ffi/builders/field_builder_test.rb +0 -134
  208. data/test/gir_ffi/builders/function_builder_test.rb +0 -538
  209. data/test/gir_ffi/builders/initializer_builder_test.rb +0 -54
  210. data/test/gir_ffi/builders/interface_builder_test.rb +0 -32
  211. data/test/gir_ffi/builders/module_builder_test.rb +0 -43
  212. data/test/gir_ffi/builders/object_builder_test.rb +0 -98
  213. data/test/gir_ffi/builders/property_builder_test.rb +0 -161
  214. data/test/gir_ffi/builders/registered_type_builder_test.rb +0 -30
  215. data/test/gir_ffi/builders/return_value_builder_test.rb +0 -440
  216. data/test/gir_ffi/builders/signal_closure_builder_test.rb +0 -188
  217. data/test/gir_ffi/builders/struct_builder_test.rb +0 -93
  218. data/test/gir_ffi/builders/unintrospectable_boxed_builder_test.rb +0 -35
  219. data/test/gir_ffi/builders/unintrospectable_builder_test.rb +0 -73
  220. data/test/gir_ffi/builders/union_builder_test.rb +0 -31
  221. data/test/gir_ffi/builders/user_defined_builder_test.rb +0 -524
  222. data/test/gir_ffi/builders/vfunc_argument_builder_test.rb +0 -101
  223. data/test/gir_ffi/builders/vfunc_builder_test.rb +0 -253
  224. data/test/gir_ffi/callback_base_test.rb +0 -22
  225. data/test/gir_ffi/class_base_test.rb +0 -168
  226. data/test/gir_ffi/core_test.rb +0 -98
  227. data/test/gir_ffi/enum_base_test.rb +0 -43
  228. data/test/gir_ffi/error_type_info_test.rb +0 -50
  229. data/test/gir_ffi/ffi_ext/pointer_test.rb +0 -20
  230. data/test/gir_ffi/g_type_test.rb +0 -31
  231. data/test/gir_ffi/in_out_pointer_test.rb +0 -56
  232. data/test/gir_ffi/in_pointer_test.rb +0 -183
  233. data/test/gir_ffi/info_ext/i_callable_info_test.rb +0 -26
  234. data/test/gir_ffi/info_ext/i_callback_info_test.rb +0 -21
  235. data/test/gir_ffi/info_ext/i_field_info_test.rb +0 -37
  236. data/test/gir_ffi/info_ext/i_function_info_test.rb +0 -74
  237. data/test/gir_ffi/info_ext/i_signal_info_test.rb +0 -32
  238. data/test/gir_ffi/info_ext/i_type_info_test.rb +0 -697
  239. data/test/gir_ffi/info_ext/i_unresolved_info_test.rb +0 -19
  240. data/test/gir_ffi/info_ext/safe_constant_name_test.rb +0 -26
  241. data/test/gir_ffi/info_ext/safe_function_name_test.rb +0 -26
  242. data/test/gir_ffi/interface_base_test.rb +0 -20
  243. data/test/gir_ffi/method_stubber_test.rb +0 -65
  244. data/test/gir_ffi/object_base_test.rb +0 -64
  245. data/test/gir_ffi/object_store_test.rb +0 -41
  246. data/test/gir_ffi/receiver_argument_info_test.rb +0 -33
  247. data/test/gir_ffi/sized_array_test.rb +0 -206
  248. data/test/gir_ffi/struct_base_test.rb +0 -23
  249. data/test/gir_ffi/struct_like_base_test.rb +0 -167
  250. data/test/gir_ffi/type_map_test.rb +0 -17
  251. data/test/gir_ffi/unintrospectable_type_info_test.rb +0 -121
  252. data/test/gir_ffi/union_base_test.rb +0 -23
  253. data/test/gir_ffi/user_defined_object_info_test.rb +0 -119
  254. data/test/gir_ffi/user_defined_property_info_test.rb +0 -39
  255. data/test/gir_ffi/variable_name_generator_test.rb +0 -18
  256. data/test/gir_ffi/version_test.rb +0 -9
  257. data/test/gir_ffi/zero_terminated_test.rb +0 -108
  258. data/test/gir_ffi_test_helper.rb +0 -84
  259. data/test/integration/callback_exceptions_test.rb +0 -63
  260. data/test/integration/derived_classes_test.rb +0 -53
  261. data/test/integration/generated_everything_test.rb +0 -452
  262. data/test/integration/generated_gimarshallingtests_test.rb +0 -2995
  263. data/test/integration/generated_gio_test.rb +0 -116
  264. data/test/integration/generated_glib_test.rb +0 -12
  265. data/test/integration/generated_gobject_test.rb +0 -116
  266. data/test/integration/generated_gst_test.rb +0 -34
  267. data/test/integration/generated_gtk_source_test.rb +0 -27
  268. data/test/integration/generated_gtop_test.rb +0 -29
  269. data/test/integration/generated_pango_ft2_test.rb +0 -17
  270. data/test/integration/generated_pango_test.rb +0 -24
  271. data/test/integration/generated_regress_test.rb +0 -3850
  272. data/test/integration/generated_secret_test.rb +0 -17
  273. data/test/integration/generated_utility_test.rb +0 -174
  274. data/test/integration/generated_warnlib_test.rb +0 -49
  275. data/test/integration/method_lookup_test.rb +0 -34
  276. data/test/introspection_test_helper.rb +0 -52
  277. data/test/lib/Makefile.am +0 -110
  278. data/test/lib/autogen.sh +0 -4
  279. data/test/lib/configure.ac +0 -34
  280. data/test/lib/m4/jhflags.m4 +0 -21
  281. data/test/minitest/stats_plugin.rb +0 -30
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'gir_ffi/builder_helper'
3
+ require "gir_ffi/builder_helper"
4
4
 
5
5
  module GirFFI
6
6
  module InfoExt
@@ -20,15 +20,14 @@ module GirFFI
20
20
 
21
21
  def find_instance_method(method)
22
22
  info = find_method method
23
- return info if info && info.method?
23
+ return info if info&.method?
24
24
  end
25
25
 
26
26
  def find_method(_method)
27
- raise 'Must be overridden in subclass'
27
+ raise "Must be overridden in subclass"
28
28
  end
29
29
  end
30
30
  end
31
31
  end
32
32
 
33
- GObjectIntrospection::IRegisteredTypeInfo.send :include,
34
- GirFFI::InfoExt::IRegisteredTypeInfo
33
+ GObjectIntrospection::IRegisteredTypeInfo.include GirFFI::InfoExt::IRegisteredTypeInfo
@@ -17,8 +17,8 @@ module GirFFI
17
17
  end
18
18
 
19
19
  def arguments_to_gvalues(instance, arguments)
20
- arg_g_values = args.zip(arguments).map do |info, arg|
21
- info.argument_type.make_g_value.tap { |it| it.set_value arg }
20
+ arg_g_values = argument_types.zip(arguments).map do |type, arg|
21
+ type.make_g_value.tap { |it| it.set_value arg }
22
22
  end
23
23
 
24
24
  arg_g_values.unshift GObject::Value.wrap_instance(instance)
@@ -27,8 +27,12 @@ module GirFFI
27
27
  def gvalue_for_return_value
28
28
  return_type.make_g_value
29
29
  end
30
+
31
+ def argument_types
32
+ @argument_types ||= args.map(&:argument_type)
33
+ end
30
34
  end
31
35
  end
32
36
  end
33
37
 
34
- GObjectIntrospection::ISignalInfo.send :include, GirFFI::InfoExt::ISignalInfo
38
+ GObjectIntrospection::ISignalInfo.include GirFFI::InfoExt::ISignalInfo
@@ -1,13 +1,34 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'gir_ffi/builder_helper'
3
+ require "gir_ffi/builder_helper"
4
4
 
5
5
  module GirFFI
6
6
  module InfoExt
7
7
  # Extensions for GObjectIntrospection::ITypeInfo needed by GirFFI
8
8
  module ITypeInfo
9
+ FLATTENED_TAG_TO_GTYPE_MAP = {
10
+ gboolean: GObject::TYPE_BOOLEAN,
11
+ gint32: GObject::TYPE_INT,
12
+ gint64: GObject::TYPE_INT64,
13
+ guint64: GObject::TYPE_UINT64,
14
+ void: GObject::TYPE_NONE
15
+ }.freeze
16
+
17
+ FLATTENED_TAG_POINTER_TO_GTYPE_MAP = {
18
+ array: GObject::TYPE_ARRAY,
19
+ ghash: GObject::TYPE_HASH_TABLE,
20
+ strv: GObject::TYPE_STRV,
21
+ utf8: GObject::TYPE_STRING
22
+ }.freeze
23
+
9
24
  def gtype
10
- TypeMap.type_info_to_gtype self
25
+ return interface.gtype if tag == :interface
26
+
27
+ if pointer?
28
+ FLATTENED_TAG_POINTER_TO_GTYPE_MAP.fetch(flattened_tag, GObject::TYPE_POINTER)
29
+ else
30
+ FLATTENED_TAG_TO_GTYPE_MAP.fetch(flattened_tag)
31
+ end
11
32
  end
12
33
 
13
34
  def make_g_value
@@ -24,14 +45,15 @@ module GirFFI
24
45
  end
25
46
 
26
47
  def flattened_tag
27
- case tag
28
- when :interface
29
- interface_type
30
- when :array
31
- flattened_array_type
32
- else
33
- tag
34
- end
48
+ @flattened_tag ||=
49
+ case tag
50
+ when :interface
51
+ interface_type
52
+ when :array
53
+ flattened_array_type
54
+ else
55
+ tag
56
+ end
35
57
  end
36
58
 
37
59
  def interface_type
@@ -59,22 +81,22 @@ module GirFFI
59
81
  end
60
82
 
61
83
  def interface_class
62
- Builder.build_class interface if tag == :interface
84
+ @interface_class ||= Builder.build_class interface if tag == :interface
63
85
  end
64
86
 
65
87
  TAG_TO_WRAPPER_CLASS_MAP = {
66
- array: 'GLib::Array',
67
- byte_array: 'GLib::ByteArray',
68
- c: 'GirFFI::SizedArray',
69
- error: 'GLib::Error',
70
- ghash: 'GLib::HashTable',
71
- glist: 'GLib::List',
72
- gslist: 'GLib::SList',
73
- ptr_array: 'GLib::PtrArray',
74
- strv: 'GLib::Strv',
75
- utf8: 'GirFFI::InPointer', # TODO: Create a string-like class
76
- void: 'GirFFI::InPointer', # TODO: Create a void-pointer class
77
- zero_terminated: 'GirFFI::ZeroTerminated'
88
+ array: "GLib::Array",
89
+ byte_array: "GLib::ByteArray",
90
+ c: "GirFFI::SizedArray",
91
+ error: "GLib::Error",
92
+ ghash: "GLib::HashTable",
93
+ glist: "GLib::List",
94
+ gslist: "GLib::SList",
95
+ ptr_array: "GLib::PtrArray",
96
+ strv: "GLib::Strv",
97
+ utf8: "GirFFI::InPointer", # TODO: Create a string-like class
98
+ void: "GirFFI::InPointer", # TODO: Create a void-pointer class
99
+ zero_terminated: "GirFFI::ZeroTerminated"
78
100
  }.freeze
79
101
 
80
102
  # TODO: Use class rather than class name
@@ -144,7 +166,7 @@ module GirFFI
144
166
  end
145
167
 
146
168
  def needs_c_to_ruby_conversion_for_closures?
147
- [:array, :c, :ghash, :glist, :struct, :strv].include?(flattened_tag)
169
+ [:array, :c, :error, :ghash, :glist, :struct, :strv].include?(flattened_tag)
148
170
  end
149
171
 
150
172
  def needs_ruby_to_c_conversion_for_closures?
@@ -170,7 +192,7 @@ module GirFFI
170
192
  end
171
193
  end
172
194
 
173
- GOBJECT_VALUE_NAME = 'GObject::Value'.freeze
195
+ GOBJECT_VALUE_NAME = "GObject::Value"
174
196
 
175
197
  def gvalue?
176
198
  argument_class_name == GOBJECT_VALUE_NAME
@@ -220,4 +242,4 @@ module GirFFI
220
242
  end
221
243
  end
222
244
 
223
- GObjectIntrospection::ITypeInfo.send :include, GirFFI::InfoExt::ITypeInfo
245
+ GObjectIntrospection::ITypeInfo.include GirFFI::InfoExt::ITypeInfo
@@ -11,4 +11,4 @@ module GirFFI
11
11
  end
12
12
  end
13
13
 
14
- GObjectIntrospection::IUnresolvedInfo.send :include, GirFFI::InfoExt::IUnresolvedInfo
14
+ GObjectIntrospection::IUnresolvedInfo.include GirFFI::InfoExt::IUnresolvedInfo
@@ -6,7 +6,7 @@ module GirFFI
6
6
  module IValueInfo
7
7
  def constant_name
8
8
  upcased_name = name.upcase
9
- if upcased_name =~ /^[0-9]/
9
+ if /^[0-9]/.match?(upcased_name)
10
10
  "VALUE_#{upcased_name}"
11
11
  else
12
12
  upcased_name
@@ -22,4 +22,4 @@ module GirFFI
22
22
  end
23
23
  end
24
24
 
25
- GObjectIntrospection::IValueInfo.send :include, GirFFI::InfoExt::IValueInfo
25
+ GObjectIntrospection::IValueInfo.include GirFFI::InfoExt::IValueInfo
@@ -16,7 +16,7 @@ module GirFFI
16
16
  end
17
17
 
18
18
  def invoker_name
19
- invoker && invoker.name
19
+ invoker&.name
20
20
  end
21
21
 
22
22
  def has_invoker?
@@ -26,4 +26,4 @@ module GirFFI
26
26
  end
27
27
  end
28
28
 
29
- GObjectIntrospection::IVFuncInfo.send :include, GirFFI::InfoExt::IVFuncInfo
29
+ GObjectIntrospection::IVFuncInfo.include GirFFI::InfoExt::IVFuncInfo
@@ -5,10 +5,10 @@ module GirFFI
5
5
  # Extension module provinding a #safe_name method suitable for types.
6
6
  module SafeConstantName
7
7
  def safe_name
8
- name.tr('-', '_').gsub(/^./) do |char|
8
+ name.tr("-", "_").sub(/^[_a-z]/) do |char|
9
9
  case char
10
- when '_'
11
- 'Private___'
10
+ when "_"
11
+ "Private___"
12
12
  else
13
13
  char.upcase
14
14
  end
@@ -18,8 +18,8 @@ module GirFFI
18
18
  end
19
19
  end
20
20
 
21
- GObjectIntrospection::ICallbackInfo.send :include, GirFFI::InfoExt::SafeConstantName
22
- GObjectIntrospection::IConstantInfo.send :include, GirFFI::InfoExt::SafeConstantName
23
- GObjectIntrospection::IRegisteredTypeInfo.send :include, GirFFI::InfoExt::SafeConstantName
24
- GObjectIntrospection::ISignalInfo.send :include, GirFFI::InfoExt::SafeConstantName
25
- GObjectIntrospection::IVFuncInfo.send :include, GirFFI::InfoExt::SafeConstantName
21
+ GObjectIntrospection::ICallbackInfo.include GirFFI::InfoExt::SafeConstantName
22
+ GObjectIntrospection::IConstantInfo.include GirFFI::InfoExt::SafeConstantName
23
+ GObjectIntrospection::IRegisteredTypeInfo.include GirFFI::InfoExt::SafeConstantName
24
+ GObjectIntrospection::ISignalInfo.include GirFFI::InfoExt::SafeConstantName
25
+ GObjectIntrospection::IVFuncInfo.include GirFFI::InfoExt::SafeConstantName
@@ -6,7 +6,7 @@ module GirFFI
6
6
  module SafeFunctionName
7
7
  def safe_name
8
8
  name = self.name
9
- return '_' if name.empty?
9
+ return "_" if name.empty?
10
10
 
11
11
  name
12
12
  end
@@ -14,4 +14,4 @@ module GirFFI
14
14
  end
15
15
  end
16
16
 
17
- GObjectIntrospection::IFunctionInfo.send :include, GirFFI::InfoExt::SafeFunctionName
17
+ GObjectIntrospection::IFunctionInfo.include GirFFI::InfoExt::SafeFunctionName
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'gir_ffi/registered_type_base'
4
- require 'gir_ffi/method_setup'
5
- require 'gir_ffi/instance_method_setup'
3
+ require "gir_ffi/registered_type_base"
4
+ require "gir_ffi/method_setup"
5
+ require "gir_ffi/instance_method_setup"
6
6
 
7
7
  module GirFFI
8
8
  # Base module for modules representing GLib interfaces.
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'ffi'
3
+ require "ffi"
4
4
 
5
5
  module GirFFI
6
6
  # Library of libc functions.
@@ -9,7 +9,7 @@ module GirFFI
9
9
  end
10
10
 
11
11
  def method_stub
12
- <<-STUB.reset_indentation
12
+ <<~STUB
13
13
  def #{@info.method? ? '' : 'self.'}#{@info.safe_name} *args, &block
14
14
  setup_and_call "#{@info.name}", args, &block
15
15
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'gir_ffi/method_setup'
3
+ require "gir_ffi/method_setup"
4
4
 
5
5
  module GirFFI
6
6
  # Base module for modules representing GLib namespaces.
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'gir_ffi/class_base'
3
+ require "gir_ffi/class_base"
4
4
 
5
5
  module GirFFI
6
6
  # Base class for all generated classes of type :object.
@@ -38,7 +38,7 @@ module GirFFI
38
38
  end
39
39
 
40
40
  def self.copy_from(val)
41
- val.ref if val
41
+ val&.ref
42
42
  end
43
43
 
44
44
  #
@@ -49,8 +49,7 @@ module GirFFI
49
49
  # @return [GObjectIntrospection::IPropertyInfo] The property's info
50
50
  #
51
51
  def self.find_property(name)
52
- gir_ffi_builder.find_property name or
53
- raise GirFFI::PropertyNotFoundError.new(name, self)
52
+ gir_ffi_builder.find_property name
54
53
  end
55
54
 
56
55
  #
@@ -82,5 +81,32 @@ module GirFFI
82
81
  it < GirFFI::ObjectBase || it.singleton_class.include?(InterfaceBase)
83
82
  end
84
83
  end
84
+
85
+ def self.prepare_user_defined_class
86
+ return if const_defined? :GIR_INFO, false
87
+
88
+ info = UserDefinedObjectInfo.new(self)
89
+ const_set :GIR_INFO, info
90
+ end
91
+
92
+ def self.install_property(param_spec)
93
+ if const_defined? :GIR_FFI_BUILDER, false
94
+ raise "Installing a property in a class that is already set up is not supported"
95
+ end
96
+
97
+ prepare_user_defined_class
98
+
99
+ gir_info.install_property(param_spec)
100
+ end
101
+
102
+ def self.install_vfunc_implementation(name, implementation = nil)
103
+ if const_defined? :GIR_FFI_BUILDER, false
104
+ raise "Installing a property in a class that is already set up is not supported"
105
+ end
106
+
107
+ prepare_user_defined_class
108
+
109
+ gir_info.install_vfunc_implementation(name, implementation)
110
+ end
85
111
  end
86
112
  end
@@ -21,7 +21,7 @@ module GirFFI
21
21
  end
22
22
 
23
23
  def name
24
- '_instance'
24
+ "_instance"
25
25
  end
26
26
  end
27
27
  end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GirFFI
4
- # Represents the type of the receiver of a signal or vfunc, conforming, as
5
- # needed, to the interface of GObjectIntrospection::ITypeInfo
4
+ # Represents the type of the receiver of a signal, vfunc, or method,
5
+ # conforming, as needed, to the interface of GObjectIntrospection::ITypeInfo
6
6
  class ReceiverTypeInfo
7
7
  include InfoExt::ITypeInfo
8
8
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'gir_ffi/type_base'
3
+ require "gir_ffi/type_base"
4
4
 
5
5
  module GirFFI
6
6
  # Base module for generated registered GLib types (these are types that have a
@@ -3,8 +3,7 @@
3
3
  module GirFFI
4
4
  # Represents a return value with the same interface as IArgInfo
5
5
  class ReturnValueInfo
6
- attr_reader :argument_type
7
- attr_reader :ownership_transfer
6
+ attr_reader :argument_type, :ownership_transfer
8
7
 
9
8
  def initialize(type, ownership_transfer, skip)
10
9
  @argument_type = type
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "gir_ffi/array_element_convertor"
4
+
3
5
  module GirFFI
4
6
  # Class representing an array with a determined size
5
7
  class SizedArray
@@ -17,8 +19,8 @@ module GirFFI
17
19
  end
18
20
 
19
21
  def index(idx)
20
- ptr = InOutPointer.new element_type, @pointer + idx * element_size
21
- ptr.to_ruby_value
22
+ convertor = ArrayElementConvertor.new element_type, @pointer + idx * element_size
23
+ convertor.to_ruby_value
22
24
  end
23
25
 
24
26
  def each
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'gir_ffi/ownable'
3
+ require "gir_ffi/ownable"
4
4
 
5
5
  module GirFFI
6
6
  # Struct that can be owned.
@@ -1,17 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'gir_ffi/struct_like_base'
3
+ require "gir_ffi/struct_like_base"
4
4
 
5
5
  module GirFFI
6
6
  # Base class for generated classes representing GLib structs.
7
- class StructBase < ClassBase
8
- extend FFI::DataConverter
9
- include GirFFI::StructLikeBase
10
-
11
- def initialize
12
- @struct = self.class::Struct.new
13
- @struct.owned = true
14
- @struct.to_ptr.autorelease = false
15
- end
7
+ class StructBase < StructLikeBase
16
8
  end
17
9
  end
@@ -1,15 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GirFFI
4
- # Base module providing class methods for generated classes representing GLib
4
+ # Base class providing methods for generated classes representing GLib
5
5
  # structs, unions and boxed types.
6
- module StructLikeBase
7
- def self.included(base)
8
- base.extend ClassMethods
6
+ class StructLikeBase < ClassBase
7
+ extend FFI::DataConverter
8
+
9
+ def initialize
10
+ store_pointer(nil)
11
+ struct.owned = true
12
+ struct.to_ptr.autorelease = false
9
13
  end
10
14
 
11
15
  # Class methods for struct-like classes.
12
- module ClassMethods
16
+ class << self
13
17
  def native_type
14
18
  FFI::Type::Struct.new(self::Struct)
15
19
  end