gir_ffi 0.14.0 → 0.15.3

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 (265) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +45 -0
  3. data/Gemfile +6 -4
  4. data/README.md +11 -10
  5. data/Rakefile +5 -5
  6. data/lib/ffi-glib.rb +16 -16
  7. data/lib/ffi-glib/array.rb +14 -4
  8. data/lib/ffi-glib/byte_array.rb +7 -2
  9. data/lib/ffi-glib/container_class_methods.rb +1 -1
  10. data/lib/ffi-glib/error.rb +1 -1
  11. data/lib/ffi-glib/hash_table.rb +3 -3
  12. data/lib/ffi-glib/list.rb +1 -1
  13. data/lib/ffi-glib/list_methods.rb +1 -1
  14. data/lib/ffi-glib/main_loop.rb +3 -3
  15. data/lib/ffi-glib/ptr_array.rb +30 -8
  16. data/lib/ffi-glib/s_list.rb +1 -1
  17. data/lib/ffi-glib/variant.rb +1 -1
  18. data/lib/ffi-gobject.rb +13 -13
  19. data/lib/ffi-gobject/object.rb +23 -32
  20. data/lib/ffi-gobject/param_spec.rb +1 -1
  21. data/lib/ffi-gobject/ruby_closure.rb +2 -2
  22. data/lib/ffi-gobject/value.rb +40 -29
  23. data/lib/ffi-gobject_introspection.rb +20 -20
  24. data/lib/ffi-gobject_introspection/gobject_type_init.rb +2 -2
  25. data/lib/ffi-gobject_introspection/i_arg_info.rb +2 -2
  26. data/lib/ffi-gobject_introspection/i_base_info.rb +27 -17
  27. data/lib/ffi-gobject_introspection/i_callable_info.rb +4 -4
  28. data/lib/ffi-gobject_introspection/i_constant_info.rb +2 -2
  29. data/lib/ffi-gobject_introspection/i_enum_info.rb +1 -0
  30. data/lib/ffi-gobject_introspection/i_field_info.rb +1 -1
  31. data/lib/ffi-gobject_introspection/i_function_info.rb +1 -1
  32. data/lib/ffi-gobject_introspection/i_interface_info.rb +1 -1
  33. data/lib/ffi-gobject_introspection/i_object_info.rb +2 -2
  34. data/lib/ffi-gobject_introspection/i_property_info.rb +2 -2
  35. data/lib/ffi-gobject_introspection/i_repository.rb +9 -6
  36. data/lib/ffi-gobject_introspection/i_struct_info.rb +2 -1
  37. data/lib/ffi-gobject_introspection/i_type_info.rb +13 -7
  38. data/lib/ffi-gobject_introspection/i_unresolved_info.rb +1 -1
  39. data/lib/ffi-gobject_introspection/i_vfunc_info.rb +1 -1
  40. data/lib/ffi-gobject_introspection/lib.rb +30 -19
  41. data/lib/ffi-gobject_introspection/strv.rb +1 -1
  42. data/lib/gir_ffi-base.rb +1 -1
  43. data/lib/gir_ffi-base/gobject.rb +26 -25
  44. data/lib/gir_ffi-base/gobject/lib.rb +3 -2
  45. data/lib/gir_ffi.rb +3 -3
  46. data/lib/gir_ffi/allocation_helper.rb +1 -1
  47. data/lib/gir_ffi/arg_helper.rb +4 -4
  48. data/lib/gir_ffi/{in_out_pointer.rb → array_element_convertor.rb} +16 -23
  49. data/lib/gir_ffi/boolean.rb +1 -1
  50. data/lib/gir_ffi/boxed_base.rb +1 -1
  51. data/lib/gir_ffi/builder.rb +18 -10
  52. data/lib/gir_ffi/builder_helper.rb +6 -1
  53. data/lib/gir_ffi/builders/argument_builder.rb +19 -19
  54. data/lib/gir_ffi/builders/argument_builder_collection.rb +2 -2
  55. data/lib/gir_ffi/builders/base_argument_builder.rb +1 -0
  56. data/lib/gir_ffi/builders/base_method_builder.rb +7 -7
  57. data/lib/gir_ffi/builders/base_return_value_builder.rb +1 -1
  58. data/lib/gir_ffi/builders/base_type_builder.rb +1 -1
  59. data/lib/gir_ffi/builders/c_to_ruby_convertor.rb +5 -5
  60. data/lib/gir_ffi/builders/callback_argument_builder.rb +8 -8
  61. data/lib/gir_ffi/builders/callback_builder.rb +16 -4
  62. data/lib/gir_ffi/builders/callback_return_value_builder.rb +2 -2
  63. data/lib/gir_ffi/builders/closure_argument_builder.rb +1 -1
  64. data/lib/gir_ffi/builders/closure_return_value_builder.rb +1 -1
  65. data/lib/gir_ffi/builders/constant_builder.rb +1 -1
  66. data/lib/gir_ffi/builders/constructor_builder.rb +9 -9
  67. data/lib/gir_ffi/builders/enum_builder.rb +16 -3
  68. data/lib/gir_ffi/builders/field_builder.rb +20 -18
  69. data/lib/gir_ffi/builders/flags_builder.rb +2 -2
  70. data/lib/gir_ffi/builders/full_c_to_ruby_convertor.rb +1 -1
  71. data/lib/gir_ffi/builders/function_builder.rb +11 -5
  72. data/lib/gir_ffi/builders/initializer_builder.rb +3 -3
  73. data/lib/gir_ffi/builders/initializer_return_value_builder.rb +2 -2
  74. data/lib/gir_ffi/builders/interface_builder.rb +2 -2
  75. data/lib/gir_ffi/builders/mapping_method_builder.rb +9 -9
  76. data/lib/gir_ffi/builders/marshalling_method_builder.rb +7 -7
  77. data/lib/gir_ffi/builders/method_template.rb +1 -1
  78. data/lib/gir_ffi/builders/module_builder.rb +7 -7
  79. data/lib/gir_ffi/builders/object_builder.rb +6 -6
  80. data/lib/gir_ffi/builders/property_argument_builder.rb +1 -1
  81. data/lib/gir_ffi/builders/property_builder.rb +13 -12
  82. data/lib/gir_ffi/builders/property_return_value_builder.rb +1 -1
  83. data/lib/gir_ffi/builders/registered_type_builder.rb +14 -5
  84. data/lib/gir_ffi/builders/return_value_builder.rb +4 -4
  85. data/lib/gir_ffi/builders/ruby_to_c_convertor.rb +6 -6
  86. data/lib/gir_ffi/builders/signal_closure_builder.rb +2 -2
  87. data/lib/gir_ffi/builders/struct_builder.rb +6 -4
  88. data/lib/gir_ffi/builders/struct_like.rb +1 -1
  89. data/lib/gir_ffi/builders/type_builder.rb +12 -12
  90. data/lib/gir_ffi/builders/unintrospectable_boxed_builder.rb +2 -2
  91. data/lib/gir_ffi/builders/unintrospectable_builder.rb +2 -2
  92. data/lib/gir_ffi/builders/union_builder.rb +4 -4
  93. data/lib/gir_ffi/builders/user_defined_builder.rb +2 -2
  94. data/lib/gir_ffi/builders/vfunc_argument_builder.rb +1 -1
  95. data/lib/gir_ffi/builders/vfunc_builder.rb +8 -8
  96. data/lib/gir_ffi/builders/with_layout.rb +2 -2
  97. data/lib/gir_ffi/callback_base.rb +4 -6
  98. data/lib/gir_ffi/class_base.rb +6 -5
  99. data/lib/gir_ffi/core.rb +19 -20
  100. data/lib/gir_ffi/enum_base.rb +1 -1
  101. data/lib/gir_ffi/enum_like_base.rb +2 -2
  102. data/lib/gir_ffi/error_argument_info.rb +2 -2
  103. data/lib/gir_ffi/error_type_info.rb +1 -1
  104. data/lib/gir_ffi/ffi_ext.rb +1 -1
  105. data/lib/gir_ffi/ffi_ext/pointer.rb +1 -1
  106. data/lib/gir_ffi/flags_base.rb +1 -1
  107. data/lib/gir_ffi/in_pointer.rb +10 -0
  108. data/lib/gir_ffi/info_ext.rb +15 -14
  109. data/lib/gir_ffi/info_ext/full_type_name.rb +3 -3
  110. data/lib/gir_ffi/info_ext/i_arg_info.rb +1 -1
  111. data/lib/gir_ffi/info_ext/i_callable_info.rb +1 -1
  112. data/lib/gir_ffi/info_ext/i_callback_info.rb +1 -1
  113. data/lib/gir_ffi/info_ext/i_field_info.rb +1 -1
  114. data/lib/gir_ffi/info_ext/i_function_info.rb +1 -1
  115. data/lib/gir_ffi/info_ext/i_property_info.rb +2 -2
  116. data/lib/gir_ffi/info_ext/i_registered_type_info.rb +4 -5
  117. data/lib/gir_ffi/info_ext/i_signal_info.rb +7 -3
  118. data/lib/gir_ffi/info_ext/i_type_info.rb +48 -26
  119. data/lib/gir_ffi/info_ext/i_unresolved_info.rb +1 -1
  120. data/lib/gir_ffi/info_ext/i_value_info.rb +25 -0
  121. data/lib/gir_ffi/info_ext/i_vfunc_info.rb +2 -2
  122. data/lib/gir_ffi/info_ext/safe_constant_name.rb +8 -8
  123. data/lib/gir_ffi/info_ext/safe_function_name.rb +2 -2
  124. data/lib/gir_ffi/interface_base.rb +3 -3
  125. data/lib/gir_ffi/lib_c.rb +1 -1
  126. data/lib/gir_ffi/method_stubber.rb +1 -1
  127. data/lib/gir_ffi/module_base.rb +1 -1
  128. data/lib/gir_ffi/object_base.rb +3 -4
  129. data/lib/gir_ffi/receiver_argument_info.rb +1 -1
  130. data/lib/gir_ffi/receiver_type_info.rb +2 -2
  131. data/lib/gir_ffi/registered_type_base.rb +1 -1
  132. data/lib/gir_ffi/sized_array.rb +4 -2
  133. data/lib/gir_ffi/struct.rb +1 -1
  134. data/lib/gir_ffi/struct_base.rb +1 -1
  135. data/lib/gir_ffi/type_map.rb +2 -23
  136. data/lib/gir_ffi/unintrospectable_boxed_info.rb +2 -2
  137. data/lib/gir_ffi/unintrospectable_type_info.rb +5 -1
  138. data/lib/gir_ffi/union.rb +1 -1
  139. data/lib/gir_ffi/union_base.rb +1 -1
  140. data/lib/gir_ffi/user_defined_object_info.rb +6 -2
  141. data/lib/gir_ffi/user_defined_property_info.rb +33 -33
  142. data/lib/gir_ffi/version.rb +1 -1
  143. data/tasks/test.rake +3 -2
  144. data/test/base_test_helper.rb +16 -9
  145. data/test/ffi-glib/array_test.rb +71 -56
  146. data/test/ffi-glib/byte_array_test.rb +13 -7
  147. data/test/ffi-glib/bytes_test.rb +24 -19
  148. data/test/ffi-glib/closure_test.rb +11 -11
  149. data/test/ffi-glib/destroy_notify_test.rb +6 -6
  150. data/test/ffi-glib/hash_table_test.rb +27 -27
  151. data/test/ffi-glib/list_test.rb +22 -22
  152. data/test/ffi-glib/main_loop_test.rb +12 -12
  153. data/test/ffi-glib/ptr_array_test.rb +39 -39
  154. data/test/ffi-glib/ruby_closure_test.rb +10 -10
  155. data/test/ffi-glib/s_list_test.rb +20 -20
  156. data/test/ffi-glib/strv_test.rb +19 -19
  157. data/test/ffi-glib/variant_test.rb +5 -5
  158. data/test/ffi-gobject/gobject_test.rb +48 -44
  159. data/test/ffi-gobject/object_class_test.rb +8 -8
  160. data/test/ffi-gobject/object_test.rb +51 -68
  161. data/test/ffi-gobject/param_spec_test.rb +12 -12
  162. data/test/ffi-gobject/value_test.rb +145 -125
  163. data/test/ffi-gobject_introspection/gobject_type_init_test.rb +9 -9
  164. data/test/ffi-gobject_introspection/i_base_info_test.rb +15 -16
  165. data/test/ffi-gobject_introspection/i_constant_info_test.rb +9 -13
  166. data/test/ffi-gobject_introspection/i_enum_info_test.rb +7 -7
  167. data/test/ffi-gobject_introspection/i_function_info_test.rb +1 -1
  168. data/test/ffi-gobject_introspection/i_interface_info_test.rb +10 -10
  169. data/test/ffi-gobject_introspection/i_object_info_test.rb +23 -23
  170. data/test/ffi-gobject_introspection/i_property_info_test.rb +19 -19
  171. data/test/ffi-gobject_introspection/i_registered_type_info_test.rb +10 -10
  172. data/test/ffi-gobject_introspection/i_repository_test.rb +34 -34
  173. data/test/ffi-gobject_introspection/i_struct_info_test.rb +10 -10
  174. data/test/ffi-gobject_introspection/i_type_info_test.rb +12 -15
  175. data/test/ffi-gobject_introspection/i_union_info_test.rb +7 -7
  176. data/test/ffi-gobject_introspection/i_vfunc_info_test.rb +16 -16
  177. data/test/ffi-gobject_introspection/lib_test.rb +3 -3
  178. data/test/ffi-gobject_introspection/strv_test.rb +9 -9
  179. data/test/ffi-gobject_test.rb +47 -45
  180. data/test/gir_ffi/allocation_helper_test.rb +13 -13
  181. data/test/gir_ffi/arg_helper_test.rb +71 -65
  182. data/test/gir_ffi/boolean_test.rb +20 -20
  183. data/test/gir_ffi/boxed_base_test.rb +18 -18
  184. data/test/gir_ffi/builder_test.rb +81 -213
  185. data/test/gir_ffi/builders/argument_builder_test.rb +321 -287
  186. data/test/gir_ffi/builders/base_argument_builder_test.rb +1 -1
  187. data/test/gir_ffi/builders/callback_argument_builder_test.rb +57 -56
  188. data/test/gir_ffi/builders/callback_builder_test.rb +71 -72
  189. data/test/gir_ffi/builders/callback_return_value_builder_test.rb +40 -41
  190. data/test/gir_ffi/builders/constant_builder_test.rb +1 -1
  191. data/test/gir_ffi/builders/constructor_builder_test.rb +12 -10
  192. data/test/gir_ffi/builders/enum_builder_test.rb +12 -11
  193. data/test/gir_ffi/builders/field_builder_test.rb +48 -42
  194. data/test/gir_ffi/builders/function_builder_test.rb +256 -224
  195. data/test/gir_ffi/builders/initializer_builder_test.rb +16 -14
  196. data/test/gir_ffi/builders/interface_builder_test.rb +9 -9
  197. data/test/gir_ffi/builders/module_builder_test.rb +18 -18
  198. data/test/gir_ffi/builders/object_builder_test.rb +41 -41
  199. data/test/gir_ffi/builders/property_builder_test.rb +94 -94
  200. data/test/gir_ffi/builders/registered_type_builder_test.rb +35 -11
  201. data/test/gir_ffi/builders/return_value_builder_test.rb +227 -223
  202. data/test/gir_ffi/builders/signal_closure_builder_test.rb +124 -113
  203. data/test/gir_ffi/builders/struct_builder_test.rb +38 -35
  204. data/test/gir_ffi/builders/unintrospectable_boxed_builder_test.rb +8 -14
  205. data/test/gir_ffi/builders/unintrospectable_builder_test.rb +34 -23
  206. data/test/gir_ffi/builders/union_builder_test.rb +12 -15
  207. data/test/gir_ffi/builders/user_defined_builder_test.rb +152 -148
  208. data/test/gir_ffi/builders/vfunc_argument_builder_test.rb +46 -40
  209. data/test/gir_ffi/builders/vfunc_builder_test.rb +149 -157
  210. data/test/gir_ffi/callback_base_test.rb +9 -9
  211. data/test/gir_ffi/class_base_test.rb +56 -53
  212. data/test/gir_ffi/core_test.rb +36 -35
  213. data/test/gir_ffi/enum_base_test.rb +19 -19
  214. data/test/gir_ffi/error_type_info_test.rb +23 -23
  215. data/test/gir_ffi/ffi_ext/pointer_test.rb +9 -7
  216. data/test/gir_ffi/g_type_test.rb +11 -11
  217. data/test/gir_ffi/in_pointer_test.rb +70 -50
  218. data/test/gir_ffi/info_ext/i_callable_info_test.rb +5 -5
  219. data/test/gir_ffi/info_ext/i_callback_info_test.rb +6 -5
  220. data/test/gir_ffi/info_ext/i_field_info_test.rb +6 -6
  221. data/test/gir_ffi/info_ext/i_function_info_test.rb +17 -17
  222. data/test/gir_ffi/info_ext/i_signal_info_test.rb +8 -8
  223. data/test/gir_ffi/info_ext/i_type_info_test.rb +231 -216
  224. data/test/gir_ffi/info_ext/i_unresolved_info_test.rb +4 -4
  225. data/test/gir_ffi/info_ext/safe_constant_name_test.rb +8 -8
  226. data/test/gir_ffi/info_ext/safe_function_name_test.rb +8 -8
  227. data/test/gir_ffi/interface_base_test.rb +8 -8
  228. data/test/gir_ffi/method_stubber_test.rb +21 -19
  229. data/test/gir_ffi/object_base_test.rb +23 -23
  230. data/test/gir_ffi/object_store_test.rb +13 -13
  231. data/test/gir_ffi/receiver_argument_info_test.rb +15 -15
  232. data/test/gir_ffi/sized_array_test.rb +68 -68
  233. data/test/gir_ffi/struct_base_test.rb +8 -8
  234. data/test/gir_ffi/struct_like_base_test.rb +64 -64
  235. data/test/gir_ffi/type_map_test.rb +8 -8
  236. data/test/gir_ffi/unintrospectable_type_info_test.rb +33 -33
  237. data/test/gir_ffi/union_base_test.rb +8 -8
  238. data/test/gir_ffi/user_defined_object_info_test.rb +34 -34
  239. data/test/gir_ffi/user_defined_property_info_test.rb +16 -16
  240. data/test/gir_ffi/variable_name_generator_test.rb +8 -8
  241. data/test/gir_ffi/version_test.rb +4 -4
  242. data/test/gir_ffi/zero_terminated_test.rb +34 -34
  243. data/test/gir_ffi_test_helper.rb +3 -3
  244. data/test/integration/callback_exceptions_test.rb +17 -21
  245. data/test/integration/derived_classes_test.rb +14 -13
  246. data/test/integration/generated_everything_test.rb +225 -224
  247. data/test/integration/generated_gimarshallingtests_test.rb +1174 -1060
  248. data/test/integration/generated_gio_test.rb +36 -36
  249. data/test/integration/generated_glib_test.rb +4 -6
  250. data/test/integration/generated_gobject_test.rb +43 -35
  251. data/test/integration/generated_gst_test.rb +20 -16
  252. data/test/integration/generated_gtk_source_test.rb +9 -15
  253. data/test/integration/generated_gtop_test.rb +8 -15
  254. data/test/integration/generated_pango_ft2_test.rb +2 -2
  255. data/test/integration/generated_pango_test.rb +4 -4
  256. data/test/integration/generated_regress_test.rb +1858 -1632
  257. data/test/integration/generated_secret_test.rb +8 -11
  258. data/test/integration/generated_utility_test.rb +81 -81
  259. data/test/integration/generated_warnlib_test.rb +17 -21
  260. data/test/integration/method_lookup_test.rb +6 -6
  261. data/test/introspection_test_helper.rb +49 -7
  262. data/test/minitest/stats_plugin.rb +1 -1
  263. metadata +21 -23
  264. data/lib/ffi-glib/array_methods.rb +0 -16
  265. data/test/gir_ffi/in_out_pointer_test.rb +0 -56
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'gir_ffi/property_not_found_error'
3
+ require "gir_ffi/property_not_found_error"
4
4
 
