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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 87a8f4c01010d8c1d510e080f58ebc0cc601b163
4
- data.tar.gz: 25eae9388e40ac27eb7724ca335d21c5a6dd0b80
3
+ metadata.gz: 40ea5b819bf924354aa3422d6d50f16b273c2da6
4
+ data.tar.gz: 6da1f53d118bca0abccf87a2e4540bc6dc0f879f
5
5
  SHA512:
6
- metadata.gz: 7c045bfc9d552fc6fec83cfe4aa222f123c3df3bd0327b0768f247ff3257d31debf9da3704523d95c6601c3a09afddb6d743d23ef8f4f74af2242d5bd78915e2
7
- data.tar.gz: 16e9ebda8c005d7b9363f76d4a8a9c79e5fc26ab07298f27f087c688fd955db771b762bd0c9e6e9ec2b92653573fbdb52d29e395a630aee81814cb09ac0b97a7
6
+ metadata.gz: c2bc2ce1e2c881277554af8fe4e4b937518761f218b920442f56c0974caf67721751b2aee983acb02737e029fde356c5bbe71106bab0c73bf42311bd10021987
7
+ data.tar.gz: 0fe6972ea1da4b0dddd910efb36aeae78940bd4a3de5812b4e1dbe64fde8bd74795739e639f7bc17620121f37fe63a1e10a04559bf0d567d4c7aa13a1c440525
data/Changelog.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.11.0 / 2016-10-16
4
+
5
+ * Internal test and code improvements. Some internal APIs have been removed or
6
+ changed.
7
+ * Make Strv#each thread-safe.
8
+ * Drop support for CRuby 2.0.
9
+ * Move type_init and base Strv implementation into GObjectIntrospection, making
10
+ it stand-alone.
11
+ * Move GLib::Boolean to GirFFI::Boolean.
12
+ * Guard against instantiating abstract classes using the default constructor.
13
+ * Handle user-defined properties containing dashes
14
+ * Handle user-defined properties of a large number of types
15
+
3
16
  ## 0.10.2 / 2016-04-29
4
17
 
5
18
  * Update ffi-bit_masks dependency and remove monkey-patch
data/Gemfile CHANGED
@@ -4,13 +4,18 @@ source 'https://rubygems.org'
4
4
  # The gem's dependencies are specified in gir_ffi.gemspec
5
5
  gemspec
6
6
 
7
- gem 'rubocop', '~> 0.39.0', type: :development
7
+ gem 'rubocop', '~> 0.43.0', group: :development
8
+
9
+ gem 'mutant', git: 'https://github.com/mbj/mutant.git',
10
+ branch: 'feature/minitest-integration',
11
+ platform: :mri_23,
12
+ group: :development
8
13
 
9
14
  if ENV['CI']
10
15
  if ENV['TRAVIS_RUBY_VERSION'] == '2.2'
11
- gem 'coveralls', type: :development
16
+ gem 'coveralls', group: :development
12
17
  end
13
18
  else
14
- gem 'simplecov', '~> 0.11.0', type: :development, platform: :mri
15
- gem 'pry', '~> 0.10.0', type: :development
19
+ gem 'simplecov', '~> 0.12.0', group: :development, platform: :mri
20
+ gem 'pry', '~> 0.10.0', group: :development
16
21
  end
data/README.md CHANGED
@@ -53,7 +53,7 @@ examples can be found in `gir_ffi-gtk` and `gir_ffi-gst`.
53
53
 
54
54
  ## Requirements
55
55
 
56
- GirFFI is tested on CRuby 2.0.0, 2.1, 2.2 and 2.3, JRuby 9.0.0.0, and on
56
+ GirFFI is tested on CRuby 2.1, 2.2 and 2.3, JRuby 9.0 and 9.1, and on
57
57
  Rubinius 3.
58
58
 
59
59
  You will also need gobject-introspection installed with some
@@ -70,10 +70,11 @@ On Debian and Ubuntu, installing `libgirepository1.0-1` and `gir1.2-glib-2.0`
70
70
  should be enough to use GirFFI in your application.
