gir_ffi 0.7.8 → 0.7.9

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 (115) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +16 -0
  3. data/README.md +24 -11
  4. data/TODO.md +10 -2
  5. data/gir_ffi.gemspec +2 -2
  6. data/lib/ffi-glib/array.rb +1 -1
  7. data/lib/ffi-glib/hash_table.rb +0 -4
  8. data/lib/ffi-gobject.rb +10 -6
  9. data/lib/ffi-gobject/object.rb +17 -0
  10. data/lib/ffi-gobject/ruby_closure.rb +1 -1
  11. data/lib/ffi-gobject/value.rb +28 -4
  12. data/lib/ffi-gobject_introspection.rb +4 -0
  13. data/lib/ffi-gobject_introspection/g_error.rb +2 -2
  14. data/lib/ffi-gobject_introspection/i_base_info.rb +1 -3
  15. data/lib/ffi-gobject_introspection/i_callable_info.rb +8 -0
  16. data/lib/ffi-gobject_introspection/i_registered_type_info.rb +2 -0
  17. data/lib/ffi-gobject_introspection/i_repository.rb +4 -4
  18. data/lib/ffi-gobject_introspection/lib.rb +57 -32
  19. data/lib/gir_ffi.rb +1 -1
  20. data/lib/gir_ffi/boxed_base.rb +40 -0
  21. data/lib/gir_ffi/builders/argument_builder.rb +11 -3
  22. data/lib/gir_ffi/builders/base_argument_builder.rb +4 -0
  23. data/lib/gir_ffi/builders/boxed_builder.rb +29 -0
  24. data/lib/gir_ffi/builders/callback_builder.rb +3 -1
  25. data/lib/gir_ffi/builders/callback_return_value_builder.rb +9 -1
  26. data/lib/gir_ffi/builders/field_builder.rb +68 -18
  27. data/lib/gir_ffi/builders/function_builder.rb +12 -2
  28. data/lib/gir_ffi/builders/mapping_method_builder.rb +7 -5
  29. data/lib/gir_ffi/builders/marshalling_method_builder.rb +1 -1
  30. data/lib/gir_ffi/builders/module_builder.rb +1 -1
  31. data/lib/gir_ffi/builders/registered_type_builder.rb +0 -9
  32. data/lib/gir_ffi/builders/return_value_builder.rb +0 -1
  33. data/lib/gir_ffi/builders/signal_closure_builder.rb +3 -1
  34. data/lib/gir_ffi/builders/struct_builder.rb +4 -16
  35. data/lib/gir_ffi/builders/union_builder.rb +2 -13
  36. data/lib/gir_ffi/builders/user_defined_builder.rb +6 -6
  37. data/lib/gir_ffi/builders/vfunc_argument_builder.rb +44 -0
  38. data/lib/gir_ffi/builders/vfunc_builder.rb +3 -1
  39. data/lib/gir_ffi/callback_base.rb +5 -2
  40. data/lib/gir_ffi/class_base.rb +6 -7
  41. data/lib/gir_ffi/enum_base.rb +5 -0
  42. data/lib/gir_ffi/ffi_ext/pointer.rb +1 -0
  43. data/lib/gir_ffi/field_argument_info.rb +4 -0
  44. data/lib/gir_ffi/in_out_pointer.rb +1 -1
  45. data/lib/gir_ffi/in_pointer.rb +2 -2
  46. data/lib/gir_ffi/info_ext/i_arg_info.rb +12 -2
  47. data/lib/gir_ffi/info_ext/i_callable_info.rb +1 -1
  48. data/lib/gir_ffi/info_ext/i_callback_info.rb +7 -2
  49. data/lib/gir_ffi/info_ext/i_field_info.rb +1 -1
  50. data/lib/gir_ffi/info_ext/i_function_info.rb +1 -1
  51. data/lib/gir_ffi/info_ext/i_registered_type_info.rb +7 -2
  52. data/lib/gir_ffi/info_ext/i_type_info.rb +21 -9
  53. data/lib/gir_ffi/info_ext/i_unresolved_info.rb +5 -0
  54. data/lib/gir_ffi/interface_base.rb +5 -0
  55. data/lib/gir_ffi/object_base.rb +5 -0
  56. data/lib/gir_ffi/receiver_argument_info.rb +5 -0
  57. data/lib/gir_ffi/registered_type_base.rb +5 -0
  58. data/lib/gir_ffi/return_value_info.rb +3 -1
  59. data/lib/gir_ffi/sized_array.rb +1 -1
  60. data/lib/gir_ffi/struct_base.rb +2 -24
  61. data/lib/gir_ffi/type_map.rb +5 -1
  62. data/lib/gir_ffi/union_base.rb +2 -2
  63. data/lib/gir_ffi/version.rb +1 -1
  64. data/lib/gir_ffi/zero_terminated.rb +1 -1
  65. data/test/base_test_helper.rb +6 -6
  66. data/test/ffi-glib/hash_table_test.rb +7 -7
  67. data/test/ffi-glib/iconv_test.rb +2 -3
  68. data/test/ffi-glib/main_loop_test.rb +2 -2
  69. data/test/ffi-gobject/gobject_test.rb +1 -1
  70. data/test/ffi-gobject/object_test.rb +5 -14
  71. data/test/ffi-gobject/value_test.rb +30 -6
  72. data/test/ffi-gobject_introspection/i_base_info_test.rb +6 -6
  73. data/test/ffi-gobject_introspection/i_repository_test.rb +2 -4
  74. data/test/gir_ffi/arg_helper_test.rb +1 -1
  75. data/test/gir_ffi/builder_test.rb +18 -12
  76. data/test/gir_ffi/builders/argument_builder_test.rb +2 -5
  77. data/test/gir_ffi/builders/callback_builder_test.rb +1 -1
  78. data/test/gir_ffi/builders/callback_return_value_builder_test.rb +11 -10
  79. data/test/gir_ffi/builders/field_builder_test.rb +0 -2
  80. data/test/gir_ffi/builders/function_builder_test.rb +156 -147
  81. data/test/gir_ffi/builders/interface_builder_test.rb +1 -1
  82. data/test/gir_ffi/builders/module_builder_test.rb +2 -2
  83. data/test/gir_ffi/builders/object_builder_test.rb +2 -2
  84. data/test/gir_ffi/builders/property_builder_test.rb +5 -5
  85. data/test/gir_ffi/builders/return_value_builder_test.rb +30 -30
  86. data/test/gir_ffi/builders/struct_builder_test.rb +14 -14
  87. data/test/gir_ffi/builders/user_defined_builder_test.rb +21 -22
  88. data/test/gir_ffi/builders/vfunc_builder_test.rb +57 -0
  89. data/test/gir_ffi/class_base_test.rb +8 -8
  90. data/test/gir_ffi/ffi_ext/pointer_test.rb +4 -4
  91. data/test/gir_ffi/g_type_test.rb +1 -1
  92. data/test/gir_ffi/in_pointer_test.rb +2 -2
  93. data/test/gir_ffi/info_ext/i_callable_info_test.rb +3 -3
  94. data/test/gir_ffi/info_ext/i_callback_info_test.rb +2 -2
  95. data/test/gir_ffi/info_ext/i_field_info_test.rb +8 -8
  96. data/test/gir_ffi/info_ext/i_function_info_test.rb +13 -13
  97. data/test/gir_ffi/info_ext/i_type_info_test.rb +131 -132
  98. data/test/gir_ffi/info_ext/i_unresolved_info_test.rb +2 -2
  99. data/test/gir_ffi/info_ext/safe_constant_name_test.rb +2 -2
  100. data/test/gir_ffi/info_ext/safe_function_name_test.rb +2 -2
  101. data/test/gir_ffi/interface_base_test.rb +3 -3
  102. data/test/gir_ffi/object_base_test.rb +3 -3
  103. data/test/gir_ffi/sized_array_test.rb +2 -2
  104. data/test/gir_ffi/type_map_test.rb +3 -3
  105. data/test/gir_ffi/unintrospectable_type_info_test.rb +14 -14
  106. data/test/gir_ffi/user_defined_property_info_test.rb +1 -1
  107. data/test/gir_ffi/user_defined_type_info_test.rb +25 -12
  108. data/test/gir_ffi/zero_terminated_test.rb +0 -1
  109. data/test/gir_ffi_test.rb +3 -3
  110. data/test/gir_ffi_test_helper.rb +4 -0
  111. data/test/integration/generated_gimarshallingtests_test.rb +31 -25
  112. data/test/integration/generated_gio_test.rb +1 -1
  113. data/test/integration/generated_gobject_test.rb +1 -1
  114. data/test/integration/generated_regress_test.rb +18 -22
  115. metadata +11 -8