5
5
  GObject.load_class :Object
6
6
 
@@ -44,7 +44,7 @@ module GObject
44
44
  obj
45
45
  end
46
46
  else
47
- setup_method! 'new'
47
+ setup_method! "new"
48
48
 
49
49
  # Before GLib 2.54.0, use g_object_newv, which takes an array of GParameter.
50
50
  def initialize_with_automatic_gtype(properties = {})
@@ -90,22 +90,6 @@ module GObject
90
90
  end
91
91
  end
92
92
 
93
- # TODO: Generate accessor methods from GIR at class definition time
94
- def method_missing(method, *args)
95
- getter_name = "get_#{method}"
96
- return send(getter_name, *args) if respond_to?(getter_name)
97
-
98
- if method.to_s =~ /(.*)=$/
99
- setter_name = "set_#{Regexp.last_match[1]}"
100
- return send(setter_name, *args) if respond_to?(setter_name)
101
- end
102
- super
103
- end
104
-
105
- def respond_to_missing?(*)
106
- false
107
- end
108
-
109
93
  def signal_connect(event, data = nil, &block)
110
94
  GObject.signal_connect(self, event, data, &block)
111
95
  end
@@ -114,30 +98,37 @@ module GObject
114
98
  GObject.signal_connect_after(self, event, data, &block)
