gir_ffi 0.10.2 → 0.11.0

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 (113) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +13 -0
  3. data/Gemfile +9 -4
  4. data/README.md +3 -2
  5. data/Rakefile +2 -1
  6. data/lib/ffi-glib/byte_array.rb +1 -1
  7. data/lib/ffi-glib/main_loop.rb +2 -1
  8. data/lib/ffi-glib/strv.rb +5 -2
  9. data/lib/ffi-glib/variant.rb +3 -5
  10. data/lib/ffi-glib.rb +4 -0
  11. data/lib/ffi-gobject/closure.rb +8 -10
  12. data/lib/ffi-gobject/object.rb +9 -6
  13. data/lib/ffi-gobject/param_spec.rb +4 -0
  14. data/lib/ffi-gobject/value.rb +13 -16
  15. data/lib/ffi-gobject_introspection/gobject_type_init.rb +18 -0
  16. data/lib/ffi-gobject_introspection/i_callable_info.rb +1 -5
  17. data/lib/ffi-gobject_introspection/i_constant_info.rb +3 -3
  18. data/lib/ffi-gobject_introspection/i_repository.rb +3 -47
  19. data/lib/ffi-gobject_introspection/i_vfunc_info.rb +3 -11
  20. data/lib/ffi-gobject_introspection/lib.rb +8 -31
  21. data/lib/{gir_ffi-base/glib → ffi-gobject_introspection}/strv.rb +9 -13
  22. data/lib/ffi-gobject_introspection.rb +47 -2
  23. data/lib/gir_ffi/allocation_helper.rb +1 -19
  24. data/lib/gir_ffi/arg_helper.rb +36 -26
  25. data/lib/{gir_ffi-base/glib → gir_ffi}/boolean.rb +7 -5
  26. data/lib/gir_ffi/boxed_base.rb +5 -23
  27. data/lib/gir_ffi/builder.rb +3 -3
  28. data/lib/gir_ffi/builders/argument_builder.rb +7 -8
  29. data/lib/gir_ffi/builders/base_argument_builder.rb +0 -1
  30. data/lib/gir_ffi/builders/callback_argument_builder.rb +2 -2
  31. data/lib/gir_ffi/builders/callback_return_value_builder.rb +21 -13
  32. data/lib/gir_ffi/builders/field_builder.rb +4 -10
  33. data/lib/gir_ffi/builders/module_builder.rb +6 -4
  34. data/lib/gir_ffi/builders/object_builder.rb +16 -16
  35. data/lib/gir_ffi/builders/struct_builder.rb +4 -6
  36. data/lib/gir_ffi/builders/struct_like.rb +1 -1
  37. data/lib/gir_ffi/builders/user_defined_builder.rb +83 -23
  38. data/lib/gir_ffi/builders/vfunc_argument_builder.rb +12 -17
  39. data/lib/gir_ffi/class_base.rb +0 -4
  40. data/lib/gir_ffi/core.rb +16 -13
  41. data/lib/gir_ffi/enum_base.rb +2 -41
  42. data/lib/gir_ffi/enum_like_base.rb +48 -0
  43. data/lib/gir_ffi/ffi_ext/pointer.rb +1 -1
  44. data/lib/gir_ffi/flags_base.rb +2 -41
  45. data/lib/gir_ffi/in_out_pointer.rb +1 -1
  46. data/lib/gir_ffi/in_pointer.rb +4 -4
  47. data/lib/gir_ffi/info_ext/i_type_info.rb +14 -5
  48. data/lib/gir_ffi/info_ext/i_vfunc_info.rb +8 -0
  49. data/lib/gir_ffi/module_base.rb +4 -0
  50. data/lib/gir_ffi/receiver_argument_info.rb +1 -1
  51. data/lib/gir_ffi/sized_array.rb +6 -6
  52. data/lib/gir_ffi/struct_base.rb +1 -6
  53. data/lib/gir_ffi/struct_like_base.rb +54 -45
  54. data/lib/gir_ffi/type_map.rb +6 -7
  55. data/lib/gir_ffi/union_base.rb +1 -1
  56. data/lib/gir_ffi/{user_defined_type_info.rb → user_defined_object_info.rb} +1 -2
  57. data/lib/gir_ffi/user_defined_property_info.rb +80 -2
  58. data/lib/gir_ffi/version.rb +1 -1
  59. data/lib/gir_ffi-base/gobject/lib.rb +0 -1
  60. data/lib/gir_ffi-base/gobject.rb +3 -5
  61. data/lib/gir_ffi-base.rb +3 -8
  62. data/tasks/test.rake +17 -3
  63. data/test/base_test_helper.rb +39 -23
  64. data/test/ffi-glib/closure_test.rb +37 -0
  65. data/test/ffi-glib/main_loop_test.rb +24 -0
  66. data/test/ffi-glib/ruby_closure_test.rb +0 -5
  67. data/test/ffi-gobject/object_test.rb +6 -10
  68. data/test/ffi-gobject/param_spec_test.rb +17 -5
  69. data/test/ffi-gobject/value_test.rb +15 -6
  70. data/test/ffi-gobject_introspection/gobject_type_init_test.rb +25 -0
  71. data/test/ffi-gobject_introspection/i_base_info_test.rb +1 -1
  72. data/test/ffi-gobject_introspection/i_repository_test.rb +18 -0
  73. data/test/ffi-gobject_introspection/i_vfunc_info_test.rb +40 -0
  74. data/test/{gir_ffi-base/glib → ffi-gobject_introspection}/strv_test.rb +8 -8
  75. data/test/gir_ffi/allocation_helper_test.rb +35 -0
  76. data/test/gir_ffi/arg_helper_test.rb +102 -7
  77. data/test/gir_ffi/boolean_test.rb +34 -0
  78. data/test/gir_ffi/boxed_base_test.rb +46 -6
  79. data/test/gir_ffi/builder_test.rb +88 -29
  80. data/test/gir_ffi/builders/argument_builder_test.rb +19 -0
  81. data/test/gir_ffi/builders/callback_argument_builder_test.rb +17 -0
  82. data/test/gir_ffi/builders/callback_return_value_builder_test.rb +1 -1
  83. data/test/gir_ffi/builders/field_builder_test.rb +2 -1
  84. data/test/gir_ffi/builders/struct_builder_test.rb +42 -25
  85. data/test/gir_ffi/builders/user_defined_builder_test.rb +365 -17
  86. data/test/gir_ffi/builders/vfunc_argument_builder_test.rb +100 -0
  87. data/test/gir_ffi/builders/vfunc_builder_test.rb +5 -3
  88. data/test/{gir_ffi_test.rb → gir_ffi/core_test.rb} +8 -6
  89. data/test/gir_ffi/in_out_pointer_test.rb +1 -1
  90. data/test/gir_ffi/receiver_argument_info_test.rb +32 -0
  91. data/test/gir_ffi/sized_array_test.rb +34 -0
  92. data/test/gir_ffi/struct_base_test.rb +4 -32
  93. data/test/gir_ffi/struct_like_base_test.rb +164 -0
  94. data/test/gir_ffi/union_base_test.rb +4 -20
  95. data/test/gir_ffi/{user_defined_type_info_test.rb → user_defined_object_info_test.rb} +10 -10
  96. data/test/gir_ffi/user_defined_property_info_test.rb +22 -5
  97. data/test/gir_ffi/version_test.rb +1 -1
  98. data/test/integration/callback_exceptions_test.rb +2 -0
  99. data/test/integration/derived_classes_test.rb +2 -0
  100. data/test/integration/generated_everything_test.rb +22 -0
  101. data/test/integration/generated_gimarshallingtests_test.rb +23 -21
  102. data/test/integration/generated_gio_test.rb +2 -0
  103. data/test/integration/generated_glib_test.rb +2 -0
  104. data/test/integration/generated_gst_test.rb +2 -0
  105. data/test/integration/generated_gtop_test.rb +2 -0
  106. data/test/integration/generated_regress_test.rb +113 -29
  107. data/test/integration/generated_secret_test.rb +2 -0
  108. data/test/integration/generated_warnlib_test.rb +2 -0
  109. data/test/integration/method_lookup_test.rb +2 -0
  110. data/test/introspection_test_helper.rb +15 -0
  111. metadata +21 -27
  112. data/lib/gir_ffi-base/glib.rb +0 -8
  113. data/test/gir_ffi-base/glib/boolean_test.rb +0 -34
