gir_ffi 0.13.0 → 0.13.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +10 -0
  3. data/lib/ffi-glib/array.rb +2 -2
  4. data/lib/ffi-glib/array_methods.rb +1 -0
  5. data/lib/ffi-glib/list_methods.rb +3 -2
  6. data/lib/ffi-glib/main_loop.rb +2 -0
  7. data/lib/ffi-glib/ptr_array.rb +2 -2
  8. data/lib/ffi-gobject.rb +3 -11
  9. data/lib/ffi-gobject/closure.rb +1 -0
  10. data/lib/ffi-gobject/object.rb +30 -16
  11. data/lib/ffi-gobject/object_class.rb +2 -2
  12. data/lib/ffi-gobject/ruby_closure.rb +2 -2
  13. data/lib/ffi-gobject/value.rb +2 -1
  14. data/lib/ffi-gobject_introspection/i_arg_info.rb +11 -11
  15. data/lib/ffi-gobject_introspection/i_base_info.rb +12 -10
  16. data/lib/ffi-gobject_introspection/i_callable_info.rb +8 -8
  17. data/lib/ffi-gobject_introspection/i_enum_info.rb +5 -5
  18. data/lib/ffi-gobject_introspection/i_field_info.rb +4 -4
  19. data/lib/ffi-gobject_introspection/i_function_info.rb +2 -2
  20. data/lib/ffi-gobject_introspection/i_interface_info.rb +15 -15
  21. data/lib/ffi-gobject_introspection/i_object_info.rb +22 -22
  22. data/lib/ffi-gobject_introspection/i_property_info.rb +2 -2
  23. data/lib/ffi-gobject_introspection/i_registered_type_info.rb +3 -3
  24. data/lib/ffi-gobject_introspection/i_repository.rb +16 -10
  25. data/lib/ffi-gobject_introspection/i_struct_info.rb +11 -7
  26. data/lib/ffi-gobject_introspection/i_type_info.rb +8 -8
  27. data/lib/ffi-gobject_introspection/i_union_info.rb +7 -7
  28. data/lib/ffi-gobject_introspection/i_value_info.rb +1 -1
  29. data/lib/ffi-gobject_introspection/strv.rb +1 -0
  30. data/lib/gir_ffi-base/gobject.rb +5 -0
  31. data/lib/gir_ffi-base/gobject/lib.rb +4 -0
  32. data/lib/gir_ffi/boolean.rb +2 -2
  33. data/lib/gir_ffi/builders/argument_builder.rb +41 -14
  34. data/lib/gir_ffi/builders/argument_builder_collection.rb +17 -4
  35. data/lib/gir_ffi/builders/base_argument_builder.rb +12 -16
  36. data/lib/gir_ffi/builders/callback_argument_builder.rb +1 -1
  37. data/lib/gir_ffi/builders/callback_builder.rb +1 -1
  38. data/lib/gir_ffi/builders/closure_to_pointer_convertor.rb +2 -9
  39. data/lib/gir_ffi/builders/field_builder.rb +11 -9
  40. data/lib/gir_ffi/builders/module_builder.rb +2 -1
  41. data/lib/gir_ffi/builders/object_builder.rb +21 -12
  42. data/lib/gir_ffi/builders/pointer_value_convertor.rb +8 -6
  43. data/lib/gir_ffi/builders/property_builder.rb +4 -2
  44. data/lib/gir_ffi/builders/registered_type_builder.rb +30 -19
  45. data/lib/gir_ffi/builders/return_value_builder.rb +2 -2
  46. data/lib/gir_ffi/builders/ruby_to_c_convertor.rb +2 -0
  47. data/lib/gir_ffi/builders/signal_closure_builder.rb +1 -1
  48. data/lib/gir_ffi/builders/struct_builder.rb +7 -8
  49. data/lib/gir_ffi/builders/unintrospectable_builder.rb +4 -1
  50. data/lib/gir_ffi/builders/user_defined_builder.rb +31 -95
  51. data/lib/gir_ffi/builders/vfunc_builder.rb +1 -1
  52. data/lib/gir_ffi/builders/with_layout.rb +3 -1
  53. data/lib/gir_ffi/callback_base.rb +3 -2
  54. data/lib/gir_ffi/class_base.rb +5 -0
  55. data/lib/gir_ffi/enum_like_base.rb +9 -5
  56. data/lib/gir_ffi/error_argument_info.rb +1 -1
  57. data/lib/gir_ffi/ffi_ext/pointer.rb +1 -4
  58. data/lib/gir_ffi/field_argument_info.rb +1 -1
  59. data/lib/gir_ffi/in_pointer.rb +36 -23
  60. data/lib/gir_ffi/info_ext/i_arg_info.rb +2 -0
  61. data/lib/gir_ffi/info_ext/i_callback_info.rb +4 -0
  62. data/lib/gir_ffi/info_ext/i_registered_type_info.rb +4 -0
  63. data/lib/gir_ffi/info_ext/i_type_info.rb +3 -27
  64. data/lib/gir_ffi/info_ext/safe_function_name.rb +1 -0
  65. data/lib/gir_ffi/interface_base.rb +5 -0
  66. data/lib/gir_ffi/module_base.rb +1 -0
  67. data/lib/gir_ffi/object_base.rb +10 -0
  68. data/lib/gir_ffi/object_store.rb +2 -0
  69. data/lib/gir_ffi/receiver_argument_info.rb +1 -1
  70. data/lib/gir_ffi/return_value_info.rb +1 -1
  71. data/lib/gir_ffi/sized_array.rb +7 -14
  72. data/lib/gir_ffi/struct_like_base.rb +3 -0
  73. data/lib/gir_ffi/type_map.rb +21 -0
  74. data/lib/gir_ffi/user_defined_object_info.rb +6 -2
  75. data/lib/gir_ffi/user_defined_property_info.rb +113 -71
  76. data/lib/gir_ffi/version.rb +1 -1
  77. data/lib/gir_ffi/zero_terminated.rb +26 -1
  78. data/tasks/test.rake +1 -0
  79. data/test/ffi-gobject_introspection/i_repository_test.rb +1 -2
  80. data/test/gir_ffi/builder_test.rb +13 -7
  81. data/test/gir_ffi/builders/argument_builder_test.rb +1 -5
  82. data/test/gir_ffi/builders/callback_return_value_builder_test.rb +1 -1
  83. data/test/gir_ffi/builders/field_builder_test.rb +20 -20
  84. data/test/gir_ffi/builders/return_value_builder_test.rb +1 -1
  85. data/test/gir_ffi/builders/signal_closure_builder_test.rb +1 -1
  86. data/test/gir_ffi/builders/unintrospectable_boxed_builder_test.rb +1 -1
  87. data/test/gir_ffi/builders/unintrospectable_builder_test.rb +2 -2
  88. data/test/gir_ffi/builders/vfunc_builder_test.rb +1 -1
  89. data/test/gir_ffi/enum_base_test.rb +43 -0
  90. data/test/gir_ffi/info_ext/i_type_info_test.rb +3 -9
  91. data/test/gir_ffi/object_base_test.rb +30 -0
  92. data/test/gir_ffi/sized_array_test.rb +0 -9
  93. data/test/gir_ffi/user_defined_object_info_test.rb +4 -6
  94. data/test/gir_ffi/user_defined_property_info_test.rb +6 -5
  95. data/test/gir_ffi/zero_terminated_test.rb +22 -0
  96. data/test/gir_ffi_test_helper.rb +2 -0
  97. data/test/integration/generated_gimarshallingtests_test.rb +1 -0
  98. data/test/integration/generated_gio_test.rb +5 -6
  99. data/test/integration/generated_gobject_test.rb +1 -1
  100. data/test/integration/generated_gtop_test.rb +3 -1
  101. data/test/integration/generated_regress_test.rb +3 -4
  102. metadata +3 -2
