gir_ffi 0.15.7 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/Changelog.md +44 -18
- data/README.md +8 -23
- data/lib/ffi-glib/bytes.rb +0 -12
- data/lib/ffi-glib/hash_table.rb +1 -1
- data/lib/ffi-glib/main_loop.rb +1 -1
- data/lib/ffi-glib/ptr_array.rb +24 -15
- data/lib/ffi-glib/variant.rb +4 -6
- data/lib/ffi-gobject/object.rb +30 -60
- data/lib/ffi-gobject/object_class.rb +2 -10
- data/lib/ffi-gobject/value.rb +26 -26
- data/lib/ffi-gobject.rb +4 -18
- data/lib/ffi-gobject_introspection/i_base_info.rb +1 -1
- data/lib/ffi-gobject_introspection/i_constant_info.rb +10 -10
- data/lib/ffi-gobject_introspection/lib.rb +11 -11
- data/lib/ffi-gobject_introspection.rb +19 -19
- data/lib/gir_ffi/builder.rb +1 -1
- data/lib/gir_ffi/builders/argument_builder_collection.rb +24 -8
- data/lib/gir_ffi/builders/base_argument_builder.rb +2 -2
- data/lib/gir_ffi/builders/base_method_builder.rb +23 -23
- data/lib/gir_ffi/builders/constructor_builder.rb +1 -1
- data/lib/gir_ffi/builders/mapping_method_builder.rb +1 -1
- data/lib/gir_ffi/builders/marshalling_method_builder.rb +2 -2
- data/lib/gir_ffi/builders/module_builder.rb +1 -1
- data/lib/gir_ffi/builders/object_builder.rb +10 -12
- data/lib/gir_ffi/builders/struct_builder.rb +1 -1
- data/lib/gir_ffi/builders/type_builder.rb +9 -9
- data/lib/gir_ffi/builders/user_defined_builder.rb +24 -26
- data/lib/gir_ffi/class_base.rb +1 -3
- data/lib/gir_ffi/core.rb +0 -5
- data/lib/gir_ffi/in_pointer.rb +6 -6
- data/lib/gir_ffi/info_ext/full_type_name.rb +3 -2
- data/lib/gir_ffi/info_ext/i_function_info.rb +10 -0
- data/lib/gir_ffi/info_ext/i_signal_info.rb +8 -6
- data/lib/gir_ffi/info_ext/i_type_info.rb +21 -26
- data/lib/gir_ffi/info_ext/i_vfunc_info.rb +4 -0
- data/lib/gir_ffi/instance_method_setup.rb +3 -1
- data/lib/gir_ffi/object_base.rb +5 -5
- data/lib/gir_ffi/struct_like_base.rb +0 -1
- data/lib/gir_ffi/type_map.rb +30 -30
- data/lib/gir_ffi/unintrospectable_type_info.rb +2 -2
- data/lib/gir_ffi/user_defined_object_info.rb +0 -3
- data/lib/gir_ffi/user_defined_property_info.rb +33 -33
- data/lib/gir_ffi/version.rb +1 -1
- data/lib/gir_ffi/zero_terminated.rb +1 -1
- data/lib/gir_ffi-base/gobject.rb +1 -1
- 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:
|
29
|
-
function:
|
30
|
-
callback:
|
31
|
-
struct:
|
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:
|
34
|
-
enum:
|
35
|
-
flags:
|
36
|
-
object:
|
37
|
-
interface:
|
38
|
-
constant:
|
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:
|
41
|
-
value:
|
42
|
-
signal:
|
43
|
-
vfunc:
|
44
|
-
property:
|
45
|
-
field:
|
46
|
-
arg:
|
47
|
-
type:
|
48
|
-
unresolved:
|
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
|
|
data/lib/gir_ffi/builder.rb
CHANGED
@@ -28,11 +28,11 @@ module GirFFI
|
|
28
28
|
|
29
29
|
def capture_variable_names
|
30
30
|
@capture_variable_names ||=
|
31
|
-
all_builders.
|
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.
|
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.
|
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]
|
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]
|
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
|
-
|
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.
|
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.
|
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
|
-
|
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
|
51
|
-
|
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:
|
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
|
@@ -21,7 +21,7 @@ module GirFFI
|
|
21
21
|
|
22
22
|
def initialize(receiver_info, info)
|
23
23
|
super(info, ClosureReturnValueBuilder,
|
24
|
-
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
|
35
|
+
%w[closure return_value param_values _invocation_hint _marshal_data]
|
36
36
|
end
|
37
37
|
|
38
38
|
def preparation
|
@@ -18,7 +18,7 @@ module GirFFI
|
|
18
18
|
ObjectBase
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
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
|
39
|
-
@
|
38
|
+
def class_struct_class
|
39
|
+
@class_struct_class ||=
|
40
40
|
begin
|
41
|
-
parent_struct = parent_builder.
|
42
|
-
if
|
43
|
-
StructBuilder.new(
|
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
|
@@ -21,16 +21,16 @@ module GirFFI
|
|
21
21
|
CACHE = {}
|
22
22
|
|
23
23
|
TYPE_MAP = {
|
24
|
-
callback:
|
25
|
-
constant:
|
26
|
-
enum:
|
27
|
-
flags:
|
28
|
-
interface:
|
29
|
-
object:
|
30
|
-
struct:
|
31
|
-
union:
|
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:
|
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 |
|
82
|
-
|
83
|
-
setup_properties
|
84
|
-
setup_vfuncs
|
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 |
|
90
|
-
|
91
|
-
setup_interface_vfuncs interface,
|
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(
|
112
|
-
|
111
|
+
def setup_properties(class_struct_ptr)
|
112
|
+
class_struct = GObject::ObjectClass.wrap class_struct_ptr
|
113
113
|
|
114
|
-
|
115
|
-
|
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
|
-
|
118
|
+
class_struct.install_property index + 1, property.param_spec
|
119
119
|
end
|
120
120
|
end
|
121
121
|
|
122
|
-
def
|
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
|
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(
|
136
|
+
def setup_vfuncs(class_struct_ptr)
|
135
137
|
super_class_struct =
|
136
|
-
superclass.gir_ffi_builder.
|
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,
|
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
|
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
|
-
|
160
|
-
|
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
|
data/lib/gir_ffi/class_base.rb
CHANGED
@@ -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
|
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
|
data/lib/gir_ffi/in_pointer.rb
CHANGED
@@ -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
|
-
|
80
|
-
|
81
|
-
|
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 #
|
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
|
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 =
|
21
|
-
|
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:
|
12
|
-
gint64:
|
13
|
-
guint64:
|
14
|
-
void:
|
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:
|
21
|
-
utf8:
|
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:
|
89
|
-
byte_array:
|
90
|
-
c:
|
91
|
-
error:
|
92
|
-
ghash:
|
93
|
-
glist:
|
94
|
-
gslist:
|
95
|
-
ptr_array:
|
96
|
-
strv:
|
97
|
-
utf8:
|
98
|
-
void:
|
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.
|
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]
|
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
|
-
|
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
|