gir_ffi 0.7.7 → 0.7.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (135) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +9 -0
  3. data/lib/ffi-glib/array.rb +1 -1
  4. data/lib/ffi-glib/error.rb +1 -2
  5. data/lib/ffi-glib/hash_table.rb +2 -2
  6. data/lib/ffi-glib/variant.rb +1 -1
  7. data/lib/ffi-gobject/base.rb +23 -23
  8. data/lib/ffi-gobject/object.rb +7 -3
  9. data/lib/ffi-gobject/value.rb +6 -1
  10. data/lib/ffi-gobject.rb +9 -6
  11. data/lib/ffi-gobject_introspection/i_base_info.rb +3 -3
  12. data/lib/ffi-gobject_introspection/i_constant_info.rb +1 -1
  13. data/lib/ffi-gobject_introspection/i_repository.rb +4 -1
  14. data/lib/ffi-gobject_introspection/i_type_info.rb +1 -1
  15. data/lib/ffi-gobject_introspection/i_unresolved_info.rb +7 -0
  16. data/lib/ffi-gobject_introspection/lib.rb +1 -1
  17. data/lib/gir_ffi/builders/argument_builder.rb +1 -1
  18. data/lib/gir_ffi/builders/c_to_ruby_convertor.rb +37 -29
  19. data/lib/gir_ffi/builders/callback_argument_builder.rb +57 -27
  20. data/lib/gir_ffi/builders/closure_convertor.rb +12 -8
  21. data/lib/gir_ffi/builders/closure_to_pointer_convertor.rb +12 -8
  22. data/lib/gir_ffi/builders/constructor_result_convertor.rb +11 -7
  23. data/lib/gir_ffi/builders/field_builder.rb +1 -1
  24. data/lib/gir_ffi/builders/function_builder.rb +1 -1
  25. data/lib/gir_ffi/builders/mapping_method_builder.rb +1 -1
  26. data/lib/gir_ffi/builders/marshalling_method_builder.rb +2 -2
  27. data/lib/gir_ffi/builders/method_template.rb +1 -1
  28. data/lib/gir_ffi/builders/null_convertor.rb +11 -7
  29. data/lib/gir_ffi/builders/property_builder.rb +1 -1
  30. data/lib/gir_ffi/builders/ruby_to_c_convertor.rb +17 -13
  31. data/lib/gir_ffi/error_argument_info.rb +1 -1
  32. data/lib/gir_ffi/ffi_ext/pointer.rb +1 -1
  33. data/lib/gir_ffi/info_ext/i_unresolved_info.rb +12 -0
  34. data/lib/gir_ffi/info_ext/safe_constant_name.rb +2 -2
  35. data/lib/gir_ffi/info_ext/safe_function_name.rb +1 -1
  36. data/lib/gir_ffi/info_ext.rb +1 -0
  37. data/lib/gir_ffi/module_base.rb +1 -1
  38. data/lib/gir_ffi/receiver_argument_info.rb +15 -12
  39. data/lib/gir_ffi/user_data_argument_info.rb +17 -15
  40. data/lib/gir_ffi/user_data_type_info.rb +14 -12
  41. data/lib/gir_ffi/version.rb +1 -1
  42. data/lib/gir_ffi-base/gobject/lib.rb +1 -1
  43. data/test/base_test_helper.rb +15 -15
  44. data/test/ffi-glib/array_test.rb +38 -38
  45. data/test/ffi-glib/byte_array_test.rb +6 -7
  46. data/test/ffi-glib/bytes_test.rb +9 -9
  47. data/test/ffi-glib/hash_table_test.rb +26 -23
  48. data/test/ffi-glib/iconv_test.rb +5 -5
  49. data/test/ffi-glib/list_test.rb +16 -16
  50. data/test/ffi-glib/main_loop_test.rb +6 -6
  51. data/test/ffi-glib/ptr_array_test.rb +45 -45
  52. data/test/ffi-glib/ruby_closure_test.rb +6 -6
  53. data/test/ffi-glib/s_list_test.rb +15 -15
  54. data/test/ffi-glib/strv_test.rb +21 -21
  55. data/test/ffi-glib/variant_test.rb +4 -4
  56. data/test/ffi-gobject/gobject_test.rb +35 -35
  57. data/test/ffi-gobject/object_class_test.rb +1 -1
  58. data/test/ffi-gobject/object_test.rb +29 -6
  59. data/test/ffi-gobject/value_test.rb +66 -52
  60. data/test/ffi-gobject_introspection/i_base_info_test.rb +10 -11
  61. data/test/ffi-gobject_introspection/i_constant_info_test.rb +6 -6
  62. data/test/ffi-gobject_introspection/i_enum_info_test.rb +4 -5
  63. data/test/ffi-gobject_introspection/i_function_info_test.rb +0 -2
  64. data/test/ffi-gobject_introspection/i_object_info_test.rb +5 -5
  65. data/test/ffi-gobject_introspection/i_registered_type_info_test.rb +9 -8
  66. data/test/ffi-gobject_introspection/i_repository_test.rb +16 -16
  67. data/test/ffi-gobject_introspection/i_type_info_test.rb +16 -2
  68. data/test/ffi-gobject_introspection/lib_test.rb +2 -2
  69. data/test/ffi-gobject_test.rb +50 -40
  70. data/test/gir_ffi/arg_helper_test.rb +5 -5
  71. data/test/gir_ffi/builder_test.rb +41 -41
  72. data/test/gir_ffi/builders/argument_builder_test.rb +240 -207
  73. data/test/gir_ffi/builders/base_argument_builder_test.rb +0 -1
  74. data/test/gir_ffi/builders/callback_argument_builder_test.rb +81 -15
  75. data/test/gir_ffi/builders/callback_builder_test.rb +39 -14
  76. data/test/gir_ffi/builders/callback_return_value_builder_test.rb +41 -33
  77. data/test/gir_ffi/builders/enum_builder_test.rb +3 -3
  78. data/test/gir_ffi/builders/field_builder_test.rb +17 -17
  79. data/test/gir_ffi/builders/function_builder_test.rb +16 -16
  80. data/test/gir_ffi/builders/interface_builder_test.rb +9 -7
  81. data/test/gir_ffi/builders/module_builder_test.rb +5 -6
  82. data/test/gir_ffi/builders/object_builder_test.rb +24 -19
  83. data/test/gir_ffi/builders/property_builder_test.rb +25 -23
  84. data/test/gir_ffi/builders/registered_type_builder_test.rb +11 -11
  85. data/test/gir_ffi/builders/return_value_builder_test.rb +237 -197
  86. data/test/gir_ffi/builders/signal_closure_builder_test.rb +29 -22
  87. data/test/gir_ffi/builders/struct_builder_test.rb +10 -10
  88. data/test/gir_ffi/builders/unintrospectable_builder_test.rb +8 -8
  89. data/test/gir_ffi/builders/union_builder_test.rb +5 -6
  90. data/test/gir_ffi/builders/user_defined_builder_test.rb +42 -33
  91. data/test/gir_ffi/builders/vfunc_builder_test.rb +37 -30
  92. data/test/gir_ffi/callback_base_test.rb +4 -5
  93. data/test/gir_ffi/class_base_test.rb +35 -28
  94. data/test/gir_ffi/error_type_info_test.rb +14 -14
  95. data/test/gir_ffi/ffi_ext/pointer_test.rb +4 -4
  96. data/test/gir_ffi/g_type_test.rb +6 -6
  97. data/test/gir_ffi/in_out_pointer_test.rb +27 -27
  98. data/test/gir_ffi/in_pointer_test.rb +54 -50
  99. data/test/gir_ffi/info_ext/i_callable_info_test.rb +8 -7
  100. data/test/gir_ffi/info_ext/i_callback_info_test.rb +7 -7
  101. data/test/gir_ffi/info_ext/i_field_info_test.rb +10 -8
  102. data/test/gir_ffi/info_ext/i_function_info_test.rb +17 -15
  103. data/test/gir_ffi/info_ext/i_signal_info_test.rb +10 -8
  104. data/test/gir_ffi/info_ext/i_type_info_test.rb +158 -155
  105. data/test/gir_ffi/info_ext/i_unresolved_info_test.rb +17 -0
  106. data/test/gir_ffi/info_ext/safe_constant_name_test.rb +12 -10
  107. data/test/gir_ffi/info_ext/safe_function_name_test.rb +12 -10
  108. data/test/gir_ffi/interface_base_test.rb +6 -6
  109. data/test/gir_ffi/method_stubber_test.rb +16 -13
  110. data/test/gir_ffi/object_base_test.rb +6 -6
  111. data/test/gir_ffi/sized_array_test.rb +23 -23
  112. data/test/gir_ffi/type_map_test.rb +3 -3
  113. data/test/gir_ffi/unintrospectable_type_info_test.rb +18 -18
  114. data/test/gir_ffi/user_defined_property_info_test.rb +4 -4
  115. data/test/gir_ffi/user_defined_type_info_test.rb +16 -16
  116. data/test/gir_ffi/variable_name_generator_test.rb +6 -6
  117. data/test/gir_ffi/version_test.rb +1 -1
  118. data/test/gir_ffi/zero_terminated_test.rb +16 -17
  119. data/test/gir_ffi-base/glib/boolean_test.rb +13 -13
  120. data/test/gir_ffi-base/glib/strv_test.rb +11 -11
  121. data/test/gir_ffi_test.rb +18 -18
  122. data/test/gir_ffi_test_helper.rb +13 -18
  123. data/test/integration/derived_classes_test.rb +8 -8
  124. data/test/integration/generated_gimarshallingtests_test.rb +794 -792
  125. data/test/integration/generated_gio_test.rb +25 -26
  126. data/test/integration/generated_glib_test.rb +8 -2
  127. data/test/integration/generated_gobject_test.rb +16 -9
  128. data/test/integration/generated_pango_ft2_test.rb +1 -2
  129. data/test/integration/generated_pango_test.rb +2 -2
  130. data/test/integration/generated_regress_test.rb +785 -705
  131. data/test/integration/generated_secret_test.rb +5 -5
  132. data/test/integration/method_lookup_test.rb +5 -5
  133. data/test/introspection_test_helper.rb +3 -1
  134. data/test/minitest/stats_plugin.rb +3 -3
  135. metadata +6 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d42de354fa7299aa1335fbc7853d71c290e40672