71
71
 
72
72
  To run the tests, you should additionally install `libgirepository1.0-dev`,
73
- `gobject-introspection`, `gir1.2-gtop-2.0`, `gir1.2-pango-1.0`,
73
+ `libcairo2-dev`, `gobject-introspection`, `gir1.2-gtop-2.0`, `gir1.2-pango-1.0`,
74
74
  `gir1.2-secret-1` and `gir1.2-gstreamer-1.0`. This should be enough to get
75
75
  `rake test` working.
76
76
 
77
+
77
78
  GirFFI has not been tested on Mac OS X or Microsoft Windows. YMMV.
78
79
 
79
80
  ## Overrides
data/Rakefile CHANGED
@@ -4,5 +4,6 @@ require 'bundler/gem_tasks'
4
4
  load 'tasks/rubocop.rake'
5
5
  load 'tasks/test.rake'
6
6
 
7
- task default: :test
7
+ task default: 'test:all'
8
+ task default: 'test:features'
8
9
  task default: :rubocop unless RUBY_ENGINE == 'rbx'
@@ -5,7 +5,7 @@ module GLib
5
5
  # Overrides for GByteArray, GLib's automatically growing array of bytes.
6
6
  class ByteArray
7
7
  def to_string
8
- GirFFI::ArgHelper.ptr_to_utf8_length @struct[:data], @struct[:len]
8
+ data.read_string len
9
9
  end
10
10
 
11
11
  def append(data)
@@ -54,7 +54,8 @@ module GLib
54
54
  end
55
55
 
56
56
  def self.handle_exception(ex)
57
- raise ex unless (current_loop = RUNNING_LOOPS.last)
57
+ current_loop = RUNNING_LOOPS.last
58
+ raise ex unless current_loop
58
59
  EXCEPTIONS << ex
59
60
  current_loop.quit
60
61
  end
data/lib/ffi-glib/strv.rb CHANGED
@@ -1,7 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
  module GLib
3
- # Extra methods for GLib::Strv. The bulk is defined in `gir_ffi-base/glib/strv.rb`
4
- class Strv
3
+ # Represents a null-terminated array of strings. GLib uses this construction,
4
+ # but does not provide any actual functions for this class.
5
+ #
6
+ # The implementation is mainly inherited from GObjectIntrospection::Strv.
7
+ class Strv < GObjectIntrospection::Strv
5
8
  def ==(other)
6
9
  to_a == other.to_a
7
10
  end
@@ -19,15 +19,13 @@ module GLib
19
19
  # NOTE: This is very hard to test since it is not possible to get the
20
20
  # variant's ref count directely. However, there is an error when running
21
21
  # the tests on 32-bit systems.
22
- # TODO: Move this logic elsewhere
22
+ #
23
23
  def store_pointer(ptr)
24
+ Lib.g_variant_ref_sink ptr
24
25
  super
25
-
26
- # TODO: Ensure ptr is not autorelease
27
- ::GLib::Lib.g_variant_ref_sink ptr
28
26
  end
29
27
 
30
- # TODO: Update ref?
28
+ # For variants, wrap_copy does not do any copying.
31
29
  def self.wrap_copy(val)
32
30
  wrap(val)
33
31
  end
data/lib/ffi-glib.rb CHANGED
@@ -1,4 +1,8 @@
1
1
  # frozen_string_literal: true
2
+
3
+ # Ensure GLib is defined by GirFFI itself
4
+ raise 'The module GLib was already defined elsewhere' if Kernel.const_defined? :GLib
5
+
2
6
  require 'gir_ffi/core'
3
7
 
4
8
  # Bypass check for existing modules
@@ -13,7 +13,7 @@ module GObject
13
13
  #
14
14
  # @param [Proc] marshal The marshaller to use for this closure object
15
15
  def set_marshal(marshal)
16
- callback = GObject::ClosureMarshal.from marshal
16
+ callback = ClosureMarshal.from marshal
17
17
  Lib.g_closure_set_marshal self, callback
18
18
  end
19
19
 
@@ -25,22 +25,20 @@ module GObject
25
25
  #