data/lib/gir_ffi/core.rb CHANGED
@@ -2,10 +2,10 @@
2
2
  require 'ffi'
3
3
  require 'ffi/bit_masks'
4
4
 
5
- require 'gir_ffi-base'
6
-
7
5
  require 'ffi-gobject_introspection'
8
6
 
7
+ require 'gir_ffi-base'
8
+
9
9
  require 'gir_ffi/ffi_ext'
10
10
  require 'gir_ffi/class_base'
11
11
  require 'gir_ffi/type_map'
@@ -16,22 +16,25 @@ require 'gir_ffi/sized_array'
16
16
  require 'gir_ffi/zero_terminated'
17
17
  require 'gir_ffi/arg_helper'
18
18
  require 'gir_ffi/builder'
19
- require 'gir_ffi/user_defined_type_info'
19
+ require 'gir_ffi/user_defined_object_info'
20
20
  require 'gir_ffi/builders/user_defined_builder'
21
21
  require 'gir_ffi/version'
22
22
 
23
- # Main module containing classes and modules needed for generating GLib and
24
- # GObject bindings.
25
23
  module GirFFI
26
- def self.setup(namespace, version = nil)
27
- namespace = namespace.to_s
28
- GirFFI::Builder.build_module namespace, version
29
- end
24
+ # Core GirFFI interface.
25
+ module Core
26
+ def setup(namespace, version = nil)
27
+ namespace = namespace.to_s
28
+ Builder.build_module namespace, version
29
+ end
30
30
 