115
99
  end
116
100
 
117
- setup_instance_method! 'get_property'
118
- setup_instance_method! 'set_property'
101
+ setup_instance_method! "get_property"
102
+ setup_instance_method! "set_property"
119
103
 
104
+ # @deprecated
120
105
  def get_property_extended(property_name)
121
- value = get_property(property_name)
122
- type_info = get_property_type property_name
123
- property_value_post_conversion value, type_info
106
+ get_property(property_name)
124
107
  end
125
108
 
126
109
  def get_property_with_override(property_name)
127
110
  gvalue = gvalue_for_property property_name
128
111
  get_property_without_override property_name, gvalue
129
- gvalue.get_value
112
+ value = gvalue.get_value
113
+
114
+ type_info = get_property_type property_name
115
+ value = property_value_post_conversion(value, type_info) if type_info
116
+
117
+ value
130
118
  end
131
119
 
120
+ # @deprecated
132
121
  def set_property_extended(property_name, value)
133
- type_info = get_property_type property_name
134
- adjusted_value = property_value_pre_conversion(value, type_info)
135
- set_property property_name, adjusted_value
122
+ set_property property_name, value
136
123
  end
137
124
 
138
125
  def set_property_with_override(property_name, value)
126
+ type_info = get_property_type property_name
127
+ value = property_value_pre_conversion(value, type_info) if type_info
128
+
139
129
  gvalue = gvalue_for_property(property_name)
