gir_ffi 0.15.7 → 0.16.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/Changelog.md +44 -18
  3. data/README.md +8 -23
  4. data/lib/ffi-glib/bytes.rb +0 -12
  5. data/lib/ffi-glib/hash_table.rb +1 -1
  6. data/lib/ffi-glib/main_loop.rb +1 -1
  7. data/lib/ffi-glib/ptr_array.rb +24 -15
  8. data/lib/ffi-glib/variant.rb +4 -6
  9. data/lib/ffi-gobject/object.rb +30 -60
  10. data/lib/ffi-gobject/object_class.rb +2 -10
  11. data/lib/ffi-gobject/value.rb +26 -26
  12. data/lib/ffi-gobject.rb +4 -18
  13. data/lib/ffi-gobject_introspection/i_base_info.rb +1 -1
  14. data/lib/ffi-gobject_introspection/i_constant_info.rb +10 -10
  15. data/lib/ffi-gobject_introspection/lib.rb +11 -11
  16. data/lib/ffi-gobject_introspection.rb +19 -19
  17. data/lib/gir_ffi/builder.rb +1 -1
  18. data/lib/gir_ffi/builders/argument_builder_collection.rb +24 -8
  19. data/lib/gir_ffi/builders/base_argument_builder.rb +2 -2
  20. data/lib/gir_ffi/builders/base_method_builder.rb +23 -23
  21. data/lib/gir_ffi/builders/constructor_builder.rb +1 -1
  22. data/lib/gir_ffi/builders/mapping_method_builder.rb +1 -1
  23. data/lib/gir_ffi/builders/marshalling_method_builder.rb +2 -2
  24. data/lib/gir_ffi/builders/module_builder.rb +1 -1
  25. data/lib/gir_ffi/builders/object_builder.rb +10 -12
  26. data/lib/gir_ffi/builders/struct_builder.rb +1 -1
  27. data/lib/gir_ffi/builders/type_builder.rb +9 -9
  28. data/lib/gir_ffi/builders/user_defined_builder.rb +24 -26
  29. data/lib/gir_ffi/class_base.rb +1 -3
  30. data/lib/gir_ffi/core.rb +0 -5
  31. data/lib/gir_ffi/in_pointer.rb +6 -6
  32. data/lib/gir_ffi/info_ext/full_type_name.rb +3 -2
  33. data/lib/gir_ffi/info_ext/i_function_info.rb +10 -0
  34. data/lib/gir_ffi/info_ext/i_signal_info.rb +8 -6
  35. data/lib/gir_ffi/info_ext/i_type_info.rb +21 -26
  36. data/lib/gir_ffi/info_ext/i_vfunc_info.rb +4 -0
  37. data/lib/gir_ffi/instance_method_setup.rb +3 -1
  38. data/lib/gir_ffi/object_base.rb +5 -5
  39. data/lib/gir_ffi/struct_like_base.rb +0 -1
  40. data/lib/gir_ffi/type_map.rb +30 -30
  41. data/lib/gir_ffi/unintrospectable_type_info.rb +2 -2
  42. data/lib/gir_ffi/user_defined_object_info.rb +0 -3
  43. data/lib/gir_ffi/user_defined_property_info.rb +33 -33
  44. data/lib/gir_ffi/version.rb +1 -1
  45. data/lib/gir_ffi/zero_terminated.rb +1 -1
  46. data/lib/gir_ffi-base/gobject.rb +1 -1
  47. metadata +33 -12
@@ -25,27 +25,27 @@ require "ffi-gobject_introspection/i_unresolved_info"
25
25
  module GObjectIntrospection
26
26
  # Map info type to class. Default is IBaseInfo.
