gir_ffi 0.15.3 → 0.15.4

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 (183) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +15 -0
  3. data/README.md +5 -6
  4. data/TODO.md +14 -35
  5. data/docs/Documentation.md +6 -0
  6. data/docs/Subclassing.md +38 -0
  7. data/lib/ffi-glib.rb +8 -3
  8. data/lib/ffi-glib/byte_array.rb +2 -1
  9. data/lib/ffi-glib/destroy_notify.rb +2 -2
  10. data/lib/ffi-glib/hash_table.rb +1 -2
  11. data/lib/ffi-glib/list.rb +11 -5
  12. data/lib/ffi-glib/list_methods.rb +12 -0
  13. data/lib/ffi-glib/s_list.rb +10 -4
  14. data/lib/ffi-gobject.rb +0 -3
  15. data/lib/ffi-gobject/object.rb +77 -73
  16. data/lib/ffi-gobject/object_class.rb +1 -1
  17. data/lib/ffi-gobject/value.rb +107 -108
  18. data/lib/ffi-gobject_introspection/i_base_info.rb +20 -19
  19. data/lib/gir_ffi-base/gobject/lib.rb +4 -0
  20. data/lib/gir_ffi/array_element_convertor.rb +1 -2
  21. data/lib/gir_ffi/boxed_base.rb +1 -5
  22. data/lib/gir_ffi/builder.rb +1 -1
  23. data/lib/gir_ffi/builder_helper.rb +7 -4
  24. data/lib/gir_ffi/builders/base_argument_builder.rb +2 -2
  25. data/lib/gir_ffi/builders/base_method_builder.rb +1 -1
  26. data/lib/gir_ffi/builders/base_type_builder.rb +1 -1
  27. data/lib/gir_ffi/builders/callback_argument_builder.rb +2 -0
  28. data/lib/gir_ffi/builders/callback_builder.rb +14 -12
  29. data/lib/gir_ffi/builders/callback_return_value_builder.rb +4 -6
  30. data/lib/gir_ffi/builders/class_struct_builder.rb +24 -0
  31. data/lib/gir_ffi/builders/enum_builder.rb +3 -3
  32. data/lib/gir_ffi/builders/interface_builder.rb +3 -1
  33. data/lib/gir_ffi/builders/mapping_method_builder.rb +1 -1
  34. data/lib/gir_ffi/builders/marshalling_method_builder.rb +5 -2
  35. data/lib/gir_ffi/builders/method_template.rb +4 -4
  36. data/lib/gir_ffi/builders/null_argument_builder.rb +0 -2
  37. data/lib/gir_ffi/builders/null_return_value_builder.rb +0 -2
  38. data/lib/gir_ffi/builders/object_builder.rb +16 -6
  39. data/lib/gir_ffi/builders/property_builder.rb +1 -2
  40. data/lib/gir_ffi/builders/signal_closure_builder.rb +3 -5
  41. data/lib/gir_ffi/builders/struct_builder.rb +5 -5
  42. data/lib/gir_ffi/builders/user_defined_builder.rb +8 -1
  43. data/lib/gir_ffi/builders/vfunc_argument_builder.rb +1 -1
  44. data/lib/gir_ffi/callback_base.rb +3 -3
  45. data/lib/gir_ffi/core.rb +17 -2
  46. data/lib/gir_ffi/glib_error.rb +1 -2
  47. data/lib/gir_ffi/in_pointer.rb +7 -0
  48. data/lib/gir_ffi/object_base.rb +27 -0
  49. data/lib/gir_ffi/return_value_info.rb +1 -2
  50. data/lib/gir_ffi/struct_base.rb +1 -9
  51. data/lib/gir_ffi/struct_like_base.rb +9 -5
  52. data/lib/gir_ffi/unintrospectable_type_info.rb +1 -1
  53. data/lib/gir_ffi/union_base.rb +1 -9
  54. data/lib/gir_ffi/user_defined_object_info.rb +3 -2
  55. data/lib/gir_ffi/version.rb +1 -1
  56. data/lib/gir_ffi/vfunc_implementation.rb +1 -0
  57. metadata +86 -136
  58. data/Gemfile +0 -14
  59. data/Rakefile +0 -9
  60. data/tasks/test.rake +0 -204
  61. data/test/base_test_helper.rb +0 -70
  62. data/test/ffi-glib/array_test.rb +0 -203
  63. data/test/ffi-glib/byte_array_test.rb +0 -28
  64. data/test/ffi-glib/bytes_test.rb +0 -61
  65. data/test/ffi-glib/closure_test.rb +0 -38
  66. data/test/ffi-glib/destroy_notify_test.rb +0 -18
  67. data/test/ffi-glib/hash_table_test.rb +0 -68
  68. data/test/ffi-glib/list_test.rb +0 -86
  69. data/test/ffi-glib/main_loop_test.rb +0 -53
  70. data/test/ffi-glib/ptr_array_test.rb +0 -112
  71. data/test/ffi-glib/ruby_closure_test.rb +0 -62
  72. data/test/ffi-glib/s_list_test.rb +0 -76
  73. data/test/ffi-glib/strv_test.rb +0 -60
  74. data/test/ffi-glib/variant_test.rb +0 -12
  75. data/test/ffi-gobject/gobject_test.rb +0 -76
  76. data/test/ffi-gobject/object_class_test.rb +0 -31
  77. data/test/ffi-gobject/object_test.rb +0 -123
  78. data/test/ffi-gobject/param_spec_test.rb +0 -32
  79. data/test/ffi-gobject/value_test.rb +0 -390
  80. data/test/ffi-gobject_introspection/gobject_type_init_test.rb +0 -26
  81. data/test/ffi-gobject_introspection/i_base_info_test.rb +0 -52
  82. data/test/ffi-gobject_introspection/i_constant_info_test.rb +0 -29
  83. data/test/ffi-gobject_introspection/i_enum_info_test.rb +0 -18
  84. data/test/ffi-gobject_introspection/i_function_info_test.rb +0 -6
  85. data/test/ffi-gobject_introspection/i_interface_info_test.rb +0 -23
  86. data/test/ffi-gobject_introspection/i_object_info_test.rb +0 -49
  87. data/test/ffi-gobject_introspection/i_property_info_test.rb +0 -47
  88. data/test/ffi-gobject_introspection/i_registered_type_info_test.rb +0 -27
  89. data/test/ffi-gobject_introspection/i_repository_test.rb +0 -81
  90. data/test/ffi-gobject_introspection/i_struct_info_test.rb +0 -23
  91. data/test/ffi-gobject_introspection/i_type_info_test.rb +0 -30
  92. data/test/ffi-gobject_introspection/i_union_info_test.rb +0 -17
  93. data/test/ffi-gobject_introspection/i_vfunc_info_test.rb +0 -41
  94. data/test/ffi-gobject_introspection/lib_test.rb +0 -13
  95. data/test/ffi-gobject_introspection/strv_test.rb +0 -46
  96. data/test/ffi-gobject_test.rb +0 -153
  97. data/test/gir_ffi/allocation_helper_test.rb +0 -36
  98. data/test/gir_ffi/arg_helper_test.rb +0 -146
  99. data/test/gir_ffi/boolean_test.rb +0 -43
  100. data/test/gir_ffi/boxed_base_test.rb +0 -65
  101. data/test/gir_ffi/builder_test.rb +0 -168
  102. data/test/gir_ffi/builders/argument_builder_test.rb +0 -691
  103. data/test/gir_ffi/builders/base_argument_builder_test.rb +0 -6
  104. data/test/gir_ffi/builders/callback_argument_builder_test.rb +0 -130
  105. data/test/gir_ffi/builders/callback_builder_test.rb +0 -117
  106. data/test/gir_ffi/builders/callback_return_value_builder_test.rb +0 -84
  107. data/test/gir_ffi/builders/constant_builder_test.rb +0 -6
  108. data/test/gir_ffi/builders/constructor_builder_test.rb +0 -39
  109. data/test/gir_ffi/builders/enum_builder_test.rb +0 -23
  110. data/test/gir_ffi/builders/field_builder_test.rb +0 -140
  111. data/test/gir_ffi/builders/function_builder_test.rb +0 -570
  112. data/test/gir_ffi/builders/initializer_builder_test.rb +0 -56
  113. data/test/gir_ffi/builders/interface_builder_test.rb +0 -32
  114. data/test/gir_ffi/builders/module_builder_test.rb +0 -43
  115. data/test/gir_ffi/builders/object_builder_test.rb +0 -98
  116. data/test/gir_ffi/builders/property_builder_test.rb +0 -161
  117. data/test/gir_ffi/builders/registered_type_builder_test.rb +0 -54
  118. data/test/gir_ffi/builders/return_value_builder_test.rb +0 -444
  119. data/test/gir_ffi/builders/signal_closure_builder_test.rb +0 -199
  120. data/test/gir_ffi/builders/struct_builder_test.rb +0 -96
  121. data/test/gir_ffi/builders/unintrospectable_boxed_builder_test.rb +0 -29
  122. data/test/gir_ffi/builders/unintrospectable_builder_test.rb +0 -84
  123. data/test/gir_ffi/builders/union_builder_test.rb +0 -28
  124. data/test/gir_ffi/builders/user_defined_builder_test.rb +0 -528
  125. data/test/gir_ffi/builders/vfunc_argument_builder_test.rb +0 -107
  126. data/test/gir_ffi/builders/vfunc_builder_test.rb +0 -245
  127. data/test/gir_ffi/callback_base_test.rb +0 -22
  128. data/test/gir_ffi/class_base_test.rb +0 -171
  129. data/test/gir_ffi/core_test.rb +0 -99
  130. data/test/gir_ffi/enum_base_test.rb +0 -43
  131. data/test/gir_ffi/error_type_info_test.rb +0 -50
  132. data/test/gir_ffi/ffi_ext/pointer_test.rb +0 -22
  133. data/test/gir_ffi/g_type_test.rb +0 -31
  134. data/test/gir_ffi/in_pointer_test.rb +0 -203
  135. data/test/gir_ffi/info_ext/i_callable_info_test.rb +0 -26
  136. data/test/gir_ffi/info_ext/i_callback_info_test.rb +0 -22
  137. data/test/gir_ffi/info_ext/i_field_info_test.rb +0 -37
  138. data/test/gir_ffi/info_ext/i_function_info_test.rb +0 -74
  139. data/test/gir_ffi/info_ext/i_signal_info_test.rb +0 -32
  140. data/test/gir_ffi/info_ext/i_type_info_test.rb +0 -712
  141. data/test/gir_ffi/info_ext/i_unresolved_info_test.rb +0 -19
  142. data/test/gir_ffi/info_ext/safe_constant_name_test.rb +0 -26
  143. data/test/gir_ffi/info_ext/safe_function_name_test.rb +0 -26
  144. data/test/gir_ffi/interface_base_test.rb +0 -20
  145. data/test/gir_ffi/method_stubber_test.rb +0 -67
  146. data/test/gir_ffi/object_base_test.rb +0 -64
  147. data/test/gir_ffi/object_store_test.rb +0 -41
  148. data/test/gir_ffi/receiver_argument_info_test.rb +0 -33
  149. data/test/gir_ffi/sized_array_test.rb +0 -206
  150. data/test/gir_ffi/struct_base_test.rb +0 -23
  151. data/test/gir_ffi/struct_like_base_test.rb +0 -167
  152. data/test/gir_ffi/type_map_test.rb +0 -17
  153. data/test/gir_ffi/unintrospectable_type_info_test.rb +0 -121
  154. data/test/gir_ffi/union_base_test.rb +0 -23
  155. data/test/gir_ffi/user_defined_object_info_test.rb +0 -119
  156. data/test/gir_ffi/user_defined_property_info_test.rb +0 -39
  157. data/test/gir_ffi/variable_name_generator_test.rb +0 -18
  158. data/test/gir_ffi/version_test.rb +0 -9
  159. data/test/gir_ffi/zero_terminated_test.rb +0 -108
  160. data/test/gir_ffi_test_helper.rb +0 -84
  161. data/test/integration/callback_exceptions_test.rb +0 -59
  162. data/test/integration/derived_classes_test.rb +0 -54
  163. data/test/integration/generated_everything_test.rb +0 -453
  164. data/test/integration/generated_gimarshallingtests_test.rb +0 -3109
  165. data/test/integration/generated_gio_test.rb +0 -116
  166. data/test/integration/generated_glib_test.rb +0 -10
  167. data/test/integration/generated_gobject_test.rb +0 -124
  168. data/test/integration/generated_gst_test.rb +0 -38
  169. data/test/integration/generated_gtk_source_test.rb +0 -21
  170. data/test/integration/generated_gtop_test.rb +0 -22
  171. data/test/integration/generated_pango_ft2_test.rb +0 -17
  172. data/test/integration/generated_pango_test.rb +0 -24
  173. data/test/integration/generated_regress_test.rb +0 -4076
  174. data/test/integration/generated_secret_test.rb +0 -14
  175. data/test/integration/generated_utility_test.rb +0 -174
  176. data/test/integration/generated_warnlib_test.rb +0 -45
  177. data/test/integration/method_lookup_test.rb +0 -34
  178. data/test/introspection_test_helper.rb +0 -94
  179. data/test/lib/Makefile.am +0 -110
  180. data/test/lib/autogen.sh +0 -4
  181. data/test/lib/configure.ac +0 -34
  182. data/test/lib/m4/jhflags.m4 +0 -21
  183. data/test/minitest/stats_plugin.rb +0 -30