140
130
  gvalue.set_value value
131
+
141
132
  set_property_without_override property_name, gvalue
142
133
  end
143
134
 
@@ -147,7 +138,7 @@ module GObject
147
138
  alias set_property_without_override set_property
148
139
  alias set_property set_property_with_override
149
140
 
150
- setup_instance_method! 'is_floating'
141
+ setup_instance_method! "is_floating"
151
142
  alias floating? is_floating
152
143
 
153
144
  private
@@ -165,8 +156,7 @@ module GObject
165
156
  end
166
157
 
167
158
  def get_property_type(property_name)
168
- prop = self.class.find_property(property_name)
169
- prop.property_type
159
+ self.class.find_property(property_name)&.property_type
170
160
  end
171
161
 
172
162
  def gvalue_for_property(property_name)
@@ -175,8 +165,7 @@ module GObject
175
165
  end
176
166
 
177
167
  def property_gtype(property_name)
178
- pspec = property_param_spec(property_name)
179
- pspec.value_type
168
+ property_param_spec(property_name).value_type
180
169
  end
181
170
 
182
171
  def property_param_spec(property_name)
@@ -207,6 +196,8 @@ module GObject
207
196
  GLib::List.from type_info.element_type, val
208
197
  when :strv
209
198
  GLib::Strv.from val