27
27
  TYPEMAP = {
28
- invalid: IBaseInfo,
29
- function: IFunctionInfo,
30
- callback: ICallbackInfo,
31
- struct: IStructInfo,
28
+ invalid: IBaseInfo,
29
+ function: IFunctionInfo,
30
+ callback: ICallbackInfo,
31
+ struct: IStructInfo,
32
32
  # TODO: There's no GIBoxedInfo, so what does :boxed mean?
33
- boxed: IBaseInfo,
34
- enum: IEnumInfo,
35
- flags: IFlagsInfo,
36
- object: IObjectInfo,
37
- interface: IInterfaceInfo,
38
- constant: IConstantInfo,
33
+ boxed: IBaseInfo,
34
+ enum: IEnumInfo,
35
+ flags: IFlagsInfo,
36
+ object: IObjectInfo,
37
+ interface: IInterfaceInfo,
38
+ constant: IConstantInfo,
39
39
  invalid_was_error_domain: IBaseInfo,
40
- union: IUnionInfo,
41
- value: IValueInfo,
42
- signal: ISignalInfo,
43
- vfunc: IVFuncInfo,
44
- property: IPropertyInfo,
45
- field: IFieldInfo,
46
- arg: IArgInfo,
47
- type: ITypeInfo,
48
- unresolved: IUnresolvedInfo
40
+ union: IUnionInfo,
41
+ value: IValueInfo,
42
+ signal: ISignalInfo,
43
+ vfunc: IVFuncInfo,
44
+ property: IPropertyInfo,
45
+ field: IFieldInfo,
46
+ arg: IArgInfo,
47
+ type: ITypeInfo,
48
+ unresolved: IUnresolvedInfo
49
49
  }.freeze
50
50
  end
51
51
 
@@ -46,7 +46,7 @@ module GirFFI
46
46
  end
47
47
  Builders::ModuleBuilder.new(module_name,
48
48
  namespace: namespace,
49
- version: version).generate
49
+ version: version).generate
50
50
  end
51
51
 
52
52
  # TODO: Move elsewhere, perhaps to FunctionBuilder.
@@ -28,11 +28,11 @@ module GirFFI
28
28
 
29
29
  def capture_variable_names
30
30
  @capture_variable_names ||=
31
- all_builders.map(&:capture_variable_name).compact
31
+ all_builders.filter_map(&:capture_variable_name)
32
32
  end
33
33
 
34
34
  def call_argument_names
35
- @call_argument_names ||= argument_builders.map(&:call_argument_name).compact
35
+ @call_argument_names ||= argument_builders.filter_map(&:call_argument_name)
36
36
  end
37
37
 
38
38
  def method_argument_names
@@ -50,7 +50,7 @@ module GirFFI
50
50
  end
51
51
 
52
52
  def return_value_names
53
- @return_value_names ||= all_builders.map(&:return_value_name).compact
53
+ @return_value_names ||= all_builders.filter_map(&:return_value_name)
54
54
  end
55
55
 
56
56
  def has_return_values?
@@ -75,7 +75,11 @@ module GirFFI
75
75
  def set_up_user_data_relations
76
76
  @base_argument_builders.each do |bldr|
77
77
  if (idx = bldr.closure_idx) >= 0
78
- @base_argument_builders[idx].mark_as_user_data bldr
78
+ target_bldr = @base_argument_builders[idx]
79
+ unless target_bldr.specialized_type_tag == :void
80
+ target_bldr, bldr = bldr, target_bldr
81
+ end
82
+ target_bldr.mark_as_user_data bldr
79
83
  end
80
84
  end
81
85
  end
@@ -83,7 +87,14 @@ module GirFFI
83
87
  def set_up_destroy_notifier_relations
84
88
  @base_argument_builders.each do |bldr|
85
89
  if (idx = bldr.destroy_idx) >= 0
86
- @base_argument_builders[idx].mark_as_destroy_notifier bldr
90
+ target = @base_argument_builders[idx]
91
+ if target.specialized_type_tag == :callback &&
92
+ bldr.specialized_type_tag == :callback
93
+ target.mark_as_destroy_notifier bldr
94
+ else
95
+ warn "Not marking #{target.name} (#{target.specialized_type_tag})" \
96
+ " as destroy notifier for #{bldr.name} (#{bldr.specialized_type_tag})"
97
+ end
87
98
  end
88
99
  end
89
100
  end
@@ -128,12 +139,17 @@ module GirFFI
128
139
  def split_off_block_argument
129
140
  builders_with_name = argument_builders.select(&:method_argument_name)
