gir_ffi 0.7.7 → 0.7.8

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 (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