@@ -9,11 +9,7 @@ module GirFFI
9
9
  # callbacks.
10
10
  class CallbackReturnValueBuilder < BaseReturnValueBuilder
11
11
  def post_conversion
12
- if has_post_conversion?
13
- optional_outgoing_ref + base_post_conversion
14
- else
15
- []
16
- end
12
+ optional_outgoing_ref + base_post_conversion
17
13
  end
18
14
 
19
15
  private
@@ -35,7 +31,9 @@ module GirFFI
35
31
  end
36
32
 
37
33
  def base_post_conversion
38
- if specialized_type_tag == :object
34
+ if !has_post_conversion?
35
+ []
36
+ elsif specialized_type_tag == :object
39
37
  ["#{post_converted_name} = #{post_convertor.conversion}.to_ptr"]
40
38
  else
41
39
  ["#{post_converted_name} = #{post_convertor.conversion}"]
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "gir_ffi/builders/struct_builder"
4
+
5
+ module GirFFI
6
+ module Builders
7
+ # Implements the creation of a class representing a Struct.
8
+ class ClassStructBuilder < RegisteredTypeBuilder
9
+ include StructLike
10
+
11
+ attr_reader :superclass
12
+
13
+ def initialize(info, super_class_struct)
14
+ @superclass = super_class_struct
15
+ super info
16
+ raise "Info does not represent gtype_struct" unless info.gtype_struct?
17
+ end
18
+
19
+ def layout_superclass
20
+ GirFFI::Struct
21
+ end
22
+ end
23
+ end
24
+ end
@@ -51,9 +51,9 @@ module GirFFI
51
51
 