130
141
  blocks, base = builders_with_name.partition(&:block_argument?)
131
- return base, blocks.first
142
+ case blocks.count
143
+ when 1
144
+ return base, blocks.first
145
+ else
146
+ return builders_with_name, nil
147
+ end
132
148
  end
133
149
 
134
150
  def base_argument_names(arguments)
135
151
  required_found = false
136
- arguments.reverse.map do |it|
152
+ arguments.reverse.filter_map do |it|
137
153
  name = it.method_argument_name
138
154
  if it.allow_none? && !required_found
139
155
  "#{name} = nil"
@@ -141,7 +157,7 @@ module GirFFI
141
157
  required_found = true
142
158
  name
143
159
  end
144
- end.compact.reverse
160
+ end.reverse
145
161
  end
146
162
  end
147
163
  end
@@ -6,13 +6,13 @@ module GirFFI
6
6
  # classes are used by FunctionBuilder to create the code that
7
7
  # processes each argument before and after the actual function call.
8
8
  class BaseArgumentBuilder
9
- KEYWORDS = %w(
9
+ KEYWORDS = %w[
10
10
  alias and begin break case class def do
11
11
  else elsif end ensure false for if in
12
12
  module next nil not or redo rescue retry
13
13
  return self super then true undef unless
14
14
  until when while yield
15
- ).freeze
15
+ ].freeze
16
16
 
17
17
  attr_reader :arginfo, :related_callback_builder
18
18
 
@@ -21,14 +21,30 @@ module GirFFI
21
21
  @receiver_info = receiver_info
22
22
  end
23
23
 
24
- def variable_generator
25
- @variable_generator ||= VariableNameGenerator.new
26
- end
27
-
28
24
  def method_definition
29
25
  template.method_definition
30
26
  end
31
27
 
28
+ # Methods used by MethodTemplate
29
+
30
+ def invocation
31
+ "#{lib_name}.#{@info.symbol} #{function_call_arguments.join(', ')}".strip
32
+ end
33
+
34
+ def method_arguments
35
+ argument_builder_collection.method_argument_names
36
+ end
37
+
38
+ def preparation
39
+ []
40
+ end
41
+
42
+ private
43
+
44
+ def variable_generator
45
+ @variable_generator ||= VariableNameGenerator.new
46
+ end
47
+
32
48
  def template
33
49
  @template ||= MethodTemplate.new(self, argument_builder_collection)
34
50
  end
@@ -47,8 +63,8 @@ module GirFFI
47
63
  end
48
64
 
49
65
  def return_value_builder
50
- @return_value_builder = @return_value_builder_class.new(variable_generator,
51
- return_value_info)
66
+ @return_value_builder ||= @return_value_builder_class.new(variable_generator,
67
+ return_value_info)
52
68
  end
53
69
 
54
70
  def receiver_builder
@@ -59,7 +75,7 @@ module GirFFI
59
75
  @argument_builder_collection ||=
60
76
  ArgumentBuilderCollection.new(return_value_builder, argument_builders,
61
77
  error_argument_builder: error_argument,
62
- receiver_builder: receiver_builder)
78
+ receiver_builder: receiver_builder)
63
79
  end
64
80
 
65
81
  def error_argument
@@ -71,22 +87,6 @@ module GirFFI
71
87
  end
72
88
  end
73
89
 
74
- # Methods used by MethodTemplate
75
-
76
- def invocation
77
- "#{lib_name}.#{@info.symbol} #{function_call_arguments.join(', ')}".strip
78
- end
79
-
80
- def method_arguments
81
- argument_builder_collection.method_argument_names
82
- end
83
-
84
- def preparation
85
- []
86
- end
87
-
88
- private
89
-
90
90
  def lib_name
91
91
  "#{@info.safe_namespace}::Lib"
92
92
  end
@@ -38,7 +38,7 @@ module GirFFI
38
38
  ["obj = allocate"]
39
39
  else
40
40
  [
41
- "raise NoMethodError unless self == #{@info.container.full_type_name}",
41
+ "raise NoMethodError unless self == #{@info.container.full_name}",
42
42
  "obj = allocate"
43
43
  ]
44
44
  end