4
- data.tar.gz: 5ac34874e3b063d78efae9e6d866d1c53250a139
3
+ metadata.gz: 58dffbf9a2115d4ddfe8ca620557382d27510bb5
4
+ data.tar.gz: 6f0e46d81b16c5d29468acc9fce70e4249b44f37
5
5
  SHA512:
6
- metadata.gz: 24484386533238755050906dc1d1dbbf31e4d8baf49fb739a9c42cb85176a561f3b280e83eaa06ff249cbb3f77c8b08867f532f0db926618e8be67ad8bb96f19
7
- data.tar.gz: 35251a7d050dbf35c96ebb59c6c06588d190551a68629df365267c1723cb85a1d813e1e0bfff1b7850ef7661fecaed0453d6f4bf813968c8b3081e65e1c08538
6
+ metadata.gz: 80c91f162cc4b515d85a77de746ba8305c1a8f241bf28e739bbbb46bd5e34ee4029f553ff57764f7824a33dedcb2486931c979a3d612432601e92aa2867e02d3
7
+ data.tar.gz: e5e38438a0b57c2ac477a60d464dbf7e0547f74ae7b8326c54f79a486c6bbc205e7e90f484a95a9c628abd927023b771c94b1c0f1272537ac480dcc85a958cdf
data/Changelog.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.7.8 / 2014-12-09
4
+
5
+ * Support constants with a falsy value
6
+ * Support type aliases that resolve to a type that is not introspectable
7
+ * Support callback arguments with direction :inout
8
+ * Provide GObject.signal_connect_after and GObject::Object.signal_connect_after
9
+ * Handle setting GValues (and hence, properties) that have enum values
10
+ * Various refactorings & coding style cleanups
11
+
3
12
  ## 0.7.7 / 2014-10-21