199
+ when :byte_array
200
+ GLib::ByteArray.from val
210
201
  when :callback
211
202
  GirFFI::Builder.build_class(type_info.interface).from val
212
203
  else
@@ -14,7 +14,7 @@ module GObject
14
14
  end
15
15
 
16
16
  def accessor_name
17
- get_name.tr('-', '_')
17
+ get_name.tr("-", "_")
18
18
  end
19
19
 
20
20
  def value_type
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'ffi-gobject/closure'
3
+ require "ffi-gobject/closure"
4
4
 
5
5
  module GObject
6
6
  # Encapsulates Ruby blocks as GObject Closures.
@@ -36,7 +36,7 @@ module GObject
36
36
 
37
37
  result = rclosure.invoke_block(*args)
38
38
 
39
- return_value.set_value(result) if return_value
39
+ return_value&.set_value(result)
40
40
  end
41
41
 
42
42
  # @api private
@@ -29,29 +29,29 @@ module GObject
29
29
  end
30
30
 
31
31
  METHOD_MAP = {
32
- TYPE_INVALID => [:get_none, :set_none],
32
+ TYPE_INVALID => [:get_none, :set_none],
33
33
  # TYPE_NONE is skipped
34
- TYPE_INTERFACE => [:get_object, :set_instance_enhanced],
35
- TYPE_CHAR => [:get_schar, :set_schar],
36
- TYPE_UCHAR => [:get_uchar, :set_uchar],
37
- TYPE_BOOLEAN => [:get_boolean, :set_boolean],
38
- TYPE_INT => [:get_int, :set_int],
39
- TYPE_UINT => [:get_uint, :set_uint],
40
- TYPE_LONG => [:get_long, :set_long],
41
- TYPE_ULONG => [:get_ulong, :set_ulong],
42
- TYPE_INT64 => [:get_int64, :set_int64],
43
- TYPE_UINT64 => [:get_uint64, :set_uint64],
44
- TYPE_ENUM => [:get_enum_enhanced, :set_enum_enhanced],
45
- TYPE_FLAGS => [:get_flags, :set_flags],
46
- TYPE_FLOAT => [:get_float, :set_float],
47
- TYPE_DOUBLE => [:get_double, :set_double],
48
- TYPE_STRING => [:get_string, :set_string],
49
- TYPE_POINTER => [:get_pointer, :set_pointer],
50
- TYPE_BOXED => [:get_boxed, :set_boxed],
51
- TYPE_PARAM => [:get_param, :set_param],
52
- TYPE_OBJECT => [:get_object, :set_instance_enhanced],
53
- TYPE_GTYPE => [:get_gtype, :set_gtype],
54
- TYPE_VARIANT => [:get_variant, :set_variant]
34
+ TYPE_INTERFACE => [:get_object, :set_instance_enhanced],
35
+ TYPE_CHAR => [:get_schar, :set_schar],
36
+ TYPE_UCHAR => [:get_uchar, :set_uchar],
37
+ TYPE_BOOLEAN => [:get_boolean, :set_boolean],
38
+ TYPE_INT => [:get_int, :set_int],
39
+ TYPE_UINT => [:get_uint, :set_uint],
40
+ TYPE_LONG => [:get_long, :set_long],
41
+ TYPE_ULONG => [:get_ulong, :set_ulong],
42
+ TYPE_INT64 => [:get_int64, :set_int64],
43
+ TYPE_UINT64 => [:get_uint64, :set_uint64],
44
+ TYPE_ENUM => [:get_enum_enhanced, :set_enum_enhanced],
45
+ TYPE_FLAGS => [:get_flags_enhanced, :set_flags_enhanced],
46
+ TYPE_FLOAT => [:get_float, :set_float],
47
+ TYPE_DOUBLE => [:get_double, :set_double],
48
+ TYPE_STRING => [:get_string, :set_string],
49
+ TYPE_POINTER => [:get_pointer, :set_pointer],
50
+ TYPE_BOXED => [:get_boxed, :set_boxed],
51
+ TYPE_PARAM => [:get_param, :set_param],
52
+ TYPE_OBJECT => [:get_object, :set_instance_enhanced],
53
+ TYPE_GTYPE => [:get_gtype, :set_gtype],
54
+ TYPE_VARIANT => [:get_variant, :set_variant]
55
55
  }.freeze