26
26
  # @param [GObject::Value] return_value The GValue to store the return
27
27
  # value, or nil if no return value is expected.
28
- # @param [Array] param_values the closure parameters, or nil if no
29
- # parameters are needed.
30
- # @param invocation_hint
31
- def invoke(return_value, param_values, invocation_hint = nil)
32
- rval = GObject::Value.from(return_value)
33
- n_params = param_values.nil? ? 0 : param_values.length
34
- params = GirFFI::SizedArray.from(GObject::Value, -1, param_values)
35
- GObject::Lib.g_closure_invoke self, rval, n_params, params, invocation_hint
28
+ # @param [Array] param_values the closure parameters.
29
+ def invoke(return_value, param_values)
30
+ rval = Value.from(return_value)
31
+ n_params = param_values.length
32
+ params = GirFFI::SizedArray.from(Value, -1, param_values)
33
+ Lib.g_closure_invoke self, rval, n_params, params, nil
36
34
  rval.get_value
37
35
  end
38
36
 
39
37
  def store_pointer(ptr)
40
- super
41
38
  # NOTE: Call C functions directly to avoid extra argument conversion
42
39
  Lib.g_closure_ref ptr
43
40
  Lib.g_closure_sink ptr
41
+ super
44
42
  end
45
43
  end
46
44
  end
@@ -35,14 +35,13 @@ module GObject
35
35
 
36
36
  def store_pointer(ptr)
37
37
  super
38
- klass = self.class
39
- ObjectSpace.define_finalizer self, klass.make_finalizer(ptr, klass.name)
38
+ ObjectSpace.define_finalizer self, self.class.make_finalizer(ptr)
40
39
  end
41
40
 
42
- def self.make_finalizer(ptr, name)
41
+ def self.make_finalizer(ptr)
43
42
  proc do
44
43
  rc = GObject::Object::Struct.new(ptr)[:ref_count]
45
- if rc == 0
44
+ if rc.zero?
46
45
  warn "not unreffing #{name}:#{ptr} (#{rc})"
47
46
  else
48
47
  GObject::Lib.g_object_unref ptr
@@ -61,6 +60,10 @@ module GObject
61
60
  super
62
61
  end
63
62
 
63
+ def respond_to_missing?(*)
64
+ false
65
+ end
66
+
64
67
  def signal_connect(event, data = nil, &block)
65
68
  GObject.signal_connect(self, event, data, &block)
66
69
  end
@@ -127,7 +130,7 @@ module GObject
127
130
  raise GirFFI::PropertyNotFoundError.new(property_name, self.class)
128
131
  end
129
132
 
130
- # TODO: Move to ITypeInfo
133
+ # TODO: Move to ITypeInfo and unify with ArgHelper.cast_from_pointer
131
134
  def property_value_post_conversion(val, type_info)
132
135
  case type_info.flattened_tag
133
136
  when :ghash
@@ -141,7 +144,7 @@ module GObject
141
144
  end
142
145
  end
143
146
 
144
- # TODO: Move to ITypeInfo
147
+ # TODO: Move to ITypeInfo and unify with ArgHelper.cast_from_pointer
145
148
  def property_value_pre_conversion(val, type_info)
146
149
  case type_info.flattened_tag
147
150
  when :ghash
@@ -8,5 +8,9 @@ module GObject
8
8
  Lib.g_param_spec_ref self
9
9
  self
10
10
  end
11
+
12
+ def accessor_name
13
+ get_name.tr('-', '_')
14
+ end
11
15
  end
12
16
  end
@@ -6,18 +6,23 @@ module GObject
6
6
  class Value
7
7
  remove_method :init
8
8
 
9
+ def initialize
10
+ super
11
+ struct.owned = true
12
+ to_ptr.autorelease = nil
13
+ end
14
+
9
15
  def init(type)
10
16
  Lib.g_value_init self, type unless [TYPE_NONE, TYPE_INVALID].include? type
11
17
  self
12
18
  end
13
19
 
14
- def self.make_finalizer(struct, gtype)
20
+ def self.make_finalizer(struct)
15
21
  proc do