@@ -19,7 +19,7 @@ module GirFFI
19
19
  end
20
20
 
21
21
  def target_gtype
22
- @gtype ||= klass.get_gtype
22
+ @gtype ||= klass.gtype
23
23
  end
24
24
 
25
25
  private
@@ -30,7 +30,7 @@ module GirFFI
30
30
  gobject_type_info, 0)
31
31
  included_interfaces.each do |interface|
32
32
  ifinfo = gobject_interface_info interface
33
- GObject.type_add_interface_static @gtype, interface.get_gtype, ifinfo
33
+ GObject.type_add_interface_static @gtype, interface.gtype, ifinfo
34
34
  end
35
35
  end
36
36
 
@@ -39,11 +39,11 @@ module GirFFI
39
39
  end
40
40
 
41
41
  def parent_gtype
42
- @parent_gtype ||= GType.new(klass.superclass.get_gtype)
42
+ @parent_gtype ||= GType.new(klass.superclass.gtype)
43
43
  end
44
44
 
45
45
  def interface_gtypes
46
- included_interfaces.map { |interface| GType.new(interface.get_gtype) }
46
+ included_interfaces.map { |interface| GType.new(interface.gtype) }
47
47
  end
48
48
 
49
49
  def included_interfaces
@@ -166,11 +166,11 @@ module GirFFI
166
166
  def layout_specification