@@ -16,7 +16,7 @@ module GirFFI
16
16
  class VFuncBuilder < BaseTypeBuilder
17
17
  def setup_class
18
18
  setup_constants
19
- klass.class_eval mapping_method_definition
19
+ klass.class_eval mapping_method_definition, __FILE__, __LINE__
20
20
  end
21
21
 
22
22
  def klass
@@ -21,7 +21,9 @@ module GirFFI
21
21
 
22
22
  def setup_layout
23
23
  spec = layout_specification
24
- struct_class.class_eval { layout(*spec) }
24
+ struct_class.class_eval do
25
+ layout(*spec)
26
+ end
25
27
  end
26
28
 
27
29
  def dummy_layout_specification
@@ -17,6 +17,7 @@ module GirFFI
17
17
  # TODO: Return instance of this class
18
18
  def self.from_native(value, _context)
19
19
  return nil if !value || value.null?
20
+
20
21
  FFI::Function.new(gir_ffi_builder.return_ffi_type,
21
22
  gir_ffi_builder.argument_ffi_types, value)
22
23
  end
@@ -80,8 +81,8 @@ module GirFFI
80
81
  to_native.to_ptr
81
82
  end
82
83
 
83
- def self.copy_value_to_pointer(value, pointer)
84
- pointer.put_pointer 0, to_native(value, nil)
84
+ def self.copy_value_to_pointer(value, pointer, offset = 0)
85
+ pointer.put_pointer offset, to_native(value, nil)
85
86
  end