16
- ptr = struct.to_ptr
17
- if ptr.autorelease?
18
- ptr.autorelease = false
22
+ if struct.owned?
23
+ ptr = struct.to_ptr
19
24
  unless struct[:g_type] == TYPE_INVALID
20
- GObject::Lib.g_value_unset ptr
25
+ Lib.g_value_unset ptr
21
26
  end
22
27
  GObject.boxed_free gtype, ptr
23
28
  end
@@ -110,17 +115,9 @@ module GObject
110
115
  end
111
116
 
112
117
  def self.copy_value_to_pointer(value, pointer, offset = 0)
113
- super(value, pointer, offset).tap do
114
- # FIXME: Check if this is still needed.
115
- value.to_ptr.autorelease = false if value
116
- end
117
- end
118
-
119
- def self.copy(val)
120
- return unless val
121
- result = for_gtype(val.current_gtype)
122
- Lib.g_value_copy val, result unless val.uninitialized?
123
- result
118
+ target = wrap(pointer + offset)
119
+ target.init(value.current_gtype)
120
+ Lib.g_value_copy value, target unless value.uninitialized?
124
121
  end
125
122
 
126
123
  def uninitialized?
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+ require 'ffi'
3
+
4
+ module GObjectIntrospection
5
+ # Provides access to the g_type_init function.
6
+ module GObjectTypeInit
7
+ def self.type_init
8
+ Lib.g_type_init
9
+ end
10
+
11
+ # Module for attaching g_type_init from the gobject library.
12
+ module Lib
13
+ extend FFI::Library
14
+ ffi_lib 'gobject-2.0'
15
+ attach_function :g_type_init, [], :void
16
+ end
17
+ end
18
+ end
@@ -38,11 +38,7 @@ module GObjectIntrospection
38
38
  end
39
39
 
40
40
  def instance_ownership_transfer
41
- if VERSION >= '1.42'
42
- Lib.g_callable_info_get_instance_ownership_transfer @gobj
43
- else
44
- :nothing
45
- end
41
+ Lib.g_callable_info_get_instance_ownership_transfer @gobj
46
42
  end
47
43
  end
48
44
  end
@@ -21,14 +21,14 @@ module GObjectIntrospection
21
21
  when :utf8
22
22
  raw_value.force_encoding('utf-8')
23
23
  when :gboolean
24
- raw_value != 0
24
+ raw_value.nonzero? ? true : false
25
25
  else
26
26
  raw_value
27
27
  end
28
28
  end
29
29
 
30
30
  def constant_type
31
- ITypeInfo.wrap Lib.g_constant_info_get_type(@gobj)
31
+ ITypeInfo.wrap Lib.g_constant_info_get_type self
32
32
  end
33
33
 
34
34
  private
@@ -39,7 +39,7 @@ module GObjectIntrospection
39
39
 
40
40
  def raw_value
41
41
  value_union = Lib::GIArgument.new
42
- Lib.g_constant_info_get_value @gobj, value_union
42
+ Lib.g_constant_info_get_value self, value_union
43
43
  value_union[union_member_key]
44
44
  end
45
45
 
@@ -2,58 +2,14 @@
2
2
  require 'singleton'
3
3
 
4
4
  require 'ffi-gobject_introspection/lib'
5
+ require 'ffi-gobject_introspection/strv'
5
6
  require 'ffi-gobject_introspection/g_error'
6
- require 'ffi-gobject_introspection/i_base_info'
7
- require 'ffi-gobject_introspection/i_callable_info'
8
- require 'ffi-gobject_introspection/i_callback_info'
9
- require 'ffi-gobject_introspection/i_function_info'
10
- require 'ffi-gobject_introspection/i_constant_info'
11
- require 'ffi-gobject_introspection/i_field_info'
12
- require 'ffi-gobject_introspection/i_registered_type_info'
13
- require 'ffi-gobject_introspection/i_interface_info'
14
- require 'ffi-gobject_introspection/i_property_info'
15
- require 'ffi-gobject_introspection/i_vfunc_info'
16
- require 'ffi-gobject_introspection/i_signal_info'
17
- require 'ffi-gobject_introspection/i_object_info'
18
- require 'ffi-gobject_introspection/i_struct_info'
19
- require 'ffi-gobject_introspection/i_value_info'
20
- require 'ffi-gobject_introspection/i_union_info'
21
- require 'ffi-gobject_introspection/i_enum_info'
22
- require 'ffi-gobject_introspection/i_flags_info'
23
- require 'ffi-gobject_introspection/i_unresolved_info'
24
7
 