56
56
 
57
57
  def set_value(val)
@@ -131,11 +131,11 @@ module GObject
131
131
  end
132
132
 
133
133
  CLASS_TO_GTYPE_MAP = {
134
- NilClass => TYPE_INVALID,
135
- TrueClass => TYPE_BOOLEAN,
134
+ NilClass => TYPE_INVALID,
135
+ TrueClass => TYPE_BOOLEAN,
136
136
  FalseClass => TYPE_BOOLEAN,
137
- Integer => TYPE_INT,
138
- String => TYPE_STRING
137
+ Integer => TYPE_INT,
138
+ String => TYPE_STRING
139
139
  }.freeze
140
140
 
141
141
  def init_for_ruby_value(val)
@@ -157,7 +157,7 @@ module GObject
157
157
  end
158
158
 
159
159
  def set_enum_enhanced(val)
160
- val = current_gtype_class[val] if val.is_a? Symbol
160
+ val = current_gtype_class.to_native(val, nil)
161
161
  set_enum val
162
162
  end
163
163
 
@@ -165,12 +165,23 @@ module GObject
165
165
  current_gtype_class.wrap(get_enum)
166
166
  end
167
167
 
168
+ def set_flags_enhanced(val)
169
+ val = current_gtype_class.to_native(val, nil)
170
+ set_flags val
171
+ end
172
+
173
+ def get_flags_enhanced
174
+ current_gtype_class.wrap(get_flags)
175
+ end
176
+
168
177
  def current_gtype_class