52
52
  def setup_inspect
53
53
  klass.instance_eval <<-RUBY, __FILE__, __LINE__ + 1
54
- def self.inspect
55
- "#{@namespace}::#{@classname}"
56
- end
54
+ def self.inspect # def self.inspect
55
+ "#{@namespace}::#{@classname}" # "GFoo::Bar"
56
+ end # end
57
57
  RUBY
58
58
  end
59
59
 
@@ -8,7 +8,9 @@ module GirFFI
8
8
  # Implements the creation of a module representing an Interface.
9
9
  class InterfaceBuilder < RegisteredTypeBuilder
10
10
  def interface_struct
11
- @interface_struct ||= Builder.build_class iface_struct_info
11
+ @interface_struct ||=
12
+ ClassStructBuilder.new(iface_struct_info,
13
+ GObject::TypeInterface).build_class
12
14
  end
13
15
 
14
16
  private
@@ -23,7 +23,7 @@ module GirFFI
23
23
 
24
24
  def initialize(receiver_info, info, builder_class)
25
25
  super(info, CallbackReturnValueBuilder,
26
- receiver_info: receiver_info,
26
+ receiver_info: receiver_info,
27
27
  argument_builder_class: builder_class)
28
28
  end
29
29
 
@@ -12,13 +12,16 @@ module GirFFI
12
12
  # handler. This method converts arguments from C to Ruby, and the