25
8
  module GObjectIntrospection
26
9
  # The Gobject Introspection Repository. This class is the point of
27
10
  # access to the introspection typelibs.
28
11
  # This class wraps the GIRepository struct.
29
12
  class IRepository
30
- # Map info type to class. Default is IBaseInfo.
31
- # SMELL: This doesn't really belong here, since it is used by IBaseInfo and
32
- # descendants as well.
33
- TYPEMAP = {
34
- invalid: IBaseInfo,
35
- function: IFunctionInfo,
36
- callback: ICallbackInfo,
37
- struct: IStructInfo,
38
- # TODO: There's no GIBoxedInfo, so what does :boxed mean?
39
- boxed: IBaseInfo,
40
- enum: IEnumInfo,
41
- flags: IFlagsInfo,
42
- object: IObjectInfo,
43
- interface: IInterfaceInfo,
44
- constant: IConstantInfo,
45
- invalid_was_error_domain: IBaseInfo,
46
- union: IUnionInfo,
47
- value: IValueInfo,
48
- signal: ISignalInfo,
49
- vfunc: IVFuncInfo,
50
- property: IPropertyInfo,
51
- field: IFieldInfo,
52
- arg: IArgInfo,
53
- type: ITypeInfo,
54
- unresolved: IUnresolvedInfo
55
- }.freeze
56
-
57
13
  def initialize
58
14
  @gobj = Lib.g_irepository_get_default
59
15
  end
@@ -101,13 +57,13 @@ module GObjectIntrospection
101
57
  end
102
58
 
103
59
  def find_by_gtype(gtype)
104
- raise ArgumentError, "Type #{gtype} is not a valid type" if gtype == 0
60
+ raise ArgumentError, "Type #{gtype} is not a valid type" if gtype.zero?
105
61
  wrap_info Lib.g_irepository_find_by_gtype(@gobj, gtype)
106
62
  end
107
63
 
108
64
  def dependencies(namespace)
109
65
  strv_p = Lib.g_irepository_get_dependencies(@gobj, namespace)
110
- strv = GLib::Strv.new strv_p
66
+ strv = Strv.new strv_p
111
67
  strv.to_a
112
68
  end
113
69
 
@@ -4,23 +4,15 @@ module GObjectIntrospection
4
4
  # Represents a virtual function.
5
5
  class IVFuncInfo < ICallableInfo
6
6
  def flags
7
- Lib.g_vfunc_info_get_flags @gobj
7
+ Lib.g_vfunc_info_get_flags self
8
8
  end
9
9
 
10
10
  def throws?
11
- flags & 8 != 0
12
- end
13
-
14
- def offset
15
- Lib.g_vfunc_info_get_offset @gobj
16
- end
17
-
18
- def signal
19
- ISignalInfo.wrap Lib.g_vfunc_info_get_signal(@gobj)
11
+ flags.fetch :throws
20
12
  end
21
13
 
22
14
  def invoker
23
- IFunctionInfo.wrap Lib.g_vfunc_info_get_invoker(@gobj)
15
+ IFunctionInfo.wrap Lib.g_vfunc_info_get_invoker self
24
16
  end
25
17
  end
26
18
  end
@@ -9,25 +9,6 @@ module GObjectIntrospection
9
9
  extend FFI::BitMasks
10
10
  ffi_lib 'girepository-1.0'
11
11
 