31
- def self.define_type(klass, &block)
32
- info = UserDefinedTypeInfo.new(klass, &block)
33
- Builders::UserDefinedBuilder.new(info).build_class
31
+ def define_type(klass, &block)
32
+ info = UserDefinedObjectInfo.new(klass, &block)
33
+ Builders::UserDefinedBuilder.new(info).build_class
34
34
 
35
- klass.gtype
35
+ klass.gtype
36
+ end
36
37
  end
37
38
  end
39
+
40
+ GirFFI.extend GirFFI::Core
@@ -1,11 +1,10 @@
1
1
  # frozen_string_literal: true
2
- require 'gir_ffi/registered_type_base'
2
+ require 'gir_ffi/enum_like_base'
3
3
 
4
4
  module GirFFI
5
5
  # Base module for enums.
6
6
  module EnumBase
7
- include FFI::DataConverter
8
- include RegisteredTypeBase
7
+ include EnumLikeBase
9
8
 
10
9
  def native_type
11
10
  self::Enum.native_type
@@ -22,43 +21,5 @@ module GirFFI
22
21
  def [](arg)
23
22
  self::Enum[arg]
24
23
  end
25
-
26
- def wrap(arg)
27
- self[arg]
28
- end
29
-
30
- def from(arg)
31
- self[arg]
32
- end
33
-
34
- def size
35
- native_type.size
36
- end
37
-
38
- def copy_value_to_pointer(value, pointer)
39
- pointer.put_int32 0, to_native(value, nil)
40
- end
41
-
42
- def get_value_from_pointer(pointer, offset)
43
- from_native pointer.get_int32(offset), nil
44
- end
45
-
46
- def setup_and_call(method, arguments, &block)
47
- result = setup_method method.to_s
48
-
49
- unless result
50
- raise "Unable to set up method #{method} in #{self}"
51
- end
52
-
53
- send method, *arguments, &block
54
- end
55
-
56
- def to_ffi_type
57
- self
58
- end
59
-
60
- def setup_method(name)
61
- gir_ffi_builder.setup_method name
62
- end
63
24
  end