4
13
 
5
14
  * Handle introspecting boolean constants
@@ -77,7 +77,7 @@ module GLib
77
77
 
78
78
  def check_element_size_match
79
79
  unless calculated_element_size == get_element_size
80
- warn "WARNING: Element sizes do not match"
80
+ warn 'WARNING: Element sizes do not match'
81
81
  end
82
82
  end
83
83
 
@@ -3,8 +3,7 @@ GLib.load_class :Error
3
3
  module GLib
4
4
  # Overrides for GError, used by GLib for handling non-fatal errors.
5
5
  class Error
6
- # TODO: Auto-convert strings and symbols to quarks
7
- GIR_FFI_DOMAIN = GLib.quark_from_string("gir_ffi")
6
+ GIR_FFI_DOMAIN = GLib.quark_from_string('gir_ffi')
8
7
 
9
8
  def self.from_exception ex
10
9
  new_literal GIR_FFI_DOMAIN, 0, ex.message
@@ -56,7 +56,7 @@ module GLib
56
56
  when :utf8
57
57
  FFI::Function.new(:uint,
58
58
  [:pointer],
59
- find_support_function("g_str_hash"))
59
+ find_support_function('g_str_hash'))
60
60
  else
61
61
  nil
62
62
  end
@@ -67,7 +67,7 @@ module GLib
67
67
  when :utf8
68
68
  FFI::Function.new(:int,
69
69
  [:pointer, :pointer],
70
- find_support_function("g_str_equal"))
70
+ find_support_function('g_str_equal'))
71
71
  else
72
72
  nil
73
73
  end