86
87
 
87
88
  def self.get_value_from_pointer(pointer, offset)
@@ -56,6 +56,10 @@ module GirFFI
56
56
  self::Struct
57
57
  end
58
58
 
59
+ def self.to_callback_ffi_type
60
+ :pointer
61
+ end
62
+
59
63
  # Wrap the passed pointer in an instance of the current class, or a
60
64
  # descendant type if applicable.
61
65
  def self.wrap(ptr)
@@ -66,6 +70,7 @@ module GirFFI
66
70
  # do any casting to subtypes or additional processing.
67
71
  def self.direct_wrap(ptr)
68
72
  return nil if !ptr || ptr.null?
73
+
69
74
  obj = allocate
70
75
  obj.__send__ :assign_pointer, ptr
71
76
  obj
@@ -11,19 +11,19 @@ module GirFFI
11
11
  include MethodSetup
12
12
 
13
13
  def wrap(arg)
14
- self[arg]
14
+ from_native arg, nil
15
15
  end
16
16
 
17
- def from(arg)
18
- self[arg]
17
+ def to_int(arg)
18
+ to_native arg, nil
19
19
  end
20
20
 
21
21
  def size
22
22
  native_type.size
23
23
  end
24
24
 
25
- def copy_value_to_pointer(value, pointer)
26
- pointer.put_int32 0, to_native(value, nil)
25
+ def copy_value_to_pointer(value, pointer, offset = 0)
26
+ pointer.put_int32 offset, to_native(value, nil)
27
27
  end
28
28
 
29
29
  def get_value_from_pointer(pointer, offset)
@@ -41,5 +41,9 @@ module GirFFI
41
41
  def to_ffi_type
42
42
  self
43
43
  end
44
+
45
+ def to_callback_ffi_type
46
+ :int32
47
+ end
44
48
  end
45
49
  end
@@ -3,7 +3,7 @@
3
3
  require 'gir_ffi/error_type_info'
4
4
 
5
5
  module GirFFI
6
- # Represents an error argument with the same interface as IArgumentInfo
6
+ # Represents an error argument with the same interface as IArgInfo
7
7
  class ErrorArgumentInfo
8
8
  def direction
9
9
  :error
@@ -8,13 +8,10 @@ module GirFFI
8
8
  self
9
9
  end
10
10
 
11
- def zero?
12
- null?
13
- end
14
-
15
11
  # FIXME: Should probably not be here.
16
12
  def to_object
17
13
  return nil if null?
14
+
18
15
  gtype = GObject.type_from_instance_pointer self
19
16
  Builder.build_by_gtype(gtype).direct_wrap self
20
17
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module GirFFI
4
4
  # Class to represent argument info for the argument of a setter method.
5
- # Implements the necessary parts of IArgumentInfo's interface.
5
+ # Implements the necessary parts of IArgInfo's interface.
6
6
  # TODO: Rename and add direction argument or subclass
7
7
  class FieldArgumentInfo
8
8
  attr_reader :name, :argument_type
@@ -7,24 +7,16 @@ module GirFFI
7
7
  module InPointer
8
8
  def self.from_array(type, ary)
9
9
  return unless ary
10
+
10
11
  case type
11
- when :utf8, :filename
12
- from_utf8_array ary
13
- when :gboolean
14
- from_boolean_array ary
15
12
  when Symbol
16
- from_basic_type_array type, ary
17
- when Class
18
- if type == GObject::Value
19
- from_gvalue_array type, ary
20
- else
21
- from_struct_array type, ary
22
- end
13
+ from_simple_type_array type, ary
23
14
  when Module
24
- from_enum_array type, ary
15
+ from_module_type_array type, ary
25
16
  when Array
26
17
  main_type, sub_type = *type
27
18
  raise "Unexpected main type #{main_type}" if main_type != :pointer
19
+
28
20
  from_pointer_array sub_type, ary
29
21
  else
30
22
  raise NotImplementedError, type
@@ -33,6 +25,7 @@ module GirFFI
33
25
 
34
26
  def self.from(type, val)
35
27
  return unless val
28
+
36
29
  case type
37
30
  when :utf8, :filename
38
31
  from_utf8 val
@@ -47,9 +40,40 @@ module GirFFI
47
40
  end
48
41
  end
49
42
 
43
+ def self.from_utf8(str)
44
+ return unless str
45
+
46
+ ptr = FFI::MemoryPointer.from_string(str)
47
+ ptr.autorelease = false
48
+ ptr
49
+ end
50
+
50
51
  class << self