@@ -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
 
@@ -21,7 +21,7 @@ module GirFFI
21
21
 
22
22
  def initialize(receiver_info, info)
23
23
  super(info, ClosureReturnValueBuilder,
24
- receiver_info: receiver_info,
24
+ receiver_info: receiver_info,
25
25
  argument_builder_class: ClosureArgumentBuilder)
26
26
  end
27
27
 
@@ -32,7 +32,7 @@ module GirFFI
32
32
  end
33
33
 
34
34
  def method_arguments
35
- %w(closure return_value param_values _invocation_hint _marshal_data)
35
+ %w[closure return_value param_values _invocation_hint _marshal_data]
36
36
  end
37
37
 
38
38
  def preparation
@@ -89,7 +89,7 @@ module GirFFI
89
89
  lib.extend FFI::BitMasks
90
90
  lib.ffi_lib_flags :global, :lazy
91
91
  if shared_library_specification
92
- lib.ffi_lib(*shared_library_specification.split(/,/))
92
+ lib.ffi_lib(*shared_library_specification.split(","))
93
93
  end
94
94
  end
95
95
 
@@ -18,7 +18,7 @@ module GirFFI
18
18
  ObjectBase
19
19
  end
20
20
 
21
- def object_class_struct
21
+ def class_struct_class
22
22
  GObject::TypeClass
23
23
  end
24
24
 
@@ -35,12 +35,12 @@ module GirFFI
35
35
  seek_in_ancestor_infos { |info| info.find_property property_name }
36
36
  end
37
37
 
38
- def object_class_struct
39
- @object_class_struct ||=
38
+ def class_struct_class
39
+ @class_struct_class ||=
40
40
  begin