@@ -3,7 +3,7 @@ GLib.load_class :Variant
3
3
  module GLib
4
4
  # Overrides for GVariant, GLib's variant data type.
5
5
  class Variant
6
- setup_instance_method "get_string"
6
+ setup_instance_method 'get_string'
7
7
 
8
8
  def get_string_with_override
9
9
  get_string_without_override.first
@@ -1,26 +1,26 @@
1
1
  # Preload type contants
2
2
  module GObject
3
- TYPE_INVALID = type_from_name("invalid")
4
- TYPE_NONE = type_from_name("void")
5
- TYPE_INTERFACE = type_from_name("GInterface")
6
- TYPE_CHAR = type_from_name("gchar")
7
- TYPE_UCHAR = type_from_name("guchar")
8
- TYPE_BOOLEAN = type_from_name("gboolean")
9
- TYPE_INT = type_from_name("gint")
10
- TYPE_UINT = type_from_name("guint")
11
- TYPE_LONG = type_from_name("glong")
12
- TYPE_ULONG = type_from_name("gulong")
13
- TYPE_INT64 = type_from_name("gint64")
14
- TYPE_UINT64 = type_from_name("guint64")
15
- TYPE_ENUM = type_from_name("GEnum")
16
- TYPE_FLAGS = type_from_name("GFlags")
17
- TYPE_FLOAT = type_from_name("gfloat")
18
- TYPE_DOUBLE = type_from_name("gdouble")
19
- TYPE_STRING = type_from_name("gchararray")
20
- TYPE_POINTER = type_from_name("gpointer")
21
- TYPE_BOXED = type_from_name("GBoxed")
22
- TYPE_PARAM = type_from_name("GParam")
23
- TYPE_OBJECT = type_from_name("GObject")
24
- TYPE_GTYPE = type_from_name("GType")
25
- TYPE_VARIANT = type_from_name("GVariant")
3
+ TYPE_INVALID = type_from_name('invalid')
4
+ TYPE_NONE = type_from_name('void')
5
+ TYPE_INTERFACE = type_from_name('GInterface')
6
+ TYPE_CHAR = type_from_name('gchar')
7
+ TYPE_UCHAR = type_from_name('guchar')
8
+ TYPE_BOOLEAN = type_from_name('gboolean')
9
+ TYPE_INT = type_from_name('gint')
10
+ TYPE_UINT = type_from_name('guint')
11
+ TYPE_LONG = type_from_name('glong')
12
+ TYPE_ULONG = type_from_name('gulong')
13
+ TYPE_INT64 = type_from_name('gint64')
14
+ TYPE_UINT64 = type_from_name('guint64')
15
+ TYPE_ENUM = type_from_name('GEnum')
16
+ TYPE_FLAGS = type_from_name('GFlags')
17
+ TYPE_FLOAT = type_from_name('gfloat')
18
+ TYPE_DOUBLE = type_from_name('gdouble')
19
+ TYPE_STRING = type_from_name('gchararray')
20
+ TYPE_POINTER = type_from_name('gpointer')
21
+ TYPE_BOXED = type_from_name('GBoxed')
22
+ TYPE_PARAM = type_from_name('GParam')
23
+ TYPE_OBJECT = type_from_name('GObject')
24
+ TYPE_GTYPE = type_from_name('GType')
25
+ TYPE_VARIANT = type_from_name('GVariant')
26
26
  end
@@ -3,7 +3,7 @@ GObject.load_class :Object
3
3
  module GObject
4
4
  # Overrides for GObject, GObject's generic base class.
5
5
  class Object
6
- setup_method "new"
6
+ setup_method 'new'
7
7
 
8
8
  # TODO: Generate accessor methods from GIR at class definition time
9
9
  def method_missing method, *args
@@ -20,8 +20,12 @@ module GObject
20
20
  GObject.signal_connect(self, event, data, &block)
21
21
  end
22
22
 
23
- setup_instance_method "get_property"
24
- setup_instance_method "set_property"
23
+ def signal_connect_after event, data = nil, &block
24
+ GObject.signal_connect_after(self, event, data, &block)
25
+ end
26
+
27
+ setup_instance_method 'get_property'
28
+ setup_instance_method 'set_property'
25
29
 
26
30
  def get_property_extended property_name
27
31
  gvalue = get_property property_name
@@ -14,7 +14,7 @@ module GObject
14
14
  TYPE_BOXED => [:get_boxed, :set_boxed],
15
15
  TYPE_CHAR => [:get_char, :set_char],
16
16
  TYPE_DOUBLE => [:get_double, :set_double],