167
167
  parent_spec = [:parent, superclass::Struct, 0]
168
168
  offset = superclass::Struct.size
169
- fields_spec = properties.map do |pinfo|
169
+ fields_spec = properties.flat_map do |pinfo|
170
170
  spec = [pinfo.name.to_sym, :int32, offset]
171
171
  offset += FFI.type_size(:int32)
172
172
  spec
173
- end.flatten(1)
173
+ end
174
174
  parent_spec + fields_spec
175
175
  end
176
176
 
@@ -0,0 +1,44 @@
1
+ require 'gir_ffi/builders/callback_argument_builder'
2
+
3
+ module GirFFI
4
+ module Builders
5
+ # Convertor for arguments for vfuncs. Used when building the
6
+ # argument mapper for vfuncs.
7
+ class VFuncArgumentBuilder < CallbackArgumentBuilder
8
+ def pre_conversion
9
+ if ingoing_ref_needed
10
+ super + [pre_ref_count_increase]
11
+ else
12
+ super
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ def ingoing_ref_needed
19
+ direction == :in &&
20
+ ownership_transfer == :nothing &&
21
+ specialized_type_tag == :object
22
+ end
23
+
24
+ def pre_ref_count_increase
25
+ "#{pre_converted_name}.ref"
26
+ end
27
+
28
+ # SMELL: Override private method
29
+ def post_convertor_argument
30
+ if outgoing_ref_needed
31
+ "#{super}.ref"
32
+ else
33
+ super
34
+ end
35
+ end
36
+
37
+ def outgoing_ref_needed
38
+ direction == :out &&
39
+ ownership_transfer == :everything &&
40
+ specialized_type_tag == :object
41
+ end
42
+ end
43
+ end
44
+ end
@@ -26,7 +26,9 @@ module GirFFI
26
26
  arg_infos << ErrorArgumentInfo.new if info.throws?
27
27
 
28
28
  receiver_info = ReceiverArgumentInfo.new receiver_type_info