64
25
  end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+ require 'gir_ffi/registered_type_base'
3
+
4
+ module GirFFI
5
+ # Base module for enums and flags.
6
+ module EnumLikeBase
7
+ include FFI::DataConverter
8
+ include RegisteredTypeBase
9
+
10
+ def wrap(arg)
11
+ self[arg]
12
+ end
13
+
14
+ def from(arg)
15
+ self[arg]
16
+ end
17
+
18
+ def size
19
+ native_type.size
20
+ end
21
+
22
+ def copy_value_to_pointer(value, pointer)
23
+ pointer.put_int32 0, to_native(value, nil)
24
+ end
25
+
26
+ def get_value_from_pointer(pointer, offset)
27
+ from_native pointer.get_int32(offset), nil
28
+ end
29
+
30
+ def setup_and_call(method, arguments, &block)
31
+ result = setup_method method.to_s
32
+
33
+ unless result
34
+ raise "Unable to set up method #{method} in #{self}"
35
+ end
36
+
37
+ send method, *arguments, &block
38
+ end
39
+
40
+ def to_ffi_type
41
+ self
42
+ end
43
+
44
+ def setup_method(name)
45
+ gir_ffi_builder.setup_method name
46
+ end
47
+ end
48
+ end
@@ -25,7 +25,7 @@ module GirFFI
25
25
  end
26
26
  end
27
27
 
28
- FFI::Pointer.send :include, GirFFI::FFIExt::Pointer
28
+ FFI::Pointer.prepend GirFFI::FFIExt::Pointer
29
29
 
30
30
  FFI::Pointer.class_eval do
31
31
  case FFI.type_size(:size_t)
@@ -1,11 +1,10 @@
1
1
  # frozen_string_literal: true
2
- require 'gir_ffi/registered_type_base'
2
+ require 'gir_ffi/enum_like_base'
3
3
 
4
4
  module GirFFI
5
5
  # Base module for flags.
6
6
  module FlagsBase
7
- include FFI::DataConverter
8
- include RegisteredTypeBase
7
+ include EnumLikeBase
9
8
 
10
9
  def native_type
11
10
  self::BitMask.native_type
@@ -26,43 +25,5 @@ module GirFFI
26
25
  def [](arg)
27
26
  self::BitMask[arg]
28
27
  end
29
-
30
- def wrap(arg)
31
- self[arg]
32
- end
33
-
34
- def from(arg)
35
- self[arg]
36
- end
37
-
38
- def size
39
- native_type.size
40
- end
41
-
42
- def copy_value_to_pointer(value, pointer)
43
- pointer.put_int32 0, to_native(value, nil)
44
- end
45
-
46
- def get_value_from_pointer(pointer, offset)
47
- from_native pointer.get_int32(offset), nil
48
- end
49
-
50
- def setup_and_call(method, arguments, &block)
51
- result = setup_method method.to_s
52
-
53
- unless result
54
- raise "Unable to set up method #{method} in #{self}"
55
- end
56
-
57
- send method, *arguments, &block
58
- end
59
-
60
- def to_ffi_type
61
- self
62
- end
63
-
64
- def setup_method(name)
65
- gir_ffi_builder.setup_method name
66
- end
67
28
  end
68
29
  end
@@ -39,7 +39,7 @@ module GirFFI
39
39
 
40
40
  def self.allocate_new(type)
41
41
  ffi_type = TypeMap.type_specification_to_ffi_type type
42
- ptr = AllocationHelper.allocate(ffi_type)
42
+ ptr = FFI::MemoryPointer.new(ffi_type)
43
43
  new type, ptr
44
44
  end
45
45
 
@@ -103,10 +103,10 @@ module GirFFI
103
103
  def from_basic_type_array(type, ary)
104
104
  ffi_type = TypeMap.type_specification_to_ffi_type type