17
- TYPE_ENUM => [:get_enum_enhanced, :set_enum],
17
+ TYPE_ENUM => [:get_enum_enhanced, :set_enum_enhanced],
18
18
  TYPE_FLAGS => [:get_flags, :set_flags],
19
19
  TYPE_FLOAT => [:get_float, :set_float],
20
20
  TYPE_GTYPE => [:get_gtype, :set_gtype],
@@ -116,6 +116,11 @@ module GObject
116
116
  set_instance val
117
117
  end
118
118
 
119
+ def set_enum_enhanced val
120
+ val = current_gtype_class[val] if val.is_a? Symbol
121
+ set_enum val
122
+ end
123
+
119
124
  def get_enum_enhanced
120
125
  current_gtype_class.wrap(get_enum)
121
126
  end
data/lib/ffi-gobject.rb CHANGED
@@ -18,8 +18,7 @@ module GObject
18
18
  def self.type_from_instance_pointer inst_ptr
19
19
  return nil if inst_ptr.null?
20
20
  klsptr = inst_ptr.get_pointer 0
21
- # TODO: Cache the message name somewhere.
22
- klsptr.send "get_#{GirFFI::TypeMap::TAG_TYPE_MAP[:GType]}", 0
21
+ GirFFI::InOutPointer.new(:GType, klsptr).to_value
23
22
  end
24
23
 
25
24
  def self.type_from_instance instance
@@ -54,18 +53,22 @@ module GObject
54
53
  return_gvalue
55
54
  end
56
55
 
57
- def self.signal_connect object, detailed_signal, data = nil, &block
58
- raise ArgumentError, "Block needed" unless block_given?
56
+ def self.signal_connect object, detailed_signal, data = nil, after = false, &block
57
+ raise ArgumentError, 'Block needed' unless block_given?
59
58
  signal_name, _ = detailed_signal.split('::')
60
59
  sig_info = object.class.find_signal signal_name
61
60
 
62
61
  closure = sig_info.wrap_in_closure { |*args| block.call(*args << data) }
63
62
 
64
- # TODO: Provide _after variant
65
- signal_connect_closure object, detailed_signal, closure, false
63
+ signal_connect_closure object, detailed_signal, closure, after
64
+ end
65
+
66
+ def self.signal_connect_after object, detailed_signal, data = nil, &block
67
+ signal_connect object, detailed_signal, data, true, &block
66
68
  end
67
69
 
68
70
  # Smells of :reek:LongParameterList: due to the C interface.
71
+ # rubocop:disable Metrics/ParameterLists
69
72
  def self.param_spec_int name, nick, blurb, minimum, maximum, default_value, flags
70
73
  ptr = Lib.g_param_spec_int(name, nick, blurb, minimum, maximum,
71
74
  default_value, flags)
@@ -3,7 +3,7 @@ module GObjectIntrospection
3
3
  # Decendant types will be implemented as needed.
4
4
  class IBaseInfo
5
5
  def initialize ptr, lib = Lib
6
- raise ArgumentError, "ptr must not be null" if ptr.null?
6
+ raise ArgumentError, 'ptr must not be null' if ptr.null?
7
7
 
8
8
  unless defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
9
9
  ObjectSpace.define_finalizer self, self.class.make_finalizer(lib, ptr)
@@ -39,7 +39,7 @@ module GObjectIntrospection
39
39
  def self.build_array_method method, single = nil
40
40
  method = method.to_s
41
41
  single ||= method.to_s[0..-2]
42
- count = method.sub(/^(get_)?/, "\\1n_")
42
+ count = method.sub(/^(get_)?/, '\\1n_')
43
43
  class_eval <<-CODE
44
44
  def #{method}