29
- return_value_info = ReturnValueInfo.new info.return_type
29
+ return_value_info = ReturnValueInfo.new(info.return_type,
30
+ info.caller_owns,
31
+ info.skip_return?)
30
32
 
31
33
  MappingMethodBuilder.for_vfunc(receiver_info,
32
34
  arg_infos,
@@ -24,8 +24,6 @@ module GirFFI
24
24
  value.to_native
25
25
  when FFI::Function
26
26
  value
27
- else
28
- nil
29
27
  end
30
28
  end
31
29
 
@@ -55,10 +53,15 @@ module GirFFI
55
53
  end
56
54
  end
57
55
 
56
+ # @deprecated Use .to_ffi_type instead. Will be removed in 0.8.0.
58
57
  def self.to_ffitype
59
58
  self
60
59
  end
61
60
 
61
+ def self.to_ffi_type
62
+ self
63
+ end
64
+
62
65
  def to_native
63
66
  @to_native ||= begin
64
67
  builder = self.class.gir_ffi_builder
@@ -46,9 +46,14 @@ module GirFFI
46
46
  end
47
47
  end
48
48
 
49
+ def self.to_ffi_type
50
+ self::Struct
51
+ end
52
+
49
53
  class << self
54
+ # @deprecated Use .to_ffi_type instead. Will be removed in 0.8.0.
50
55
  def to_ffitype
51
- self::Struct
56
+ to_ffi_type
52
57
  end
53
58
 
54
59
  def setup_method name
@@ -77,12 +82,6 @@ module GirFFI
77
82
  obj
78
83
  end
79
84
 
80
- def _allocate
81
- obj = _real_new
82
- obj.instance_variable_set :@struct, self::Struct.new
83
- obj
84
- end
85
-
86
85
  # Pass-through casting method. This may become a type checking
87
86
  # method. It is overridden by GValue to implement wrapping of plain
88
87
  # Ruby objects.
@@ -48,7 +48,12 @@ module GirFFI
48
48
  send method, *arguments, &block
49
49
  end
50
50
 
51
+ # @deprecated Use #to_ffi_type instead. Will be removed in 0.8.0.
51
52
  def to_ffitype
53
+ to_ffi_type
54
+ end
55
+
56
+ def to_ffi_type
52
57
  self
53
58
  end
54
59
 
@@ -14,6 +14,7 @@ module GirFFI
14
14
  null?
15
15
  end
16
16
 
17
+ # FIXME: Should probably not be here.
17
18
  def to_object
18
19
  return nil if self.null?
19
20
  gtype = GObject.type_from_instance_pointer self
@@ -14,6 +14,10 @@ module GirFFI
14
14
  :in
15
15
  end
16
16
 
17
+ def ownership_transfer
18
+ :everything
19
+ end
20
+
17
21
  def skip?
18
22
  false
19
23
  end
@@ -66,7 +66,7 @@ module GirFFI
66
66
  private
67
67
 
68
68
  def value_ffi_type
69
- @value_ffi_type ||= TypeMap.type_specification_to_ffitype value_type
69
+ @value_ffi_type ||= TypeMap.type_specification_to_ffi_type value_type
70
70
  end
71
71
 
72
72
  def value_type_size
@@ -78,7 +78,7 @@ module GirFFI
78
78
  end
79
79
 
80
80
  def from_struct_array type, ary
81
- ffi_type = TypeMap.type_specification_to_ffitype type
81
+ ffi_type = TypeMap.type_specification_to_ffi_type type
82
82
  type_size = FFI.type_size(ffi_type)
83
83
  length = ary.length
84
84
 
@@ -101,7 +101,7 @@ module GirFFI
101
101
  end
102
102
 
103
103
  def from_basic_type_array type, ary
104
- ffi_type = TypeMap.type_specification_to_ffitype type
104
+ ffi_type = TypeMap.type_specification_to_ffi_type type
105
105
  ary = ary.dup << null_value(ffi_type)
106
106
  type_size = FFI.type_size(ffi_type)
107
107
  block = AllocationHelper.safe_malloc type_size * ary.length
@@ -2,14 +2,24 @@ module GirFFI
2
2
  module InfoExt
3
3
  # Extensions for GObjectIntrospection::IArgInfo needed by GirFFI
4
4
  module IArgInfo
5
+ # @deprecated Use #to_ffi_type instead. Will be removed in 0.8.0.
5
6
  def to_ffitype
7
+ to_ffi_type
8
+ end
9
+
10
+ def to_ffi_type
6
11
  return :pointer if direction != :in
7
- argument_type.to_ffitype
12
+ argument_type.to_ffi_type
8
13
  end
9
14
 
15
+ # @deprecated Use #to_callback_ffi_type instead. Will be removed in 0.8.0.
10
16
  def to_callback_ffitype
17
+ to_callback_ffi_type
18
+ end
19
+
20
+ def to_callback_ffi_type
11
21
  return :pointer if direction != :in
12
- argument_type.to_callback_ffitype
22
+ argument_type.to_callback_ffi_type
13
23
  end
14
24
  end
15
25
  end
@@ -3,7 +3,7 @@ module GirFFI
3
3
  # Extensions for GObjectIntrospection::ICallableInfo needed by GirFFI
4
4
  module ICallableInfo
5
5
  def argument_ffi_types
6
- args.map(&:to_ffitype)
6
+ args.map(&:to_ffi_type)
7
7
  end
8
8
  end
9
9
  end
@@ -2,16 +2,21 @@ module GirFFI
2
2
  module InfoExt
3
3
  # Extensions for GObjectIntrospection::ICallbackInfo needed by GirFFI
4
4
  module ICallbackInfo
5
+ # @deprecated Use #to_ffi_type instead. Will be removed in 0.8.0.
5
6
  def to_ffitype
7
+ to_ffi_type
8
+ end
9
+
10
+ def to_ffi_type
6
11
  Builder.build_class(self)
7
12
  end
8
13
 
9
14
  def argument_ffi_types
10
- args.map(&:to_callback_ffitype)
15
+ args.map(&:to_callback_ffi_type)
11
16
  end
12
17
 
13
18
  def return_ffi_type
14
- return_type.to_callback_ffitype
19
+ return_type.to_callback_ffi_type
15
20
  end
16
21
  end
17
22
  end
@@ -3,7 +3,7 @@ module GirFFI
3
3
  # Extensions for GObjectIntrospection::IFieldInfo needed by GirFFI
4
4
  module IFieldInfo
5
5
  def layout_specification
6
- [name.to_sym, field_type.to_ffitype, offset]
6
+ [name.to_sym, field_type.to_ffi_type, offset]
7
7
  end
8
8
  end
9
9
  end
@@ -10,7 +10,7 @@ module GirFFI
10
10
  end
11
11
 
12
12
  def return_ffi_type
13
- return_type.to_ffitype
13
+ return_type.to_ffi_type
14
14
  end
15
15
  end
16
16
  end
@@ -4,8 +4,13 @@ module GirFFI
4
4
  module InfoExt
5
5
  # Extensions for GObjectIntrospection::IRegisteredTypeInfo needed by GirFFI
6
6
  module IRegisteredTypeInfo
7
+ # @deprecated Use #to_ffi_type instead. Will be removed in 0.8.0.
7
8
  def to_ffitype
8
- to_type.to_ffitype
9
+ to_ffi_type
10
+ end
11
+
12
+ def to_ffi_type
13
+ to_type.to_ffi_type
9
14
  end
10
15
 
11
16
  def to_type
@@ -21,4 +26,4 @@ module GirFFI
21
26
  end
22
27
 
23
28
  GObjectIntrospection::IRegisteredTypeInfo.send :include,
24
- GirFFI::InfoExt::IRegisteredTypeInfo
29
+ GirFFI::InfoExt::IRegisteredTypeInfo
@@ -19,9 +19,14 @@ module GirFFI
19
19
  }