51
52
  private
52
53
 
54
+ def from_simple_type_array(type, ary)
55
+ case type
56
+ when :utf8, :filename
57
+ from_utf8_array ary
58
+ when :gboolean
59
+ from_boolean_array ary
60
+ else
61
+ from_basic_type_array type, ary
62
+ end
63
+ end
64
+
65
+ def from_module_type_array(type, ary)
66
+ if type == GObject::Value
67
+ from_gvalue_array type, ary
68
+ elsif type < GirFFI::ClassBase
69
+ from_struct_array type, ary
70
+ elsif type.singleton_class.include? GirFFI::EnumBase
71
+ from_enum_array type, ary
72
+ else
73
+ raise NotImplementedError, type
74
+ end
75
+ end
76
+
53
77
  def from_utf8_array(ary)
54
78
  from_basic_type_array :pointer, ary.map { |str| from_utf8 str }
55
79
  end
@@ -90,17 +114,6 @@ module GirFFI
90
114
  from_basic_type_array :int32, ary.map { |sym| type.to_native sym, nil }
91
115
  end
92
116
 
93
- public
94
-
95
- def from_utf8(str)
96
- return unless str
97
- ptr = FFI::MemoryPointer.from_string(str)
98
- ptr.autorelease = false
99
- ptr
100
- end
101
-
102
- private
103
-
104
117
  def from_basic_type_array(type, ary)
105
118
  ffi_type = TypeMap.type_specification_to_ffi_type type
106
119
  type_size = FFI.type_size(ffi_type)
@@ -6,11 +6,13 @@ module GirFFI
6
6
  module IArgInfo
7
7
  def to_ffi_type
8
8
  return :pointer if direction != :in
9
+
9
10
  argument_type.to_ffi_type
10
11
  end
11
12
 
12
13
  def to_callback_ffi_type
13
14
  return :pointer if direction != :in
15
+
14
16
  argument_type.to_callback_ffi_type
15
17
  end
16
18
  end
@@ -8,6 +8,10 @@ module GirFFI
8
8
  Builder.build_class(self)
9
9
  end
10
10
 
11
+ def to_callback_ffi_type
12
+ :pointer
13
+ end
14
+
11
15
  def argument_ffi_types
12
16
  args.map(&:to_callback_ffi_type)
13
17
  end
@@ -10,6 +10,10 @@ module GirFFI
10
10
  to_type.to_ffi_type
11
11
  end
12
12
 
13
+ def to_callback_ffi_type
14
+ to_type.to_callback_ffi_type
15
+ end
16
+
13
17
  def to_type
14
18
  Builder.build_class self
15
19
  end
@@ -6,26 +6,8 @@ module GirFFI
6
6
  module InfoExt
7
7
  # Extensions for GObjectIntrospection::ITypeInfo needed by GirFFI
8
8
  module ITypeInfo
9
- def self.flattened_tag_to_gtype_map
10
- @flattened_tag_to_gtype_map ||= {
11
- [:array, true] => GObject::TYPE_ARRAY,
12
- [:c, true] => GObject::TYPE_POINTER,
13
- [:gboolean, false] => GObject::TYPE_BOOLEAN,
14
- [:ghash, true] => GObject::TYPE_HASH_TABLE,
15
- [:glist, true] => GObject::TYPE_POINTER,
16
- [:gint32, false] => GObject::TYPE_INT,
17
- [:gint64, false] => GObject::TYPE_INT64,
18
- [:guint64, false] => GObject::TYPE_UINT64,
19
- [:strv, true] => GObject::TYPE_STRV,
20
- [:utf8, true] => GObject::TYPE_STRING,
21
- [:void, true] => GObject::TYPE_POINTER,
22
- [:void, false] => GObject::TYPE_NONE
23
- }.freeze
24
- end
25
-
26
9
  def gtype
27
- return interface.gtype if tag == :interface
28
- ITypeInfo.flattened_tag_to_gtype_map.fetch [flattened_tag, pointer?]
10
+ TypeMap.type_info_to_gtype self
29
11
  end
30
12
 
31
13
  def make_g_value
@@ -57,7 +39,7 @@ module GirFFI
57
39
  end
58
40
 
59
41
  def hidden_struct_type?
60
- flattened_tag == :struct && interface.size.zero?
42
+ flattened_tag == :struct && interface.empty?
61
43
  end
62
44
 
63
45
  def tag_or_class
@@ -123,13 +105,7 @@ module GirFFI
123
105
 
124
106
  case tag
125
107
  when :interface