105
105
  type_size = FFI.type_size(ffi_type)
106
- block = FFI::MemoryPointer.new type_size * (ary.length + 1)
107
- block.autorelease = false
108
- block.send "put_array_of_#{ffi_type}", 0, ary
109
- block
106
+ FFI::MemoryPointer.new(type_size * (ary.length + 1)).tap do |block|
107
+ block.autorelease = false
108
+ block.send "put_array_of_#{ffi_type}", 0, ary
109
+ end
110
110
  end
111
111
  end
112
112
  end
@@ -55,10 +55,14 @@ module GirFFI
55
55
  tag == :interface && interface.info_type
56
56
  end
57
57
 
58
+ def hidden_struct_type?
59
+ flattened_tag == :struct && interface.size.zero?
60
+ end
61
+
58
62
  def tag_or_class
59
63
  base = case tag
60
64
  when :interface
61
- Builder.build_class interface
65
+ interface_class
62
66
  when :ghash
63
67
  [tag, *element_type]
64
68
  else
@@ -71,6 +75,10 @@ module GirFFI
71
75
  end
72
76
  end
73
77
 
78
+ def interface_class
79
+ Builder.build_class interface if tag == :interface
80
+ end
81
+
74
82
  TAG_TO_WRAPPER_CLASS_MAP = {
75
83
  array: 'GLib::Array',
76
84
  byte_array: 'GLib::ByteArray',
@@ -88,11 +96,12 @@ module GirFFI
88
96
 
89
97
  # TODO: Use class rather than class name
90
98
  def argument_class_name
91
- if tag == :interface
92
- interface.full_type_name
93
- else
99
+ interface_class_name ||
94
100
  TAG_TO_WRAPPER_CLASS_MAP[flattened_tag]
95
- end
101
+ end
102
+
103
+ def interface_class_name
104
+ interface.full_type_name if tag == :interface
96
105
  end
97
106
 
98
107
  def to_ffi_type
@@ -13,6 +13,14 @@ module GirFFI
13
13
  def return_ffi_type
14
14
  return_type.to_callback_ffi_type
15
15
  end
16
+
17
+ def invoker_name
18
+ invoker && invoker.name
19
+ end
20
+
21
+ def has_invoker?
22
+ invoker
23
+ end
16
24
  end
17
25
  end
18
26
  end
@@ -8,6 +8,10 @@ module GirFFI
8
8
  send method, *arguments, &block
9
9
  end
10
10
 
11
+ def respond_to_missing?(method, *)
12
+ gir_ffi_builder.method_available? method
13
+ end
14
+
11
15
  def const_missing(classname)
12
16
  load_class(classname)
13
17
  end
@@ -14,8 +14,8 @@ module GirFFI
14
14
  :in
15
15
  end
16
16
 
17
+ # Assume we don't need to increase the refcount for the receiver argument.
17
18
  def ownership_transfer
18
- # FIXME: Make an informed choice for this.
19
19
  :everything
20
20
  end
21
21
 
@@ -16,7 +16,7 @@ module GirFFI
16
16
  end
17
17
 
18
18
  def index(idx)
19
- ptr = GirFFI::InOutPointer.new element_type, @pointer + idx * element_size
19
+ ptr = InOutPointer.new element_type, @pointer + idx * element_size
20
20
  ptr.to_ruby_value
21
21
  end
22
22
 
@@ -27,7 +27,7 @@ module GirFFI
27
27
  end
28
28
 
29
29
  def ==(other)
30
- to_a == other.to_a
30
+ to_a.eql? other.to_a
31
31
  end
32
32
 
33
33
  def size_in_bytes
@@ -40,7 +40,7 @@ module GirFFI
40
40
 
41
41
  def self.copy_value_to_pointer(value, pointer)
42
42
  size = value.size_in_bytes
43
- pointer.put_bytes(0, value.to_ptr.read_bytes(size), 0, size)
43
+ pointer.put_bytes(0, value.to_ptr.read_bytes(size))
44
44
  end
45
45
 
46
46
  def self.wrap(element_type, size, pointer)
@@ -50,7 +50,7 @@ module GirFFI
50
50
  private
51
51
 
52
52
  def element_ffi_type
53
- @element_ffi_type ||= GirFFI::TypeMap.type_specification_to_ffi_type element_type
53
+ @element_ffi_type ||= TypeMap.type_specification_to_ffi_type element_type
54
54
  end
55
55
 
56
56
  def element_size
@@ -101,12 +101,12 @@ module GirFFI
101
101
  def from_enumerable(element_type, expected_size, arr)
102
102
  size = arr.size
103
103
  check_size expected_size, size
104
- ptr = GirFFI::InPointer.from_array element_type, arr
104
+ ptr = InPointer.from_array element_type, arr
105
105
  wrap element_type, size, ptr
106
106
  end
107
107
 
108
108
  def check_size(expected_size, size)
109
- if expected_size > 0 && size != expected_size
109
+ if expected_size != -1 && size != expected_size
110
110
  raise ArgumentError, "Expected size #{expected_size}, got #{size}"
111
111
  end
112
112
  end
@@ -5,17 +5,12 @@ module GirFFI
5
5
  # Base class for generated classes representing GLib structs.
6
6
  class StructBase < ClassBase
7
7
  extend FFI::DataConverter
8
- extend GirFFI::StructLikeBase
8
+ include GirFFI::StructLikeBase
9
9
 
10
10
  def initialize
11
11
  @struct = self.class::Struct.new
12
12
  @struct.owned = true
13
13
  @struct.to_ptr.autorelease = false
14
14
  end
15
-
16
- # Wrap value and take ownership of it
17
- def self.wrap_own(val)
18
- own wrap(val)
19
- end
20
15
  end
21
16
  end
@@ -3,62 +3,71 @@ module GirFFI
3
3
  # Base module providing class methods for generated classes representing GLib
4
4
  # structs, unions and boxed types.
5
5
  module StructLikeBase
6
- def native_type
7
- FFI::Type::Struct.new(self::Struct)
6
+ def self.included(base)
7
+ base.extend ClassMethods
8
8
  end
9
9
 
10
- def to_ffi_type
11
- self
12
- end
10
+ # Class methods for struct-like classes.
11
+ module ClassMethods
12
+ def native_type
13
+ FFI::Type::Struct.new(self::Struct)
14
+ end
13
15
 
14
- # NOTE: Needed for JRuby's FFI
15
- def to_native(value, _context)
16
- value.struct
17
- end
16
+ def to_ffi_type
17
+ self
18
+ end
18
19
 
19
- def get_value_from_pointer(pointer, offset)
20
- pointer + offset
21
- end
20
+ # NOTE: Needed for JRuby's FFI
21
+ def to_native(value, _context)
22
+ value.struct
23
+ end
22
24
 
23
- def size
24
- self::Struct.size
25
- end
25
+ def get_value_from_pointer(pointer, offset)
26
+ pointer + offset
27
+ end
26
28
 
27
- def copy_value_to_pointer(value, pointer, offset = 0)
28
- size = self::Struct.size
29
- bytes = if value
30
- value.to_ptr.read_bytes(size)
31
- else
32
- "\x00" * size
33
- end
34
- pointer.put_bytes offset, bytes, 0, size
35
- end
29
+ def size
30
+ self::Struct.size
31
+ end
36
32
 
37
- # Create an unowned copy of the struct represented by val
38
- def copy_from(val)
39
- disown copy from(val)
40
- end
33
+ def copy_value_to_pointer(value, pointer, offset = 0)
34
+ bytes = value.to_ptr.read_bytes(size)
35
+ pointer.put_bytes offset, bytes
36
+ end
41
37
 
42
- # Wrap an owned copy of the struct represented by val
43
- def wrap_copy(val)
44
- own copy wrap(val)
45
- end
38
+ # Create an unowned copy of the struct represented by val
39
+ def copy_from(val)
40
+ disown copy from(val)
41
+ end
46
42
 
47
- def own(val)
48
- val.struct.owned = true if val
49
- val
50
- end
43
+ # Wrap an owned copy of the struct represented by val
44
+ def wrap_copy(val)
45
+ own copy(val)
46
+ end
51
47
 
52
- def disown(val)
53
- val.struct.owned = false if val
54
- val
55
- end
48
+ # Wrap value and take ownership of it
49
+ def wrap_own(val)
50
+ own wrap(val)
51
+ end
52
+
53
+ private
54
+
55
+ def own(val)
56
+ val.struct.owned = true if val
57
+ val
58
+ end
59
+
60
+ def disown(val)
61
+ val.struct.owned = nil if val
62
+ val
63
+ end
56
64
 
57
- # Create a copy of the struct represented by val
58
- def copy(val)
59
- return unless val
60
- new.tap do |copy|
61
- copy_value_to_pointer(val, copy.to_ptr)
65
+ # Create a copy of the struct represented by val
66
+ def copy(val)
67
+ return unless val
68
+ new.tap do |copy|
69
+ copy_value_to_pointer(val, copy.to_ptr)
70
+ end
62
71
  end
63
72
  end
64
73
  end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+ require 'gir_ffi/boolean'
2
3
  require 'gir_ffi/sized_array'
3
4
 
4
5
  module GirFFI
@@ -14,25 +15,27 @@ module GirFFI
14
15
  glist: :pointer,
15
16
  gslist: :pointer,
16
17
  strv: :pointer,
17
- object: :pointer,
18
- struct: :pointer,
18
+ interface: :pointer,
19
19
  error: :pointer,
20
20
  ptr_array: :pointer,
21
21
  array: :pointer,
22
22
  c: GirFFI::SizedArray,
23
23
  utf8: :pointer,
24
24
  GType: gsize_type,
25
- gboolean: GLib::Boolean,
25
+ gboolean: GirFFI::Boolean,
26
26
  gunichar: :uint32,
27
27
  gint8: :int8,
28
28
  guint8: :uint8,
29
29
  gint16: :int16,
30
30
  guint16: :uint16,
31
31
  gint: :int,
32
+ guint: :uint,
32
33
  gint32: :int32,
33
34
  guint32: :uint32,
34
35
  gint64: :int64,
35
36
  guint64: :uint64,
37
+ glong: :long,
38
+ gulong: :ulong,
36
39
  gsize: gsize_type,
37
40
  gfloat: :float,
38
41
  gdouble: :double,
@@ -44,10 +47,6 @@ module GirFFI
44
47
  TAG_TYPE_MAP[sym] || sym
45
48
  end
46
49
 
47
- def self.type_specification_to_ffitype(type)
48
- type_specification_to_ffi_type type
49
- end
50
-
51
50
  def self.type_specification_to_ffi_type(type)
52
51
  case type
53
52
  when Module
@@ -5,7 +5,7 @@ module GirFFI
5
5
  # Base class for generated classes representing GLib unions.
6
6
  class UnionBase < ClassBase
7
7
  extend FFI::DataConverter
8
- extend GirFFI::StructLikeBase
8
+ include GirFFI::StructLikeBase
9
9
 
10
10
  def initialize
11
11
  @struct = self.class::Struct.new
@@ -5,8 +5,7 @@ require 'gir_ffi/vfunc_implementation'
5
5
  module GirFFI
6
6
  # Represents a user defined type, conforming, as needed, to the interface of
7
7
  # GObjectIntrospection::IObjectInfo.
8
- # TODO: Rename to UserDefinedObjectInfo
9
- class UserDefinedTypeInfo
8
+ class UserDefinedObjectInfo
10
9
  attr_reader :properties, :vfunc_implementations
11
10
 
12
11
  def initialize(klass)
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  module GirFFI
3
- # Represents a property of a user defined type, conforming, as needed, to the
4
- # interface of GObjectIntrospection::IPropertyInfo.
3
+ # Represents a property of a user defined type.
5
4
  class UserDefinedPropertyInfo
6
5
  def initialize(param_spec)
7
6
  @param_spec = param_spec
@@ -12,5 +11,84 @@ module GirFFI
12
11
  def name
13
12
  @param_spec.get_name
14
13
  end
14
+
15
+ def accessor_name
16
+ @param_spec.accessor_name
17
+ end
18
+
19
+ def writable?
20
+ @param_spec.flags[:writable]
21
+ end
22
+
23
+ def value_type
24
+ @param_spec.value_type
25
+ end
26
+
27
+ # TODO: Unify with InfoExt::ITypeInfo.flattened_tag_to_gtype_map
28
+ G_TYPE_POINTER_MAP = {
29
+ GObject::TYPE_BOOLEAN => false,
30
+ GObject::TYPE_CHAR => false,
31
+ GObject::TYPE_UCHAR => false,
32
+ GObject::TYPE_FLOAT => false,
33
+ GObject::TYPE_DOUBLE => false,
34
+ GObject::TYPE_INT => false,
35
+ GObject::TYPE_UINT => false,
36
+ GObject::TYPE_LONG => false,
37
+ GObject::TYPE_ULONG => false,
38
+ GObject::TYPE_INT64 => false,
39
+ GObject::TYPE_UINT64 => false,
40
+ GObject::TYPE_ENUM => false,
41
+ GObject::TYPE_FLAGS => false,
42
+ GObject::TYPE_STRING => true,
43
+ GObject::TYPE_BOXED => true,
44
+ GObject::TYPE_OBJECT => true
45
+ }.freeze
46
+
47
+ def pointer_type?
48
+ G_TYPE_POINTER_MAP.fetch(fundamental_value_type)
49
+ end
50
+
51
+ # TODO: Unify with InfoExt::ITypeInfo.flattened_tag_to_gtype_map
52
+ G_TYPE_TAG_MAP = {
53
+ GObject::TYPE_BOOLEAN => :gboolean,
54
+ GObject::TYPE_CHAR => :gint8,
55
+ GObject::TYPE_UCHAR => :guint8,
56
+ GObject::TYPE_FLOAT => :gfloat,
57
+ GObject::TYPE_DOUBLE => :gdouble,
58
+ GObject::TYPE_INT => :gint,
59
+ GObject::TYPE_UINT => :guint,
60
+ GObject::TYPE_LONG => :glong,
61
+ GObject::TYPE_ULONG => :gulong,
62
+ GObject::TYPE_INT64 => :gint64,
63
+ GObject::TYPE_UINT64 => :guint64,
64
+ GObject::TYPE_ENUM => :interface,
65
+ GObject::TYPE_FLAGS => :interface,
66
+ GObject::TYPE_STRING => :utf8,
67
+ GObject::TYPE_BOXED => :interface,
68
+ GObject::TYPE_OBJECT => :interface
69
+ }.freeze
70
+
71
+ def type_tag
72
+ G_TYPE_TAG_MAP.fetch(fundamental_value_type)
73
+ end
74
+
75
+ G_TYPE_INTERFACE_TAG_MAP = {
76
+ GObject::TYPE_ENUM => :enum,
77
+ GObject::TYPE_FLAGS => :flags,
78
+ GObject::TYPE_BOXED => :struct,
79
+ GObject::TYPE_OBJECT => :object
80
+ }.freeze
81
+
82
+ def interface_type_tag
83
+ G_TYPE_INTERFACE_TAG_MAP.fetch(fundamental_value_type)
84
+ end
85
+
86
+ def fundamental_value_type
87
+ @fundamental_value_type ||= GObject.type_fundamental value_type
88
+ end
89
+
90
+ def ffi_type
91
+ GirFFI::TypeMap.map_basic_type(type_tag)
92
+ end
15
93
  end
16
94
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
  # Current GirFFI version
3
3
  module GirFFI
4
- VERSION = '0.10.2'.freeze
4
+ VERSION = '0.11.0'.freeze
5
5
  end