20
20
  end
21
21
 
22
+ # @deprecated Use #gtype instead. Will be removed in 0.8.0.
22
23
  def g_type
24
+ gtype
25
+ end
26
+
27
+ def gtype
23
28
  if tag == :interface
24
- return interface.g_type
29
+ return interface.gtype
25
30
  elsif (type = ITypeInfo.flattened_tag_to_gtype_map[flattened_tag])
26
31
  return type
27
32
  else
@@ -30,7 +35,7 @@ module GirFFI
30
35
  end
31
36
 
32
37
  def make_g_value
33
- GObject::Value.for_g_type g_type
38
+ GObject::Value.for_gtype gtype
34
39
  end
35
40
 
36
41
  def element_type
@@ -39,8 +44,6 @@ module GirFFI
39
44
  enumerable_element_type
40
45
  when :ghash
41
46
  dictionary_element_type
42
- else
43
- nil
44
47
  end
45
48
  end
46
49
 
@@ -99,21 +102,30 @@ module GirFFI
99
102
  end
100
103
  end
101
104
 
105
+ # @deprecated Use #to_ffi_type instead. Will be removed in 0.8.0.
102
106
  def to_ffitype
107
+ to_ffi_type
108
+ end
109
+
110
+ def to_ffi_type
103
111
  return :pointer if pointer?