13
13
  # result from Ruby to C.
14
14
  class MarshallingMethodBuilder < BaseMethodBuilder
15
- def self.for_signal(receiver_info, info)
15
+ def self.for_signal(info)
16
+ container_info = info.container
17
+ container_type_info = ReceiverTypeInfo.new(container_info)
18
+ receiver_info = ReceiverArgumentInfo.new(container_type_info)
16
19
  new receiver_info, info
17
20
  end
18
21
 
19
22
  def initialize(receiver_info, info)
20
23
  super(info, ClosureReturnValueBuilder,
21
- receiver_info: receiver_info,
24
+ receiver_info: receiver_info,
22
25
  argument_builder_class: ClosureArgumentBuilder)
23
26
  end
24
27
 
@@ -18,10 +18,10 @@ module GirFFI
18
18
  end
19
19
 
20
20
  def method_definition
21
- code = "def #{qualified_method_name}"
22
- code += "(#{method_arguments.join(', ')})" if method_arguments.any?
23
- method_lines.each { |line| code += "\n #{line}" }
24
- code + "\nend\n"
21
+ code = +"def #{qualified_method_name}"
22
+ code << "(#{method_arguments.join(', ')})" if method_arguments.any?
23
+ method_lines.each { |line| code << "\n #{line}" }
24
+ code << "\nend\n"
25
25
  end