169
178
  GirFFI::Builder.build_by_gtype(current_gtype)
170
179
  end
171
180
 
172
181
  def check_type_compatibility(val)
173
- return if GObject::Value.type_compatible(GObject.type_from_instance(val), current_gtype)
182
+ if GObject::Value.type_compatible(GObject.type_from_instance(val), current_gtype)
183
+ return
184
+ end
174
185
 
175
186
  raise ArgumentError, "#{val.class} is incompatible with #{current_gtype_name}"
176
187
  end
@@ -198,7 +209,7 @@ module GObject
198
209
 
199
210
  def method_map_entry
200
211
  METHOD_MAP[current_gtype] || METHOD_MAP[current_fundamental_type] ||
201
- raise("No method map entry for #{current_gtype_name}")
212
+ raise("No method map entry for '#{current_gtype_name}'")
202
213
  end
203
214
  end
204
215
  end
@@ -1,26 +1,26 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'ffi-gobject_introspection/gobject_type_init'
3
+ require "ffi-gobject_introspection/gobject_type_init"
4
4
  GObjectIntrospection::GObjectTypeInit.type_init
5
5
 
6
- require 'ffi-gobject_introspection/i_base_info'
7
- require 'ffi-gobject_introspection/i_callable_info'
8
- require 'ffi-gobject_introspection/i_callback_info'
9
- require 'ffi-gobject_introspection/i_function_info'
10
- require 'ffi-gobject_introspection/i_constant_info'
11
- require 'ffi-gobject_introspection/i_field_info'
12
- require 'ffi-gobject_introspection/i_registered_type_info'
13
- require 'ffi-gobject_introspection/i_interface_info'
14
- require 'ffi-gobject_introspection/i_property_info'
15
- require 'ffi-gobject_introspection/i_vfunc_info'
16
- require 'ffi-gobject_introspection/i_signal_info'
17
- require 'ffi-gobject_introspection/i_object_info'
18
- require 'ffi-gobject_introspection/i_struct_info'
19
- require 'ffi-gobject_introspection/i_value_info'
20
- require 'ffi-gobject_introspection/i_union_info'
21
- require 'ffi-gobject_introspection/i_enum_info'
22
- require 'ffi-gobject_introspection/i_flags_info'
23
- require 'ffi-gobject_introspection/i_unresolved_info'
6
+ require "ffi-gobject_introspection/i_base_info"
7
+ require "ffi-gobject_introspection/i_callable_info"
8
+ require "ffi-gobject_introspection/i_callback_info"
9
+ require "ffi-gobject_introspection/i_function_info"
10
+ require "ffi-gobject_introspection/i_constant_info"
11
+ require "ffi-gobject_introspection/i_field_info"
12
+ require "ffi-gobject_introspection/i_registered_type_info"
13
+ require "ffi-gobject_introspection/i_interface_info"
14
+ require "ffi-gobject_introspection/i_property_info"
15
+ require "ffi-gobject_introspection/i_vfunc_info"
16
+ require "ffi-gobject_introspection/i_signal_info"
17
+ require "ffi-gobject_introspection/i_object_info"
18
+ require "ffi-gobject_introspection/i_struct_info"
19
+ require "ffi-gobject_introspection/i_value_info"
20
+ require "ffi-gobject_introspection/i_union_info"
21
+ require "ffi-gobject_introspection/i_enum_info"
22
+ require "ffi-gobject_introspection/i_flags_info"
23
+ require "ffi-gobject_introspection/i_unresolved_info"
24
24
 
25
25
  module GObjectIntrospection
26
26
  # Map info type to class. Default is IBaseInfo.
@@ -49,4 +49,4 @@ module GObjectIntrospection
49
49
  }.freeze
50
50
  end
51
51
 
52
- require 'ffi-gobject_introspection/i_repository'
52
+ require "ffi-gobject_introspection/i_repository"
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'ffi'
3
+ require "ffi"
4
4
 
5
5
  module GObjectIntrospection
6
6
  # Provides access to the g_type_init function.
@@ -12,7 +12,7 @@ module GObjectIntrospection
12
12
  # Module for attaching g_type_init from the gobject library.
13
13
  module Lib
14
14
  extend FFI::Library
