gir_ffi 0.13.0 → 0.13.1

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