26
26
 
27
27
  private
@@ -3,8 +3,6 @@
3
3
  module GirFFI
4
4
  # Argument builder that does nothing. Implements the Null Object pattern.
5
5
  class NullArgumentBuilder
6
- def initialize(*); end
7
-
8
6
  def pre_conversion
9
7
  []
10
8
  end
@@ -4,8 +4,6 @@ module GirFFI
4
4
  module Builders
5
5
  # Implements a blank return value matching ReturnValueBuilder's interface.
6
6
  class NullReturnValueBuilder
7
- def initialize; end
8
-
9
7
  def array_length_idx
10
8
  -1
11
9
  end
@@ -3,6 +3,7 @@
3
3
  require "gir_ffi/builders/registered_type_builder"
4
4
  require "gir_ffi/builders/with_layout"
5
5
  require "gir_ffi/builders/property_builder"
6
+ require "gir_ffi/builders/class_struct_builder"
6
7
  require "gir_ffi/object_base"
7
8
  require "gir_ffi/struct"
8
9
 
@@ -18,6 +19,10 @@ module GirFFI
18
19
  ObjectBase
19
20
  end
20
21
 
22
+ def object_class_struct
23
+ GObject::TypeClass
24
+ end
25
+
21
26
  def ancestor_infos
22
27
  []
23
28
  end
@@ -32,7 +37,13 @@ module GirFFI
32
37
  end
33
38
 
34
39
  def object_class_struct
35
- @object_class_struct ||= Builder.build_class object_class_struct_info
40
+ @object_class_struct ||=
41
+ if object_class_struct_info
42
+ ClassStructBuilder.new(object_class_struct_info,
43
+ parent_builder.object_class_struct).build_class
44
+ else
45
+ parent_builder.object_class_struct
46
+ end
36
47
  end
37
48
 
38
49
  def ancestor_infos
@@ -48,8 +59,7 @@ module GirFFI
48
59
  protected
49
60
 
50
61
  def object_class_struct_info
51
- @object_class_struct_info ||=
52
- info.class_struct || parent_builder.object_class_struct_info
62
+ @object_class_struct_info ||= info.class_struct
53
63
  end
54
64
 
55
65
  private
@@ -107,9 +117,9 @@ module GirFFI
107
117
  return if vfunc_name == invoker_name
108
118
 
109
119
  klass.class_eval <<-DEF, __FILE__, __LINE__ + 1
110
- def #{vfunc_name} *args, &block
111
- #{invoker_name}(*args, &block)
112
- end
120
+ def #{vfunc_name} *args, &block # def foo *args, &block
121
+ #{invoker_name}(*args, &block) # foo_invoker *args, &block
122
+ end # end
113
123
  DEF
114
124
  end
115
125
 
@@ -11,8 +11,7 @@ module GirFFI
11
11
  module Builders
12
12
  # Method builder used for the creation of property getter methods.
13
13
  class PropertyGetterBuilder
14
- attr_reader :info
15
- attr_reader :return_value_builder
14
+ attr_reader :info, :return_value_builder
16
15
 
17
16
  def initialize(info, return_value_builder)
18
17
  @return_value_builder = return_value_builder
@@ -18,13 +18,11 @@ module GirFFI
18
18
  end
19
19
 
20
20
  def marshaller_definition