15
- ffi_lib 'gobject-2.0'
15
+ ffi_lib "gobject-2.0"
16
16
  attach_function :g_type_init, [], :void
17
17
  end
18
18
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'ffi-gobject_introspection/i_base_info'
3
+ require "ffi-gobject_introspection/i_base_info"
4
4
  module GObjectIntrospection
5
5
  # Wraps a GIArgInfo struct.
6
6
  # Represents an argument.
@@ -46,7 +46,7 @@ module GObjectIntrospection
46
46
  end
47
47
 
48
48
  def argument_type
49
- ITypeInfo.wrap Lib.g_arg_info_get_type(self)
49
+ @argument_type ||= ITypeInfo.wrap Lib.g_arg_info_get_type(self)
50
50
  end
51
51
  end
52
52
  end
@@ -5,7 +5,7 @@ module GObjectIntrospection
5
5
  # Decendant types will be implemented as needed.
6
6
  class IBaseInfo
7
7
  def initialize(ptr, lib = Lib)
8
- raise ArgumentError, 'ptr must not be null' if ptr.null?
8
+ raise ArgumentError, "ptr must not be null" if ptr.null?
9
9
 
10
10
  ObjectSpace.define_finalizer self, self.class.make_finalizer(lib, ptr)
11
11
 
@@ -40,13 +40,15 @@ module GObjectIntrospection
40
40
  #
41
41
  def self.build_array_method(method, single = nil)
42
42
  method = method.to_s
43
+ cache_ivar = "@#{method}_cache"
43
44
  single ||= method[0..-2]
44
45
  count = method.sub(/^(get_)?/, '\\1n_')
45
46
  class_eval <<-CODE, __FILE__, __LINE__ + 1
46
47
  def #{method}
47
- (0..(#{count} - 1)).map do |i|
48
- #{single} i
49
- end
48
+ #{cache_ivar} ||=
49
+ (0..(#{count} - 1)).map do |i|
50
+ #{single} i
51
+ end
50
52
  end
51
53
  CODE
52
54
  end
@@ -69,41 +71,49 @@ module GObjectIntrospection
69
71
  #
70
72
  def self.build_finder_method(method, counter = nil, fetcher = nil)
71
73
  method = method.to_s
72
- single = method.sub(/^find_/, '')
74
+ cache_ivar = "@#{method}_cache"
75
+ single = method.sub(/^find_/, "")
73
76
  counter ||= "n_#{single}s"
74
77
  fetcher ||= single
75
78
  class_eval <<-CODE, __FILE__, __LINE__ + 1
76
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
77
88
  name = name.to_s
78
- #{counter}.times do |i|
79
- it = #{fetcher}(i)
80
- return it if it.name == name
81
- end
82
- nil
89
+ #{cache_ivar}[name]
83
90
  end
84
91
  CODE
85
92
  end
86
93
 
87
94
  def name
88
- Lib.g_base_info_get_name self
95
+ @name ||= Lib.g_base_info_get_name self
89
96
  end
90
97
 
91
98
  def info_type
92
- Lib.g_base_info_get_type self
99
+ @info_type ||= Lib.g_base_info_get_type self
93
100
  end
94
101
 
95
102
  def namespace
96
- Lib.g_base_info_get_namespace self
103
+ @namespace ||= Lib.g_base_info_get_namespace self
97
104
  end
98
105
 
99
106
  def safe_namespace
100
- namespace.gsub(/^./, &:upcase)
107
+ namespace.sub(/^[a-z]/, &:upcase)
101
108
  end
102
109
 
103
110
  def container
104
- ptr = Lib.g_base_info_get_container self
105
- Lib.g_base_info_ref ptr
106
- IRepository.wrap_ibaseinfo_pointer ptr
111
+ @container ||= begin
112
+ ptr = Lib.g_base_info_get_container self
113
+ return if ptr.null?
114
+ Lib.g_base_info_ref ptr
115
+ IRepository.wrap_ibaseinfo_pointer ptr
116
+ end
107
117
  end
108
118
 
109
119
  def deprecated?
@@ -1,15 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'ffi-gobject_introspection/i_base_info'
4
- require 'ffi-gobject_introspection/i_type_info'
5
- require 'ffi-gobject_introspection/i_arg_info'
3
+ require "ffi-gobject_introspection/i_base_info"
4
+ require "ffi-gobject_introspection/i_type_info"
5
+ require "ffi-gobject_introspection/i_arg_info"
6
6
 
7
7
  module GObjectIntrospection
8
8
  # Wraps a GICallableInfo struct; represents a callable, either
9
9
  # IFunctionInfo, ICallbackInfo or IVFuncInfo.
10
10
  class ICallableInfo < IBaseInfo
11
11
  def return_type
12
- ITypeInfo.wrap Lib.g_callable_info_get_return_type(self)
12
+ @return_type ||= ITypeInfo.wrap Lib.g_callable_info_get_return_type(self)
13
13
  end
14
14
 
15
15
  def caller_owns