12
- # Helper class to support guessing the gobject-introspection version.
13
- # Provide several guesses to #provide_guess, and the result in #best_guess
14
- # will be the best (i.e., lowest) guess.
15
- class VersionGuesser
16
- def initialize(base)
17
- @guess = base
18
- end
19
-
20
- def provide_guess(guessed)
21
- @guess = guessed if guessed < @guess
22
- end
23
-
24
- def best_guess
25
- @guess
26
- end
27
- end
28
-
29
- version_guesser = VersionGuesser.new('1.42')
30
-
31
12
  # IRepository
32
13
  enum :IRepositoryLoadFlags, [:LAZY, (1 << 0)]
33
14
 
@@ -102,17 +83,12 @@ module GObjectIntrospection
102
83
  attach_function :g_callable_info_get_caller_owns, [:pointer], :ITransfer
103
84
  attach_function :g_callable_info_may_return_null, [:pointer], :bool
104
85
  attach_function :g_callable_info_can_throw_gerror, [:pointer], :bool
86
+ attach_function :g_callable_info_get_instance_ownership_transfer,
87
+ [:pointer], :ITransfer
105
88
  attach_function :g_callable_info_get_n_args, [:pointer], :int
106
89
  attach_function :g_callable_info_get_arg, [:pointer, :int], :pointer
107
90
  attach_function :g_callable_info_skip_return, [:pointer], :bool
108
91
 
109
- begin
110
- attach_function :g_callable_info_get_instance_ownership_transfer,
111
- [:pointer], :ITransfer
112
- rescue FFI::NotFoundError
113
- version_guesser.provide_guess '1.40'
114
- end
115
-
116
92
  # IArgInfo