21
- container_type_info = ReceiverTypeInfo.new(container_info)
22
- receiver_info = ReceiverArgumentInfo.new(container_type_info)
23
-
24
- MarshallingMethodBuilder.for_signal(receiver_info,
25
- info).method_definition
21
+ MarshallingMethodBuilder.for_signal(info).method_definition
26
22
  end
27
23
 
24
+ private
25
+
28
26
  def klass
29
27
  @klass ||= get_or_define_class container_class, @classname, GObject::RubyClosure
30
28
  end
@@ -15,16 +15,16 @@ module GirFFI
15
15
  end
16
16
 
17
17
  def superclass
18
- # HACK: Inheritance chain is not expressed in GObject's code correctly.
19
- if info.full_type_name == "GObject::InitiallyUnownedClass"
20
- return GObject::ObjectClass
21
- end
22
- return parent_field_type.tag_or_class if info.gtype_struct?
18
+ raise "Use ClassStructBuilder to build #{info.full_type_name}" if info.gtype_struct?
23
19
  return BoxedBase if GObject.type_fundamental(info.gtype) == GObject::TYPE_BOXED
24
20
 
25
21
  StructBase
26
22
  end
27
23
 
24
+ def klass
25
+ @klass ||= get_or_define_class(namespace_module, @classname) { superclass }
26
+ end
27
+
28
28
  def parent_field_type
29
29
  fields.first.field_type
30
30
  end
@@ -12,6 +12,7 @@ module GirFFI
12
12
  end
13
13
 
14
14
  def setup_class
15
+ check_ancestry
15
16
  setup_layout
16
17
  register_type
17
18
  setup_constants
@@ -26,6 +27,12 @@ module GirFFI
26
27
 
27
28
  private
28
29
 
30
+ def check_ancestry
31
+ unless klass < GirFFI::ObjectBase
32
+ raise ArgumentError, "#{klass} is not a GObject class"
33
+ end
34
+ end
35
+
29
36
  def register_type
