gir_ffi 0.7.8 → 0.7.9

Sign up to get free protection for your applications and to get access to all the features.
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