126
- # TODO: Move this logic into interface
127
- case interface.info_type
128
- when :enum, :flags
129
- :int32
130
- else
131
- :pointer
132
- end
108
+ interface.to_callback_ffi_type
133
109
  when :gboolean
134
110
  # TODO: Move this logic into TypeMap
135
111
  :bool
@@ -7,6 +7,7 @@ module GirFFI
7
7
  def safe_name
8
8
  name = self.name
9
9
  return '_' if name.empty?
10
+
10
11
  name
11
12
  end
12
13
  end
@@ -14,6 +14,7 @@ module GirFFI
14
14
  def setup_and_call(method, arguments, &block)
15
15
  method_name = setup_method method.to_s
16
16
  raise NoMethodError, "undefined method `#{method}' for #{self}" unless method_name
17
+
17
18
  send method_name, *arguments, &block
18
19
  end
19
20
 
@@ -24,5 +25,9 @@ module GirFFI
24
25
  def to_ffi_type
25
26
  :pointer
26
27
  end
28
+
29
+ def to_callback_ffi_type
30
+ :pointer
31
+ end
27
32
  end
28
33
  end
@@ -10,6 +10,7 @@ module GirFFI
10
10
  def method_missing(method, *arguments, &block)
11
11
  result = setup_method method.to_s
12
12
  return super unless result
13
+
13
14
  send method, *arguments, &block
14
15
  end
15
16
 
@@ -72,5 +72,15 @@ module GirFFI
72
72
  gir_ffi_builder.object_class_struct.wrap ptr
73
73
  end
74
74
  end
75
+
76
+ def self.included_interfaces
77
+ included_modules.select { |it| it.singleton_class.include? InterfaceBase }
78
+ end
79
+
80
+ def self.registered_ancestors
81
+ ancestors.select do |it|
82
+ it < GirFFI::ObjectBase || it.singleton_class.include?(InterfaceBase)
83
+ end
84
+ end
75
85
  end
76
86
  end
@@ -10,6 +10,7 @@ module GirFFI
10
10
 
11
11
  def store(obj)
12
12
  return FFI::Pointer::NULL if obj.nil?
13
+
13
14
  # FIXME: Don't use object_id!
14
15
  key = obj.object_id
15
16
  @store[key] = obj
@@ -18,6 +19,7 @@ module GirFFI
18
19
 
19
20
  def fetch(ptr)
20
21
  return if ptr.null?
22
+
21
23
  key = ptr.address
22
24
  if @store.key? key
23
25
  @store[key]
@@ -2,7 +2,7 @@
2
2
 
3
3
  module GirFFI
4
4
  # Class to represent the info for the receiver argument of a callback or
5
- # signal handler. Implements the necessary parts of IArgumentInfo's
5
+ # signal handler. Implements the necessary parts of IArgInfo's
6
6
  # interface.
7
7
  class ReceiverArgumentInfo
8
8
  attr_reader :argument_type
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GirFFI
4
- # Represents a return value with the same interface as IArgumentInfo
4
+ # Represents a return value with the same interface as IArgInfo
5
5
  class ReturnValueInfo
6
6
  attr_reader :argument_type
7
7
  attr_reader :ownership_transfer
@@ -39,9 +39,9 @@ module GirFFI
39
39
  pointer + offset
40
40
  end
41
41
 
42
- def self.copy_value_to_pointer(value, pointer)
42
+ def self.copy_value_to_pointer(value, pointer, offset = 0)
43
43
  size = value.size_in_bytes
44
- pointer.put_bytes(0, value.to_ptr.read_bytes(size))
44
+ pointer.put_bytes(offset, value.to_ptr.read_bytes(size))
45
45
  end
46
46
 
47
47
  def self.wrap(element_type, size, pointer)
@@ -72,24 +72,17 @@ module GirFFI
72
72
  end
73
73
  end
74
74
 
75
- def copy_from(element_type, size, item)
76
- return unless item
75
+ def copy_from(element_type, size, enumerable)
76
+ return unless enumerable
77
77
 
78
- enumerable = case item
79
- when FFI::Pointer
80
- wrap(element_type, size, item).to_a
81
- when self
82
- item.to_a
83
- else
84
- item
85
- end
78
+ arr = enumerable.to_a
86
79
  case element_type
87
80
  when Array
88
81
  _main_type, sub_type = *element_type
89
- enumerable = enumerable.map { |it| sub_type.copy_from it }
82
+ arr = arr.map { |it| sub_type.copy_from it }
90
83
  end
91
84
 
92
- from_enumerable element_type, size, enumerable
85
+ from_enumerable element_type, size, arr
93
86
  end
94
87
 
95
88
  private