30
37
  @gtype = GObject.type_register_static(parent_gtype.to_i,
31
38
  info.g_name,
@@ -98,7 +105,7 @@ module GirFFI
98
105
  end
99
106
 
100
107
  def class_size
101
- parent_gtype.class_size + interface_gtypes.map(&:class_size).inject(0, :+)
108
+ parent_gtype.class_size + interface_gtypes.map(&:class_size).sum
102
109
  end
103
110
 
104
111
  def setup_properties(object_class_ptr)
@@ -9,7 +9,7 @@ module GirFFI
9
9
  class VFuncArgumentBuilder < CallbackArgumentBuilder
10
10
  def pre_conversion
11
11
  if ingoing_ref_needed?
12
- super + ["#{pre_converted_name}.ref"]
12
+ super + ["#{pre_converted_name}&.ref"]
13
13
  else
14
14
  super
15
15
  end
@@ -35,14 +35,14 @@ module GirFFI
35
35
  from_native ptr, nil
36
36
  end
37
37
 
38
- CALLBACKS = {}
38
+ CALLBACKS = Set.new
39
39
 
40
40
  def self.store_callback(prc)
41
- CALLBACKS[prc.object_id] = prc
41
+ CALLBACKS.add prc
42
42
  end
43
43
 
44
44
  def self.drop_callback(prc)
45
- CALLBACKS.delete prc.object_id
45
+ CALLBACKS.delete prc
46
46
  end
47
47
 
48
48
  # Create Callback from a Proc. Makes sure arguments are properly wrapped,
@@ -28,8 +28,23 @@ module GirFFI
28
28
  Builder.build_module namespace, version
29
29
  end
30
30
 
31
- def define_type(klass, &block)
32
- info = UserDefinedObjectInfo.new(klass, &block)
31
+ def define_type(klass)
32
+ unless klass < GirFFI::ObjectBase
33
+ raise ArgumentError, "#{klass} is not a GObject class"
34
+ end
35
+
36
+ klass.prepare_user_defined_class
37
+ info = klass.gir_info
38
+
39
+ unless info.is_a? UserDefinedObjectInfo
40
+ raise ArgumentError, "#{klass} is not a user-defined class"
41
+ end
42
+
43
+ if block_given?
44
+ warn "Using define_type with a block is deprecated." \
45
+ " Call the relevant functions inside the class definition instead."
46
+ yield info
47
+ end
33
48
  Builders::UserDefinedBuilder.new(info).build_class
34
49
 
35
50
  klass.gtype
@@ -4,8 +4,7 @@ module GirFFI
4
4
  # Exception class to be raised whenever an error is signaled through
5
5
  # GLib::Error.
6
6
  class GLibError < RuntimeError
7
- attr_reader :domain_quark
8
- attr_reader :code
7
+ attr_reader :domain_quark, :code
9
8
 
10
9
  def initialize(g_error)
11
10
  @domain_quark = g_error.domain
@@ -67,6 +67,8 @@ module GirFFI
67
67
  from_utf8_array ary
68
68
  when :gboolean
69
69
  from_boolean_array ary
70
+ when :guint8
71
+ from_char_array ary
70
72
  else
71
73
  from_basic_type_array type, ary
72
74
  end
@@ -92,6 +94,11 @@ module GirFFI
92
94
  from_basic_type_array :int, ary.map { |val| val ? 1 : 0 }
93
95
  end
94
96
 
97
+ def from_char_array(ary)
98
+ ary = ary.bytes if ary.is_a? String
99
+ from_basic_type_array :int8, ary
100
+ end
101
+
95
102
  def from_pointer_array(type, ary)
96
103
  from_basic_type_array :pointer, ary.map { |elem| from type, elem }
97
104
  end
@@ -81,5 +81,32 @@ module GirFFI
81
81
  it < GirFFI::ObjectBase || it.singleton_class.include?(InterfaceBase)
82
82
  end
83
83
  end
84
+
85
+ def self.prepare_user_defined_class
86
+ return if const_defined? :GIR_INFO, false
87
+
88
+ info = UserDefinedObjectInfo.new(self)
89
+ const_set :GIR_INFO, info
90
+ end
91
+
92
+ def self.install_property(param_spec)
93
+ if const_defined? :GIR_FFI_BUILDER, false
94
+ raise "Installing a property in a class that is already set up is not supported"
95
+ end
96
+
97
+ prepare_user_defined_class
98
+
99
+ gir_info.install_property(param_spec)
100
+ end
101
+
102
+ def self.install_vfunc_implementation(name, implementation = nil)
103
+ if const_defined? :GIR_FFI_BUILDER, false
104
+ raise "Installing a property in a class that is already set up is not supported"
105
+ end
106
+
107
+ prepare_user_defined_class
108
+
109
+ gir_info.install_vfunc_implementation(name, implementation)
110
+ end
84
111
  end
85
112
  end
@@ -3,8 +3,7 @@
3
3
  module GirFFI
4
4
  # Represents a return value with the same interface as IArgInfo
5
5
  class ReturnValueInfo
6
- attr_reader :argument_type
7
- attr_reader :ownership_transfer
6
+ attr_reader :argument_type, :ownership_transfer
8
7
 
9
8
  def initialize(type, ownership_transfer, skip)
10
9
  @argument_type = type
@@ -4,14 +4,6 @@ require "gir_ffi/struct_like_base"
4
4
 
5
5
  module GirFFI
6
6
  # Base class for generated classes representing GLib structs.
7
- class StructBase < ClassBase
8
- extend FFI::DataConverter
9
- include GirFFI::StructLikeBase
10
-
11
- def initialize
12
- @struct = self.class::Struct.new
13
- @struct.owned = true
14
- @struct.to_ptr.autorelease = false
15
- end
7
+ class StructBase < StructLikeBase
16
8
  end
17
9
  end
@@ -1,15 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module GirFFI
4
- # Base module providing class methods for generated classes representing GLib
4
+ # Base class providing methods for generated classes representing GLib
5
5
  # structs, unions and boxed types.
6
- module StructLikeBase
7
- def self.included(base)
8
- base.extend ClassMethods
6
+ class StructLikeBase < ClassBase
7
+ extend FFI::DataConverter
8
+
9
+ def initialize
10
+ store_pointer(nil)
11
+ struct.owned = true
12
+ struct.to_ptr.autorelease = false
9
13
  end
10
14
 
11
15
  # Class methods for struct-like classes.
12
- module ClassMethods
16
+ class << self
13
17
  def native_type
14
18
  FFI::Type::Struct.new(self::Struct)
15
19
  end