104
112
 
105
113
  case tag
106
114
  when :interface
107
- interface.to_ffitype
115
+ interface.to_ffi_type
108
116
  when :array
109
- [subtype_ffitype(0), array_fixed_size]
117
+ [subtype_ffi_type(0), array_fixed_size]
110
118
  else
111
119
  TypeMap.map_basic_type tag
112
120
  end
113
121
  end
114
122
 
115
- # TODO: Use either ffitype or ffi_type everywhere
123
+ # @deprecated Use #to_callback_ffi_type instead. Will be removed in 0.8.0.
116
124
  def to_callback_ffitype
125
+ to_callback_ffi_type
126
+ end
127
+
128
+ def to_callback_ffi_type
117
129
  return :pointer if pointer?
118
130
 
119
131
  case tag
@@ -193,8 +205,8 @@ module GirFFI
193
205
  subtype_tag_or_class 0
194
206
  end
195
207
 
196
- def subtype_ffitype index
197
- subtype = param_type(index).to_ffitype
208
+ def subtype_ffi_type index
209
+ subtype = param_type(index).to_ffi_type
198
210
  if subtype == :pointer
199
211
  # NOTE: Don't use pointer directly to appease JRuby.
200
212
  :"uint#{FFI.type_size(:pointer) * 8}"
@@ -2,7 +2,12 @@ module GirFFI
2
2
  module InfoExt
3
3
  # Extensions for GObjectIntrospection::IUnresolvedInfo needed by GirFFI
4
4
  module IUnresolvedInfo
5
+ # @deprecated Use #to_ffi_type instead. Will be removed in 0.8.0.
5
6
  def to_ffitype
7
+ to_ffi_type
8
+ end
9
+
10
+ def to_ffi_type
6
11
  :pointer
7
12
  end
8
13
  end
@@ -13,7 +13,12 @@ module GirFFI
13
13
  ptr.to_object
14
14
  end
15
15
 
16
+ # @deprecated Use #to_ffi_type instead. Will be removed in 0.8.0.
16
17
  def to_ffitype
18
+ to_ffi_type
19
+ end
20
+
21
+ def to_ffi_type
17
22
  :pointer
18
23
  end
19
24
  end
@@ -29,7 +29,12 @@ module GirFFI
29
29
  gir_ffi_builder.find_signal name
30
30
  end
31
31
 
32
+ # @deprecated Use #to_ffi_type instead. Will be removed in 0.8.0.
32
33
  def self.to_ffitype
34
+ to_ffi_type
35
+ end
36
+
37
+ def self.to_ffi_type
33
38
  :pointer
34
39
  end
35
40
 
@@ -13,6 +13,11 @@ module GirFFI
13
13
  :in
14
14
  end
15
15
 
16
+ def ownership_transfer
17
+ # FIXME: Make an informed choice for this.
18
+ :everything
19
+ end
20
+
16
21
  def name
17
22
  '_instance'
18
23
  end