gir_ffi 0.10.2 → 0.11.0

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