41
- parent_struct = parent_builder.object_class_struct
42
- if object_class_struct_info
43
- StructBuilder.new(object_class_struct_info,
41
+ parent_struct = parent_builder.class_struct_class
42
+ if class_struct_info
43
+ StructBuilder.new(class_struct_info,
44
44
  superclass: parent_struct).build_class
45
45
  else
46
46
  parent_struct
@@ -58,12 +58,6 @@ module GirFFI
58
58
  end
59
59
  end
60
60
 
61
- protected
62
-
63
- def object_class_struct_info
64
- @object_class_struct_info ||= info.class_struct
65
- end
66
-
67
61
  private
68
62
 
69
63
  def setup_class
@@ -76,6 +70,10 @@ module GirFFI
76
70
  setup_initializer
77
71
  end
78
72
 
73
+ def class_struct_info
74
+ @class_struct_info ||= info.class_struct
75
+ end
76
+
79
77
  # FIXME: Private method only used in subclass
80
78
  def layout_superclass
81
79
  GirFFI::Struct
@@ -44,7 +44,7 @@ module GirFFI
44
44
  end
45
45
 
46
46
  def gtype_struct_parent
47
- full_name = info.full_type_name
47
+ full_name = info.full_name
48
48
  if full_name == "GObject::InitiallyUnownedClass"
49
49
  GObject::ObjectClass
50
50
  else
@@ -21,16 +21,16 @@ module GirFFI
21
21
  CACHE = {}
22
22
 
23
23
  TYPE_MAP = {
24
- callback: CallbackBuilder,
25
- constant: ConstantBuilder,
26
- enum: EnumBuilder,
27
- flags: FlagsBuilder,
28
- interface: InterfaceBuilder,
29
- object: ObjectBuilder,
30
- struct: StructBuilder,
31
- union: UnionBuilder,
24
+ callback: CallbackBuilder,
25
+ constant: ConstantBuilder,
26
+ enum: EnumBuilder,
27
+ flags: FlagsBuilder,
28
+ interface: InterfaceBuilder,
29
+ object: ObjectBuilder,
30
+ struct: StructBuilder,
31
+ union: UnionBuilder,
32
32
  unintrospectable_boxed: UnintrospectableBoxedBuilder,
33
- unintrospectable: UnintrospectableBuilder
33
+ unintrospectable: UnintrospectableBuilder
34
34
  }.freeze
35
35
 
36
36
  def self.build(info)
@@ -78,17 +78,17 @@ module GirFFI
78
78
  end
79
79
 
80
80
  def class_init_proc
81
- proc do |type_class_or_ptr, _data|
82
- object_class_ptr = type_class_or_ptr.to_ptr
83
- setup_properties object_class_ptr
84
- setup_vfuncs object_class_ptr
81
+ proc do |type_class, _data|
82
+ class_struct_ptr = type_class.to_ptr
83
+ setup_properties class_struct_ptr
84
+ setup_vfuncs class_struct_ptr
85
85
  end
86
86
  end
87
87
 
88
88
  def interface_init_proc(interface)
89
- proc do |interface_or_ptr, _data|
90
- interface_ptr = interface_or_ptr.to_ptr
91
- setup_interface_vfuncs interface, interface_ptr
89
+ proc do |type_interface, _data|
90
+ interface_struct_ptr = type_interface.to_ptr
91
+ setup_interface_vfuncs interface, interface_struct_ptr
92
92
  end
93
93
  end
94
94
 
@@ -108,42 +108,44 @@ module GirFFI
108
108
  parent_gtype.class_size + interface_gtypes.sum(&:class_size)
109
109
  end
110
110
 
111
- def setup_properties(object_class_ptr)
112
- object_class = GObject::ObjectClass.wrap object_class_ptr
111
+ def setup_properties(class_struct_ptr)
112
+ class_struct = GObject::ObjectClass.wrap class_struct_ptr
113
113
 
114
- object_class.get_property = property_getter
115
- object_class.set_property = property_setter
114
+ class_struct.struct[:get_property] = property_getter_func
115
+ class_struct.struct[:set_property] = property_setter_func
116
116
 
117
117
  property_fields.each_with_index do |property, index|
118
- object_class.install_property index + 1, property.param_spec
118
+ class_struct.install_property index + 1, property.param_spec
119
119
  end
120
120
  end
121
121
 
122
- def property_getter
123
- proc do |object, _property_id, value, pspec|
122
+ def property_getter_func
123
+ getter = proc do |object, _property_id, value, pspec|
124
124
  value.set_value object.send(pspec.accessor_name)
125
125
  end
126
+ GObject::ObjectGetPropertyFunc.from getter
126
127
  end
127
128
 
128
- def property_setter
129
- proc do |object, _property_id, value, pspec|
129
+ def property_setter_func
130
+ setter = proc do |object, _property_id, value, pspec|
130
131
  object.send("#{pspec.accessor_name}=", value.get_value)
131
132
  end
133
+ GObject::ObjectSetPropertyFunc.from setter
132
134
  end
133
135
 
134
- def setup_vfuncs(object_class_ptr)
136
+ def setup_vfuncs(class_struct_ptr)
135
137
  super_class_struct =
136
- superclass.gir_ffi_builder.object_class_struct::Struct.new(object_class_ptr)
138
+ superclass.gir_ffi_builder.class_struct_class.wrap(class_struct_ptr)
137
139
 
138
140
  info.vfunc_implementations.each do |impl|
139
141
  setup_vfunc parent_info, super_class_struct, impl
140
142
  end
141
143
  end
142
144
 
143
- def setup_interface_vfuncs(interface, interface_ptr)
145
+ def setup_interface_vfuncs(interface, interface_struct_ptr)
144
146
  interface_builder = interface.gir_ffi_builder
145
147
 
146
- interface_struct = interface_builder.interface_struct::Struct.new(interface_ptr)
148
+ interface_struct = interface_builder.interface_struct.wrap(interface_struct_ptr)
147
149
  interface_info = interface_builder.info
148
150
 
149
151
  info.vfunc_implementations.each do |impl|
@@ -156,12 +158,8 @@ module GirFFI
156
158
  vfunc_info = ancestor_info.find_vfunc vfunc_name.to_s
157
159
  return unless vfunc_info
158
160
 
159
- install_vfunc ancestor_struct, vfunc_name, vfunc_info, impl.implementation
160
- end
161
-
162
- def install_vfunc(container_struct, vfunc_name, vfunc_info, implementation)
163
- vfunc = VFuncBuilder.new(vfunc_info).build_class
164
- container_struct[vfunc_name] = vfunc.from implementation
161
+ vfunc_class = VFuncBuilder.new(vfunc_info).build_class
162
+ ancestor_struct.struct[vfunc_name] = vfunc_class.from(impl.implementation)
165
163
  end
166
164
 
167
165
  def properties
@@ -29,10 +29,8 @@ module GirFFI
29
29
  send method_name, *arguments, &block
30
30
  end
31
31
 
32
- # NOTE: JRuby should fix FFI::MemoryPointer#== to return true for
33
- # equivalent FFI::Pointer. For now, user to_ptr.address
34
32
  def ==(other)
35
- other.class == self.class && to_ptr.address == other.to_ptr.address
33
+ other.class == self.class && to_ptr == other.to_ptr
36
34
  end
37
35
 
38
36
  def self.setup_and_call(method, arguments, &block)
data/lib/gir_ffi/core.rb CHANGED
@@ -40,11 +40,6 @@ module GirFFI
40
40
  raise ArgumentError, "#{klass} is not a user-defined class"
41
41
  end
42
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
48
43
  Builders::UserDefinedBuilder.new(info).build_class
49
44
 
50
45
  klass.gtype
@@ -75,13 +75,13 @@ module GirFFI
75
75
  end
76
76
 
77
77
  def from_module_type_array(type, ary)
78
- if type == GObject::Value
79
- from_gvalue_array type, ary
80
- elsif type < GirFFI::ClassBase ||
81
- type.singleton_class < GirFFI::InterfaceBase
82
- from_struct_array type, ary
83
- elsif type.singleton_class < GirFFI::EnumBase
78
+ return from_gvalue_array(type, ary) if type == GObject::Value
79
+
80
+ case type
81
+ when GirFFI::EnumLikeBase
84
82
  from_enum_array type, ary
83
+ when GirFFI::RegisteredTypeBase
84
+ from_struct_array type, ary
85
85
  else
86
86
  raise NotImplementedError, type
87
87
  end
@@ -2,11 +2,12 @@
2
2
 
3
3
  module GirFFI
4
4
  module InfoExt
5
- # Extension module provinding a #full_type_name method suitable for
5
+ # Extension module provinding a #full_name method suitable for
6
6
  # callbacks, constants and registered types. Signals and vfuncs need a
7
7
  # different implementation.
8
+ #
8
9
  module FullTypeName
9
- def full_type_name
10
+ def full_name
10
11
  "#{safe_namespace}::#{safe_name}"
11
12
  end
12
13
  end
@@ -14,6 +14,16 @@ module GirFFI
14
14
  def return_ffi_type
15
15
  return_type.to_ffi_type
16
16
  end
17
+
18
+ def full_name
19
+ if method?
20
+ "#{container.full_name}##{safe_name}"
21
+ elsif container
22
+ "#{container.full_name}.#{safe_name}"
23
+ else
24
+ "#{safe_namespace}.#{safe_name}"
25
+ end
26
+ end
17
27
  end
18
28
  end
19
29
  end
@@ -17,8 +17,14 @@ module GirFFI
17
17
  end
18
18
 
19
19
  def arguments_to_gvalues(instance, arguments)
20
- arg_g_values = argument_types.zip(arguments).map do |type, arg|
21
- type.make_g_value.tap { |it| it.set_value arg }
20
+ arg_g_values = args.zip(arguments).map do |arg_info, arg|
21
+ case arg_info.direction
22
+ when :in
23
+ type = arg_info.argument_type
24
+ type.make_g_value.tap { |it| it.set_value arg }
25
+ else
26
+ raise NotImplementedError
27
+ end
22
28
  end
23
29
 
24
30
  arg_g_values.unshift GObject::Value.wrap_instance(instance)
@@ -27,10 +33,6 @@ module GirFFI
27
33
  def gvalue_for_return_value
28
34
  return_type.make_g_value
29
35
  end
30
-
31
- def argument_types
32
- @argument_types ||= args.map(&:argument_type)
33
- end
34
36
  end
35
37
  end
36
38
  end
@@ -8,17 +8,17 @@ module GirFFI
8
8
  module ITypeInfo
9
9
  FLATTENED_TAG_TO_GTYPE_MAP = {
10
10
  gboolean: GObject::TYPE_BOOLEAN,
11
- gint32: GObject::TYPE_INT,
12
- gint64: GObject::TYPE_INT64,
13
- guint64: GObject::TYPE_UINT64,
14
- void: GObject::TYPE_NONE
11
+ gint32: GObject::TYPE_INT,
12
+ gint64: GObject::TYPE_INT64,
13
+ guint64: GObject::TYPE_UINT64,
14
+ void: GObject::TYPE_NONE
15
15
  }.freeze
16
16
 
17
17
  FLATTENED_TAG_POINTER_TO_GTYPE_MAP = {
18
18
  array: GObject::TYPE_ARRAY,
19
19
  ghash: GObject::TYPE_HASH_TABLE,
20
- strv: GObject::TYPE_STRV,
21
- utf8: GObject::TYPE_STRING
20
+ strv: GObject::TYPE_STRV,
21
+ utf8: GObject::TYPE_STRING
22
22
  }.freeze
23
23
 
24
24
  def gtype
@@ -85,17 +85,17 @@ module GirFFI
85
85
  end
86
86
 
87
87
  TAG_TO_WRAPPER_CLASS_MAP = {
88
- array: "GLib::Array",
89
- byte_array: "GLib::ByteArray",
90
- c: "GirFFI::SizedArray",
91
- error: "GLib::Error",
92
- ghash: "GLib::HashTable",
93
- glist: "GLib::List",
94
- gslist: "GLib::SList",
95
- ptr_array: "GLib::PtrArray",
96
- strv: "GLib::Strv",
97
- utf8: "GirFFI::InPointer", # TODO: Create a string-like class
98
- void: "GirFFI::InPointer", # TODO: Create a void-pointer class
88
+ array: "GLib::Array",
89
+ byte_array: "GLib::ByteArray",
90
+ c: "GirFFI::SizedArray",
91
+ error: "GLib::Error",
92
+ ghash: "GLib::HashTable",
93
+ glist: "GLib::List",
94
+ gslist: "GLib::SList",
95
+ ptr_array: "GLib::PtrArray",
96
+ strv: "GLib::Strv",
97
+ utf8: "GirFFI::InPointer", # TODO: Create a string-like class
98
+ void: "GirFFI::InPointer", # TODO: Create a void-pointer class
99
99
  zero_terminated: "GirFFI::ZeroTerminated"
100
100
  }.freeze
101
101
 
@@ -106,7 +106,7 @@ module GirFFI
106
106
  end
107
107
 
108
108
  def interface_class_name
109
- interface.full_type_name if tag == :interface
109
+ interface.full_name if tag == :interface
110
110
  end
111
111
 
112
112
  def to_ffi_type
@@ -166,7 +166,8 @@ module GirFFI
166
166
  end
167
167
 
168
168
  def needs_c_to_ruby_conversion_for_closures?
169
- [:array, :c, :error, :ghash, :glist, :struct, :strv].include?(flattened_tag)
169
+ [:array, :c, :error, :ghash, :glist, :ptr_array, :struct, :strv]
170
+ .include?(flattened_tag)
170
171
  end
171
172
 
172
173
  def needs_ruby_to_c_conversion_for_closures?
@@ -213,13 +214,7 @@ module GirFFI
213
214
  end
214
215
 
215
216
  def subtype_ffi_type(index)
216
- subtype = param_type(index).to_ffi_type
217
- if subtype == :pointer
218
- # NOTE: Don't use pointer directly to appease JRuby.
219
- :"uint#{FFI.type_size(:pointer) * 8}"
220
- else
221
- subtype
222
- end
217
+ param_type(index).to_ffi_type
223
218
  end
224
219
 
225
220
  def flattened_array_type
@@ -22,6 +22,10 @@ module GirFFI
22
22
  def has_invoker?
23
23
  invoker
24
24
  end
25
+
26
+ def full_name
27
+ "#{container.full_name}::#{safe_name}"
28
+ end
25
29
  end
26
30
  end
27
31
  end