45
45
  (0..(#{count} - 1)).map do |i|
@@ -67,7 +67,7 @@ module GObjectIntrospection
67
67
  #
68
68
  def self.build_finder_method method, counter = nil, fetcher = nil
69
69
  method = method.to_s
70
- single = method.sub(/^find_/, "")
70
+ single = method.sub(/^find_/, '')
71
71
  counter ||= "n_#{single}s"
72
72
  fetcher ||= "#{single}"
73
73
  class_eval <<-CODE
@@ -18,7 +18,7 @@ module GObjectIntrospection
18
18
  def value
19
19
  case type_tag
20
20
  when :utf8
21
- raw_value.force_encoding("utf-8")
21
+ raw_value.force_encoding('utf-8')
22
22
  when :gboolean
23
23
  raw_value != 0
24
24
  else
@@ -21,6 +21,7 @@ require 'ffi-gobject_introspection/i_value_info'
21
21
  require 'ffi-gobject_introspection/i_union_info'
22
22
  require 'ffi-gobject_introspection/i_enum_info'
23
23
  require 'ffi-gobject_introspection/i_flags_info'
24
+ require 'ffi-gobject_introspection/i_unresolved_info'
24
25
 
25
26
  GObject.type_init
26
27
 
@@ -30,6 +31,8 @@ module GObjectIntrospection
30
31
  # This class wraps the GIRepository struct.
31
32
  class IRepository
32
33
  # Map info type to class. Default is IBaseInfo.
34
+ # SMELL: This doesn't really belong here, since it is used by IBaseInfo and
35
+ # descendants as well.
33
36
  TYPEMAP = {
34
37
  invalid: IBaseInfo,
35
38
  function: IFunctionInfo,
@@ -51,7 +54,7 @@ module GObjectIntrospection
51
54
  field: IFieldInfo,
52
55
  arg: IArgInfo,
53
56
  type: ITypeInfo,
54
- unresolved: IBaseInfo
57
+ unresolved: IUnresolvedInfo
55
58
  }
56
59
 
57
60
  def initialize
@@ -36,7 +36,7 @@ module GObjectIntrospection
36
36
  end
37
37
 
38
38
  def name
39
- raise "Should not call this for ITypeInfo"
39
+ raise 'Should not call this for ITypeInfo'
40
40
  end
41
41
  end
42
42
  end
@@ -0,0 +1,7 @@
1
+ require 'ffi-gobject_introspection/i_base_info'
2
+
3
+ module GObjectIntrospection
4
+ # Wraps a GIBaseInfo struct in the case where the info type is :unresolved.
5
+ class IUnresolvedInfo < IBaseInfo
6
+ end
7
+ end
@@ -4,7 +4,7 @@ module GObjectIntrospection
4
4
  # Module for attaching functions from the girepository library
5
5
  module Lib
6
6
  extend FFI::Library
7
- ffi_lib "girepository-1.0"
7
+ ffi_lib 'girepository-1.0'
8
8
 
9
9
  # IRepository
10
10
  enum :IRepositoryLoadFlags, [:LAZY, (1 << 0)]
@@ -141,7 +141,7 @@ module GirFFI
141
141
 
142
142
  def ingoing_convertor
143
143
  if skipped?
144
- NullConvertor.new("0")
144
+ NullConvertor.new('0')
145
145
  elsif closure?
146
146
  ClosureToPointerConvertor.new(name)
147
147
  elsif @type_info.needs_ruby_to_c_conversion_for_functions?
@@ -1,36 +1,44 @@
1
- # Builder that generates code to convert values from C to Ruby. Used by
2
- # argument builders.
3
- class GirFFI::Builders::CToRubyConvertor
4
- def initialize type_info, argument_name, length_arg
5
- @type_info = type_info
6
- @argument_name = argument_name
7
- @length_arg = length_arg
8
- end
1
+ module GirFFI
2
+ module Builders
3
+ # Builder that generates code to convert values from C to Ruby. Used by
4
+ # argument builders.
5
+ class CToRubyConvertor
6
+ def initialize type_info, argument_name, length_arg
7
+ @type_info = type_info
8
+ @argument_name = argument_name
9
+ @length_arg = length_arg
10
+ end
9
11
 
10
- def conversion
11
- case @type_info.flattened_tag
12
- when :utf8, :filename
13
- "#{@argument_name}.to_utf8"
14
- else
15
- "#{@type_info.argument_class_name}.wrap(#{conversion_arguments})"
16
- end
17
- end
12
+ def conversion
13
+ case @type_info.flattened_tag
14
+ when :utf8, :filename
15
+ "#{@argument_name}.to_utf8"
16
+ else
17
+ "#{@type_info.argument_class_name}.wrap(#{conversion_argument_list})"
18
+ end
19
+ end
18
20
 
19
- private
21
+ private
20
22
 
21
- def conversion_arguments
22
- if @type_info.flattened_tag == :c
23
- "#{@type_info.element_type.inspect}, #{array_size}, #{@argument_name}"
24
- else
25
- @type_info.extra_conversion_arguments.map(&:inspect).push(@argument_name).join(", ")
26
- end
27
- end
23
+ def conversion_argument_list
24
+ conversion_arguments.join(', ')
25
+ end
26
+
27
+ def conversion_arguments
28
+ if @type_info.flattened_tag == :c
29
+ [@type_info.element_type.inspect, array_size, @argument_name]
30
+ else
31
+ @type_info.extra_conversion_arguments.map(&:inspect).push(@argument_name)
32
+ end
33
+ end
28
34
 
29
- def array_size
30
- if @length_arg
31
- @length_arg
32
- else
33
- @type_info.array_fixed_size
35
+ def array_size
36
+ if @length_arg
37
+ @length_arg
38
+ else
39
+ @type_info.array_fixed_size
40
+ end
41
+ end
34
42
  end
35
43
  end
36
44
  end
@@ -16,39 +16,47 @@ module GirFFI
16
16
  @pre_converted_name ||= new_variable
17
17
  end
18
18
 
19
+ def out_parameter_name
20
+ @out_parameter_name ||=
21
+ if direction == :inout
22
+ new_variable
23
+ else
24
+ pre_converted_name
25
+ end
26
+ end
27
+
19
28
  def call_argument_name
20
- if direction == :in
29
+ if [:in, :inout].include? direction
21
30
  pre_converted_name unless array_arg
22
31
  end
23
32
  end
24
33
 
25
34
  def capture_variable_name
26
- result_name if direction == :out
35
+ result_name if [:out, :inout].include? direction unless array_arg
27
36
  end
28
37
 
29
38
  def pre_conversion
30
39
  case direction
31
40
  when :in
32
- ["#{pre_converted_name} = #{pre_convertor.conversion}"]
41
+ [ingoing_pre_conversion]
33
42
  when :out
34
- ["#{pre_converted_name} = #{out_parameter_preparation}"]
43
+ [out_parameter_preparation]
44
+ when :inout
45
+ [out_parameter_preparation, ingoing_pre_conversion]
35
46
  when :error
36
- [
37
- "#{pre_converted_name} = #{out_parameter_preparation}",
38
- "begin"
39
- ]
47
+ [out_parameter_preparation, 'begin']
40
48
  end
41
49
  end
42
50
 
43
51
  def post_conversion
44
52
  case direction
45
- when :out
53
+ when :out, :inout
46
54
  [outgoing_post_conversion]
47
55
  when :error
48
56
  [
49
57
  "rescue => #{result_name}",
50
58
  outgoing_post_conversion,
51
- "end"
59
+ 'end'
52
60
  ]
53
61
  else
54
62
  []
@@ -61,15 +69,23 @@ module GirFFI
61
69
  @result_name ||= new_variable
62
70
  end
63
71
 
72
+ def pre_convertor_argument
73
+ if direction == :inout
74
+ "#{out_parameter_name}.to_value"
75
+ else
76
+ method_argument_name
77
+ end
78
+ end
79
+
64
80
  def pre_convertor
65
81
  @pre_convertor ||= if closure?
66
- ClosureConvertor.new(method_argument_name)
82
+ ClosureConvertor.new(pre_convertor_argument)
67
83
  elsif needs_c_to_ruby_conversion?
68
84
  CToRubyConvertor.new(type_info,
69
- method_argument_name,
85
+ pre_convertor_argument,
70
86
  length_argument_name)
71
87
  else
72
- NullConvertor.new(method_argument_name)
88
+ NullConvertor.new(pre_convertor_argument)
73
89
  end
74
90
  end
75
91
 
@@ -77,34 +93,48 @@ module GirFFI
77
93
  type_info.needs_c_to_ruby_conversion_for_callbacks?
78
94
  end
79
95
 
96
+ def ingoing_pre_conversion
97
+ "#{pre_converted_name} = #{pre_convertor.conversion}"
98
+ end
99
+
80
100
  def outgoing_post_conversion
81
- "#{pre_converted_name}.set_value #{outgoing_convertor.conversion}"
101
+ "#{out_parameter_name}.set_value #{post_convertor.conversion}"
82
102
  end
83
103
 
84
- def outgoing_convertor
85
- @outgoing_convertor ||= if type_info.needs_ruby_to_c_conversion_for_callbacks?
86
- RubyToCConvertor.new(type_info, result_name)
87
- else
88
- NullConvertor.new(result_name)
89
- end
104
+ def post_convertor
105
+ @post_convertor ||= if type_info.needs_ruby_to_c_conversion_for_callbacks?
106
+ RubyToCConvertor.new(type_info, post_convertor_argument)
107
+ else
108
+ NullConvertor.new(post_convertor_argument)
109
+ end
90
110
  end
91
111
 
92
- def out_parameter_preparation
93
- type_spec = type_info.tag_or_class
94
- if allocated_by_us?
95
- "GirFFI::InOutPointer.new(#{type_spec[1].inspect})" \
96
- ".tap { |ptr| #{method_argument_name}.put_pointer 0, ptr }"
112
+ def post_convertor_argument
113
+ if array_arg
114
+ "#{array_arg.capture_variable_name}.length"
97
115
  else
98
- "GirFFI::InOutPointer.new(#{type_spec.inspect}, #{method_argument_name})"
116
+ result_name
99
117
  end
100
118
  end
101
119
 
120
+ def out_parameter_preparation
121
+ type_spec = type_info.tag_or_class
122
+ value = if allocated_by_us?
123
+ "GirFFI::InOutPointer.new(#{type_spec[1].inspect})" \
124
+ ".tap { |ptr| #{method_argument_name}.put_pointer 0, ptr }"
125
+ else
126
+ "GirFFI::InOutPointer.new(#{type_spec.inspect}, #{method_argument_name})"
127
+ end
128
+ "#{out_parameter_name} = #{value}"
129
+ end
130
+
102
131
  # Check if an out argument needs to be allocated by us, the callee. Since
103
132
  # caller_allocates is false by default, we must also check that the type
104
133
  # is a pointer. For example, an out parameter of type gint8* will always
105
134
  # be allocate by the caller.
106
135
  def allocated_by_us?
107
- !@arginfo.caller_allocates? &&
136
+ direction == :out &&
137
+ !@arginfo.caller_allocates? &&
108
138
  type_info.pointer? &&
109
139
  ![:object, :zero_terminated].include?(specialized_type_tag)
110
140
  end
@@ -1,11 +1,15 @@
1
- # Builder that generates code to convert closure arguments ('user data') from
2
- # C to Ruby. Used by argument builders.
3
- class GirFFI::Builders::ClosureConvertor
4
- def initialize argument_name
5
- @argument_name = argument_name
6
- end
1
+ module GirFFI
2
+ module Builders
3
+ # Builder that generates code to convert closure arguments ('user data')
4
+ # from C to Ruby. Used by argument builders.
5
+ class ClosureConvertor
6
+ def initialize argument_name
7
+ @argument_name = argument_name
8
+ end
7
9
 
8
- def conversion
9
- "GirFFI::ArgHelper::OBJECT_STORE.fetch(#{@argument_name})"
10
+ def conversion
11
+ "GirFFI::ArgHelper::OBJECT_STORE.fetch(#{@argument_name})"
12
+ end
13
+ end
10
14
  end
11
15
  end
@@ -1,11 +1,15 @@
1
- # Builder that generates code to convert closure arguments ('user data') from
2
- # Ruby to C. Used by argument builders.
3
- class GirFFI::Builders::ClosureToPointerConvertor
4
- def initialize argument_name
5
- @argument_name = argument_name
6
- end
1
+ module GirFFI
2
+ module Builders
3
+ # Builder that generates code to convert closure arguments ('user data')
4
+ # from Ruby to C. Used by argument builders.
5
+ class ClosureToPointerConvertor
6
+ def initialize argument_name
7
+ @argument_name = argument_name
8
+ end
7
9
 
8
- def conversion
9
- "GirFFI::InPointer.from_closure_data(#{@argument_name})"
10
+ def conversion
11
+ "GirFFI::InPointer.from_closure_data(#{@argument_name})"
12
+ end
13
+ end
10
14
  end
11
15
  end
@@ -1,10 +1,14 @@
1
- # Builds conversion code for the result of a GObject constructor method.
2
- class GirFFI::Builders::ConstructorResultConvertor
3
- def initialize argument_name
4
- @argument_name = argument_name
5
- end
1
+ module GirFFI
2
+ module Builders
3
+ # Builds conversion code for the result of a GObject constructor method.
4
+ class ConstructorResultConvertor
5
+ def initialize argument_name
6
+ @argument_name = argument_name
7
+ end
6
8
 
7
- def conversion
8
- "self.constructor_wrap(#{@argument_name})"
9
+ def conversion
10
+ "self.constructor_wrap(#{@argument_name})"
11
+ end
12
+ end
9
13
  end
10
14
  end
@@ -86,7 +86,7 @@ module GirFFI
86
86
  end
87
87
 
88
88
  def field_argument_info
89
- @field_argument_info ||= FieldArgumentInfo.new "value", field_type
89
+ @field_argument_info ||= FieldArgumentInfo.new 'value', field_type
90
90
  end
91
91
 
92
92
  def return_value_builder
@@ -71,7 +71,7 @@ module GirFFI
71
71
 
72
72
  def function_call_arguments
73
73
  ca = @argument_builder_collection.call_argument_names
74
- ca.unshift "self" if @info.method?
74
+ ca.unshift 'self' if @info.method?
75
75
  ca
76
76
  end
77
77
  end
@@ -35,7 +35,7 @@ module GirFFI
35
35
  end
36
36
 
37
37
  def method_name
38
- "call_with_argument_mapping"
38
+ 'call_with_argument_mapping'
39
39
  end
40
40
 
41
41
  def method_arguments