117
93
  enum :IDirection, [
118
94
  :in,
@@ -242,10 +218,13 @@ module GObjectIntrospection
242
218
  attach_function :g_object_info_get_fundamental, [:pointer], :bool
243
219
 
244
220
  # IVFuncInfo
221
+ bit_mask :IVFuncInfoFlags,
222
+ must_chain_up: (1 << 0),
223
+ must_override: (1 << 1),
224
+ must_not_override: (1 << 2),
225
+ throws: (1 << 3)
245
226
 
246
- attach_function :g_vfunc_info_get_flags, [:pointer], :int
247
- attach_function :g_vfunc_info_get_offset, [:pointer], :int
248
- attach_function :g_vfunc_info_get_signal, [:pointer], :pointer
227
+ attach_function :g_vfunc_info_get_flags, [:pointer], :IVFuncInfoFlags
249
228
  attach_function :g_vfunc_info_get_invoker, [:pointer], :pointer
250
229
 
251
230
  # IInterfaceInfo
@@ -309,7 +288,5 @@ module GObjectIntrospection
309
288
  construct_only: (1 << 3)
310
289
 
311
290
  attach_function :g_property_info_get_flags, [:pointer], :ParamFlags
312
-
313
- ::GObjectIntrospection::VERSION = version_guesser.best_guess
314
291
  end
315
292
  end
@@ -1,9 +1,9 @@
1
1
  # frozen_string_literal: true
2
2
  require 'ffi'
3
- require 'gir_ffi-base/glib'
4
3
 
5
- module GLib
6
- # Represents a null-terminated array of strings. GLib uses this
4
+ module GObjectIntrospection
5
+ # Represents a null-terminated array of strings.
6
+ # GLib uses this
7
7
  # construction, but does not provide any actual functions for this class.
8
8
  class Strv
9
9
  include Enumerable
@@ -19,9 +19,9 @@ module GLib
19
19
  end
20
20
 
21
21
  def each
22
- return if @ptr.null?
23
- reset_iterator
24
- while (ptr = next_ptr)
22
+ offset = 0
23
+ while (ptr = fetch_ptr offset)
24
+ offset += POINTER_SIZE
25
25
  yield ptr.read_string
26
26
  end
27
27
  end
@@ -32,13 +32,9 @@ module GLib
32
32
 
33
33
  private
34
34
 
35
- def reset_iterator
36
- @offset = 0
37
- end
38
-
39
- def next_ptr
40
- ptr = @ptr.get_pointer @offset
41
- @offset += POINTER_SIZE
35
+ def fetch_ptr(offset)
36
+ return if @ptr.null?
37
+ ptr = @ptr.get_pointer offset
42
38
  ptr unless ptr.null?
43
39
  end
44
40
  end
@@ -1,6 +1,51 @@
1
1
  # frozen_string_literal: true
2
- require 'gir_ffi-base'
2
+ require 'ffi-gobject_introspection/gobject_type_init'
3
+ GObjectIntrospection::GObjectTypeInit.type_init
3
4
 
4
- GObject.type_init
5
+ require 'ffi-gobject_introspection/i_base_info'
6
+ require 'ffi-gobject_introspection/i_callable_info'
7
+ require 'ffi-gobject_introspection/i_callback_info'
8
+ require 'ffi-gobject_introspection/i_function_info'
9
+ require 'ffi-gobject_introspection/i_constant_info'
10
+ require 'ffi-gobject_introspection/i_field_info'
11
+ require 'ffi-gobject_introspection/i_registered_type_info'
12
+ require 'ffi-gobject_introspection/i_interface_info'
13
+ require 'ffi-gobject_introspection/i_property_info'
14
+ require 'ffi-gobject_introspection/i_vfunc_info'
15
+ require 'ffi-gobject_introspection/i_signal_info'
16
+ require 'ffi-gobject_introspection/i_object_info'
17
+ require 'ffi-gobject_introspection/i_struct_info'
18
+ require 'ffi-gobject_introspection/i_value_info'
19
+ require 'ffi-gobject_introspection/i_union_info'
20
+ require 'ffi-gobject_introspection/i_enum_info'
21
+ require 'ffi-gobject_introspection/i_flags_info'
22
+ require 'ffi-gobject_introspection/i_unresolved_info'
23
+
24
+ module GObjectIntrospection
25
+ # Map info type to class. Default is IBaseInfo.
26
+ TYPEMAP = {
27
+ invalid: IBaseInfo,
28
+ function: IFunctionInfo,
29
+ callback: ICallbackInfo,
30
+ struct: IStructInfo,
31
+ # TODO: There's no GIBoxedInfo, so what does :boxed mean?
32
+ boxed: IBaseInfo,
33
+ enum: IEnumInfo,
34
+ flags: IFlagsInfo,
35
+ object: IObjectInfo,
36
+ interface: IInterfaceInfo,
37
+ constant: IConstantInfo,
38
+ invalid_was_error_domain: IBaseInfo,
39
+ union: IUnionInfo,
40
+ value: IValueInfo,
41
+ signal: ISignalInfo,
42
+ vfunc: IVFuncInfo,
43
+ property: IPropertyInfo,
44
+ field: IFieldInfo,
45
+ arg: IArgInfo,
46
+ type: ITypeInfo,
47
+ unresolved: IUnresolvedInfo
48
+ }.freeze
49
+ end
5
50
 
6
51
  require 'ffi-gobject_introspection/i_repository'
@@ -2,26 +2,8 @@
2
2
  require 'gir_ffi/lib_c'
3
3
 
4
4
  module GirFFI
5
- # Helper module providing a safe allocation method that raises an exception
6
- # if memory cannot be allocated.
5
+ # Helper module for alloction-related functionality.
7
6
  module AllocationHelper
8
- # NOTE: It would be preferable to use FFI::MemoryPointer.new(size), but
9
- # there is a bug in FFI which means this gives a problem:
10
- # # let ptr be a pointer not allocated by FFI.
11
- # ptr2 = FFI::MemoryPointer.new(1)
12
- # ptr.put_pointer ptr2 # This raises an out-of-bounds error.
13
- # This occurs in method_int8_arg_and_out_callee
14
- def self.safe_malloc(size)
15
- ptr = LibC.malloc size
16
- raise NoMemoryError if ptr.null?
17
- ptr
18
- end
19
-
20
- def self.allocate(type)
21
- type_size = FFI.type_size type
22
- safe_malloc(type_size)
23
- end
24
-
25
7
  def self.free_after(ptr)
26
8
  result = yield ptr
27
9
  LibC.free ptr unless ptr.null?