gir_ffi 0.5.2 → 0.6.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.
- data/History.txt +5 -0
- data/lib/ffi-glib/array.rb +2 -3
- data/lib/ffi-glib/container_class_methods.rb +3 -4
- data/lib/ffi-glib/hash_table.rb +7 -3
- data/lib/ffi-glib/list_methods.rb +1 -1
- data/lib/ffi-glib/sized_array.rb +66 -0
- data/lib/ffi-glib/strv.rb +1 -1
- data/lib/ffi-glib.rb +5 -4
- data/lib/ffi-gobject/object.rb +2 -3
- data/lib/ffi-gobject/ruby_closure.rb +3 -2
- data/lib/ffi-gobject/value.rb +26 -14
- data/lib/ffi-gobject.rb +8 -5
- data/lib/ffi-gobject_introspection/g_error.rb +1 -0
- data/lib/ffi-gobject_introspection/i_base_info.rb +3 -2
- data/lib/ffi-gobject_introspection/i_union_info.rb +21 -8
- data/lib/ffi-gobject_introspection/lib.rb +1 -0
- data/lib/gir_ffi/argument_builder.rb +8 -20
- data/lib/gir_ffi/base_argument_builder.rb +13 -30
- data/lib/gir_ffi/builder/module.rb +3 -9
- data/lib/gir_ffi/builder/type/base.rb +2 -0
- data/lib/gir_ffi/builder/type/callback.rb +2 -2
- data/lib/gir_ffi/builder/type/enum.rb +1 -0
- data/lib/gir_ffi/builder/type/object.rb +13 -3
- data/lib/gir_ffi/builder/type/registered_type.rb +1 -1
- data/lib/gir_ffi/builder/type/struct.rb +18 -3
- data/lib/gir_ffi/builder/type/unintrospectable.rb +5 -45
- data/lib/gir_ffi/builder/type/user_defined.rb +3 -15
- data/lib/gir_ffi/builder/type.rb +5 -5
- data/lib/gir_ffi/builder.rb +5 -80
- data/lib/gir_ffi/callback.rb +65 -2
- data/lib/gir_ffi/callback_helper.rb +0 -56
- data/lib/gir_ffi/class_base.rb +2 -2
- data/lib/gir_ffi/in_out_pointer.rb +7 -28
- data/lib/gir_ffi/in_pointer.rb +12 -19
- data/lib/gir_ffi/info_ext/i_arg_info.rb +5 -0
- data/lib/gir_ffi/info_ext/i_callable_info.rb +16 -0
- data/lib/gir_ffi/info_ext/i_function_info.rb +15 -0
- data/lib/gir_ffi/info_ext/i_signal_info.rb +17 -10
- data/lib/gir_ffi/info_ext/i_type_info.rb +63 -39
- data/lib/gir_ffi/info_ext.rb +5 -3
- data/lib/gir_ffi/null_argument_builder.rb +1 -1
- data/lib/gir_ffi/return_value_builder.rb +24 -16
- data/lib/gir_ffi/unintrospectable_type_info.rb +41 -0
- data/lib/gir_ffi/user_defined_property_info.rb +15 -0
- data/lib/gir_ffi/user_defined_type_info.rb +25 -0
- data/lib/gir_ffi/version.rb +1 -1
- data/lib/gir_ffi-base.rb +3 -0
- data/lib/gir_ffi.rb +2 -1
- data/test/ffi-glib/sized_array_test.rb +87 -0
- data/test/ffi-gobject_introspection/i_base_info_test.rb +4 -5
- data/test/gir_ffi/argument_builder_test.rb +26 -55
- data/test/gir_ffi/builder/type/unintrospectable_test.rb +3 -19
- data/test/gir_ffi/builder/type/user_defined_test.rb +16 -21
- data/test/gir_ffi/builder_test.rb +31 -53
- data/test/gir_ffi/callback_helper_test.rb +0 -47
- data/test/gir_ffi/callback_test.rb +49 -0
- data/test/gir_ffi/function_builder_test.rb +8 -8
- data/test/gir_ffi/in_out_pointer_test.rb +2 -53
- data/test/gir_ffi/in_pointer_test.rb +0 -13
- data/test/gir_ffi/info_ext/i_callable_info_test.rb +32 -0
- data/test/gir_ffi/info_ext/i_function_info_test.rb +61 -0
- data/test/gir_ffi/info_ext/i_signal_info_test.rb +7 -0
- data/test/gir_ffi/info_ext/i_type_info_test.rb +158 -77
- data/test/gir_ffi/return_value_builder_test.rb +2 -2
- data/test/gir_ffi/unintrospectable_type_info_test.rb +95 -0
- data/test/gir_ffi/user_defined_property_info_test.rb +19 -0
- data/test/gir_ffi/user_defined_type_info_test.rb +34 -0
- data/test/integration/generated_gimarshallingtests_test.rb +10 -10
- data/test/integration/generated_regress_test.rb +10 -10
- metadata +24 -15
- data/lib/gir_ffi/builder/type/struct_based.rb +0 -31
- data/lib/gir_ffi/user_defined/i_base_info.rb +0 -7
- data/lib/gir_ffi/user_defined/i_object_info.rb +0 -13
- data/lib/gir_ffi/user_defined/i_property_info.rb +0 -9
- data/lib/gir_ffi/user_defined/i_registered_type_info.rb +0 -10
- data/test/gir_ffi/user_defined/i_object_info_test.rb +0 -18
- data/test/gir_ffi/user_defined/i_property_info_test.rb +0 -14
- data/test/gir_ffi/user_defined/i_registered_type_info_test.rb +0 -10
data/History.txt
CHANGED
data/lib/ffi-glib/array.rb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
module GLib
|
2
2
|
module ContainerClassMethods
|
3
3
|
def wrap typespec, ptr
|
4
|
-
|
5
|
-
|
4
|
+
super(ptr).tap do |container|
|
5
|
+
container.reset_typespec typespec if container
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
@@ -13,6 +13,7 @@ module GLib
|
|
13
13
|
when FFI::Pointer
|
14
14
|
wrap typespec, it
|
15
15
|
when self
|
16
|
+
# TODO: Reset or check?
|
16
17
|
it.reset_typespec typespec
|
17
18
|
else
|
18
19
|
from_enumerable typespec, it
|
@@ -20,5 +21,3 @@ module GLib
|
|
20
21
|
end
|
21
22
|
end
|
22
23
|
end
|
23
|
-
|
24
|
-
|
data/lib/ffi-glib/hash_table.rb
CHANGED
@@ -56,7 +56,9 @@ module GLib
|
|
56
56
|
def self.hash_function_for keytype
|
57
57
|
case keytype
|
58
58
|
when :utf8
|
59
|
-
FFI::Function.new(:uint,
|
59
|
+
FFI::Function.new(:uint,
|
60
|
+
[:pointer],
|
61
|
+
find_support_function("g_str_hash"))
|
60
62
|
else
|
61
63
|
nil
|
62
64
|
end
|
@@ -65,13 +67,15 @@ module GLib
|
|
65
67
|
def self.equality_function_for keytype
|
66
68
|
case keytype
|
67
69
|
when :utf8
|
68
|
-
FFI::Function.new(:int,
|
70
|
+
FFI::Function.new(:int,
|
71
|
+
[:pointer, :pointer],
|
72
|
+
find_support_function("g_str_equal"))
|
69
73
|
else
|
70
74
|
nil
|
71
75
|
end
|
72
76
|
end
|
73
77
|
|
74
|
-
def self.
|
78
|
+
def self.find_support_function name
|
75
79
|
lib = ::GLib::Lib.ffi_libraries.first
|
76
80
|
lib.find_function(name)
|
77
81
|
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module GLib
|
2
|
+
# Class representing an array with a determined size
|
3
|
+
class SizedArray
|
4
|
+
include Enumerable
|
5
|
+
attr_reader :element_type, :size
|
6
|
+
|
7
|
+
def initialize element_type, size, pointer
|
8
|
+
@element_type = element_type
|
9
|
+
@size = size
|
10
|
+
@pointer = pointer
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_ptr
|
14
|
+
@pointer
|
15
|
+
end
|
16
|
+
|
17
|
+
def each &block
|
18
|
+
# TODO: Move implementation from GirFFI::ArgHelper to here.
|
19
|
+
# While doing so, the implentation could also become a real iterator
|
20
|
+
arr = GirFFI::ArgHelper.ptr_to_typed_array(@element_type, @pointer, @size)
|
21
|
+
if block_given?
|
22
|
+
arr.each(&block)
|
23
|
+
else
|
24
|
+
arr.each
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.wrap element_type, size, pointer
|
29
|
+
new element_type, size, pointer unless pointer.null?
|
30
|
+
end
|
31
|
+
|
32
|
+
class << self
|
33
|
+
def from element_type, size, item
|
34
|
+
return unless item
|
35
|
+
|
36
|
+
case item
|
37
|
+
when FFI::Pointer
|
38
|
+
wrap element_type, size, item
|
39
|
+
when self
|
40
|
+
from_sized_array size, item
|
41
|
+
else
|
42
|
+
from_enumerable element_type, size, item
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def from_sized_array size, sized_array
|
49
|
+
check_size(size, sized_array.size)
|
50
|
+
sized_array
|
51
|
+
end
|
52
|
+
|
53
|
+
def from_enumerable element_type, size, arr
|
54
|
+
check_size(size, arr.size)
|
55
|
+
ptr = GirFFI::InPointer.from_array element_type, arr
|
56
|
+
self.wrap element_type, arr.size, ptr
|
57
|
+
end
|
58
|
+
|
59
|
+
def check_size(expected_size, size)
|
60
|
+
if expected_size > 0 && size != expected_size
|
61
|
+
raise ArgumentError, "Expected size #{expected_size}, got #{size}"
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
data/lib/ffi-glib/strv.rb
CHANGED
data/lib/ffi-glib.rb
CHANGED
@@ -3,12 +3,13 @@
|
|
3
3
|
|
4
4
|
GirFFI.setup :GLib
|
5
5
|
|
6
|
-
require 'ffi-glib/s_list'
|
7
|
-
require 'ffi-glib/list'
|
8
|
-
require 'ffi-glib/hash_table'
|
9
|
-
require 'ffi-glib/byte_array'
|
10
6
|
require 'ffi-glib/array'
|
7
|
+
require 'ffi-glib/byte_array'
|
8
|
+
require 'ffi-glib/hash_table'
|
9
|
+
require 'ffi-glib/list'
|
11
10
|
require 'ffi-glib/ptr_array'
|
11
|
+
require 'ffi-glib/s_list'
|
12
|
+
require 'ffi-glib/sized_array'
|
12
13
|
require 'ffi-glib/strv'
|
13
14
|
|
14
15
|
module GLib
|
data/lib/ffi-gobject/object.rb
CHANGED
@@ -46,10 +46,9 @@ module GObject
|
|
46
46
|
def adjust_value_to_type val, type
|
47
47
|
case type.tag
|
48
48
|
when :ghash
|
49
|
-
GLib::HashTable.from
|
50
|
-
val
|
49
|
+
GLib::HashTable.from type.element_type, val
|
51
50
|
when :glist
|
52
|
-
GLib::List.from type.
|
51
|
+
GLib::List.from type.element_type, val
|
53
52
|
else
|
54
53
|
val
|
55
54
|
end
|
@@ -37,8 +37,9 @@ module GObject
|
|
37
37
|
return closure
|
38
38
|
end
|
39
39
|
|
40
|
+
# TODO: Use invocation_hint and marshal_data
|
40
41
|
def self.marshaller(closure, return_value, n_param_values,
|
41
|
-
param_values,
|
42
|
+
param_values, _invocation_hint, _marshal_data)
|
42
43
|
rclosure = wrap(closure.to_ptr)
|
43
44
|
|
44
45
|
args = n_param_values.times.map {|idx|
|
@@ -47,7 +48,7 @@ module GObject
|
|
47
48
|
|
48
49
|
result = rclosure.invoke_block(*args)
|
49
50
|
|
50
|
-
return_value.set_ruby_value(result)
|
51
|
+
return_value.set_ruby_value(result) if return_value
|
51
52
|
end
|
52
53
|
end
|
53
54
|
end
|
data/lib/ffi-gobject/value.rb
CHANGED
@@ -3,6 +3,7 @@ module GObject
|
|
3
3
|
|
4
4
|
# Overrides for GValue, GObject's generic value container structure.
|
5
5
|
class Value
|
6
|
+
# TODO: Give more generic name
|
6
7
|
def set_ruby_value val
|
7
8
|
if current_gtype == 0
|
8
9
|
init_for_ruby_value val
|
@@ -25,8 +26,7 @@ module GObject
|
|
25
26
|
}
|
26
27
|
|
27
28
|
def set_value val
|
28
|
-
|
29
|
-
call_or_raise method, val
|
29
|
+
send set_method, val
|
30
30
|
self
|
31
31
|
end
|
32
32
|
|
@@ -70,12 +70,13 @@ module GObject
|
|
70
70
|
TYPE_POINTER => :get_pointer
|
71
71
|
}
|
72
72
|
|
73
|
+
# TODO: Rename to get_value
|
73
74
|
def ruby_value
|
74
|
-
|
75
|
-
call_or_raise method
|
75
|
+
send get_method
|
76
76
|
end
|
77
77
|
|
78
78
|
class << self
|
79
|
+
# TODO: Give more generic name
|
79
80
|
def wrap_ruby_value val
|
80
81
|
self.new.set_ruby_value val
|
81
82
|
end
|
@@ -97,15 +98,22 @@ module GObject
|
|
97
98
|
end
|
98
99
|
end
|
99
100
|
|
101
|
+
# TODO: Combine with wrap_ruby_value
|
102
|
+
def self.wrap_instance instance
|
103
|
+
self.new.tap {|it|
|
104
|
+
it.init GObject.type_from_instance instance
|
105
|
+
it.set_instance instance
|
106
|
+
}
|
107
|
+
end
|
108
|
+
|
100
109
|
private
|
101
110
|
|
102
111
|
def set_instance_enhanced val
|
103
|
-
check_type_compatibility val
|
112
|
+
check_type_compatibility val if val
|
104
113
|
set_instance val
|
105
114
|
end
|
106
115
|
|
107
116
|
def check_type_compatibility val
|
108
|
-
return if val.nil?
|
109
117
|
if !GObject::Value.type_compatible(GObject.type_from_instance(val), current_gtype)
|
110
118
|
raise ArgumentError, "#{val.class} is incompatible with #{current_gtype_name}"
|
111
119
|
end
|
@@ -113,22 +121,26 @@ module GObject
|
|
113
121
|
|
114
122
|
def get_boxed_enhanced
|
115
123
|
boxed = get_boxed
|
116
|
-
|
124
|
+
gtype = current_gtype
|
125
|
+
|
126
|
+
case gtype
|
117
127
|
when TYPE_STRV
|
118
128
|
GLib::Strv.wrap boxed
|
119
129
|
when TYPE_HASH_TABLE
|
120
130
|
GLib::HashTable.wrap [:gpointer, :gpointer], boxed
|
121
131
|
else
|
122
|
-
GirFFI::ArgHelper.wrap_object_pointer_by_gtype boxed,
|
132
|
+
GirFFI::ArgHelper.wrap_object_pointer_by_gtype boxed, gtype
|
123
133
|
end
|
124
134
|
end
|
125
135
|
|
126
|
-
def
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
136
|
+
def get_method
|
137
|
+
TYPE_TO_GET_METHOD_MAP[current_fundamental_type] or
|
138
|
+
raise "Can't find method to get #{current_gtype_name}"
|
139
|
+
end
|
140
|
+
|
141
|
+
def set_method
|
142
|
+
TYPE_TO_SET_METHOD_MAP[current_fundamental_type] or
|
143
|
+
raise "Can't find method to set #{current_gtype_name}"
|
132
144
|
end
|
133
145
|
end
|
134
146
|
end
|
data/lib/ffi-gobject.rb
CHANGED
@@ -61,15 +61,13 @@ module GObject
|
|
61
61
|
|
62
62
|
def self.signal_emit object, detailed_signal, *args
|
63
63
|
signal, detail = detailed_signal.split('::')
|
64
|
-
|
65
|
-
|
66
|
-
id = signal_lookup_from_instance signal, object
|
64
|
+
signal_id = signal_lookup_from_instance signal, object
|
67
65
|
detail_quark = GLib.quark_from_string(detail)
|
68
|
-
|
66
|
+
sig_info = object.class.find_signal signal
|
69
67
|
arr = sig_info.signal_arguments_to_gvalue_array object, *args
|
70
68
|
rval = sig_info.gvalue_for_signal_return_value
|
71
69
|
|
72
|
-
Lib.g_signal_emitv arr.values,
|
70
|
+
Lib.g_signal_emitv arr.values, signal_id, detail_quark, rval
|
73
71
|
|
74
72
|
return rval
|
75
73
|
end
|
@@ -79,10 +77,13 @@ module GObject
|
|
79
77
|
sig_info = object.class.find_signal signal
|
80
78
|
callback = sig_info.signal_callback(&block)
|
81
79
|
GirFFI::CallbackHelper.store_callback callback
|
80
|
+
|
82
81
|
data_ptr = GirFFI::ArgHelper.object_to_inptr data
|
82
|
+
|
83
83
|
Lib.g_signal_connect_data object, detailed_signal, callback, data_ptr, nil, 0
|
84
84
|
end
|
85
85
|
|
86
|
+
# Smells of :reek:LongParameterList: due to the C interface.
|
86
87
|
def self.param_spec_int(name, nick, blurb, minimum, maximum,
|
87
88
|
default_value, flags)
|
88
89
|
ptr = Lib.g_param_spec_int(name, nick, blurb, minimum, maximum,
|
@@ -97,6 +98,8 @@ module GObject
|
|
97
98
|
load_class :ParamFlags
|
98
99
|
|
99
100
|
module Lib
|
101
|
+
# NOTE: This Lib module is set up in `gir_ffi-base/gobject/lib.rb`.
|
102
|
+
|
100
103
|
attach_function :g_object_ref, [:pointer], :void
|
101
104
|
attach_function :g_object_ref_sink, [:pointer], :void
|
102
105
|
attach_function :g_object_unref, [:pointer], :void
|
@@ -3,10 +3,11 @@ module GObjectIntrospection
|
|
3
3
|
# Decendant types will be implemented as needed.
|
4
4
|
class IBaseInfo
|
5
5
|
def initialize ptr, lib=Lib
|
6
|
-
raise ArgumentError, "ptr must not be nil" if ptr.nil?
|
7
6
|
raise ArgumentError, "ptr must not be null" if ptr.null?
|
8
7
|
|
9
|
-
|
8
|
+
unless defined?(RUBY_ENGINE) && RUBY_ENGINE == 'rbx'
|
9
|
+
ObjectSpace.define_finalizer self, self.class.make_finalizer(lib, ptr)
|
10
|
+
end
|
10
11
|
|
11
12
|
@gobj = ptr
|
12
13
|
@lib = lib
|
@@ -1,22 +1,35 @@
|
|
1
1
|
module GObjectIntrospection
|
2
2
|
# Wraps a GIUnionInfo struct.
|
3
3
|
# Represents a union.
|
4
|
-
# Not implemented yet.
|
5
4
|
class IUnionInfo < IRegisteredTypeInfo
|
6
|
-
def n_fields
|
7
|
-
|
5
|
+
def n_fields
|
6
|
+
Lib.g_union_info_get_n_fields @gobj
|
7
|
+
end
|
8
|
+
def field(index)
|
9
|
+
IFieldInfo.wrap(Lib.g_union_info_get_field @gobj, index)
|
10
|
+
end
|
8
11
|
|
9
12
|
##
|
10
13
|
build_array_method :fields
|
11
14
|
|
12
|
-
def get_n_methods
|
13
|
-
|
15
|
+
def get_n_methods
|
16
|
+
Lib.g_union_info_get_n_methods @gobj
|
17
|
+
end
|
18
|
+
def get_method(index)
|
19
|
+
IFunctionInfo.wrap(Lib.g_union_info_get_method @gobj, index)
|
20
|
+
end
|
14
21
|
|
15
22
|
##
|
16
23
|
build_array_method :get_methods
|
17
24
|
|
18
|
-
def find_method(name)
|
19
|
-
|
20
|
-
|
25
|
+
def find_method(name)
|
26
|
+
IFunctionInfo.wrap(Lib.g_union_info_find_method @gobj, name)
|
27
|
+
end
|
28
|
+
def size
|
29
|
+
Lib.g_union_info_get_size @gobj
|
30
|
+
end
|
31
|
+
def alignment
|
32
|
+
Lib.g_union_info_get_alignment @gobj
|
33
|
+
end
|
21
34
|
end
|
22
35
|
end
|
@@ -233,6 +233,7 @@ module GObjectIntrospection
|
|
233
233
|
attach_function :g_interface_info_get_constant, [:pointer, :int], :pointer
|
234
234
|
attach_function :g_interface_info_get_iface_struct, [:pointer], :pointer
|
235
235
|
|
236
|
+
# Union type representing an argument value
|
236
237
|
class GIArgument < FFI::Union
|
237
238
|
signed_size_t = "int#{FFI.type_size(:size_t) * 8}".to_sym
|
238
239
|
|
@@ -48,11 +48,13 @@ module GirFFI
|
|
48
48
|
case specialized_type_tag
|
49
49
|
when :enum, :flags
|
50
50
|
"#{argument_class_name}[#{output_conversion_arguments}]"
|
51
|
+
when :utf8
|
52
|
+
"ArgHelper.ptr_to_utf8 #{callarg}.to_value"
|
51
53
|
else
|
52
54
|
"#{argument_class_name}.wrap(#{output_conversion_arguments})"
|
53
55
|
end
|
54
56
|
elsif is_fixed_length_array?
|
55
|
-
"#{
|
57
|
+
"GLib::SizedArray.wrap(#{subtype_tag_or_class_name}, #{array_size}, #{callarg}.to_value)"
|
56
58
|
else
|
57
59
|
"#{callarg}.to_value"
|
58
60
|
end
|
@@ -91,9 +93,9 @@ module GirFFI
|
|
91
93
|
def set_function_call_argument
|
92
94
|
value = if @direction == :out
|
93
95
|
if is_caller_allocated_object?
|
94
|
-
"#{argument_class_name}.
|
96
|
+
"#{argument_class_name}._allocate"
|
95
97
|
else
|
96
|
-
"GirFFI::InOutPointer.for #{
|
98
|
+
"GirFFI::InOutPointer.for #{specialized_type_tag.inspect}"
|
97
99
|
end
|
98
100
|
else
|
99
101
|
if needs_ingoing_parameter_conversion?
|
@@ -112,7 +114,7 @@ module GirFFI
|
|
112
114
|
|
113
115
|
def needs_outgoing_parameter_conversion?
|
114
116
|
[ :array, :enum, :flags, :ghash, :glist, :gslist, :object, :struct,
|
115
|
-
:strv ].include?(specialized_type_tag)
|
117
|
+
:strv, :utf8 ].include?(specialized_type_tag)
|
116
118
|
end
|
117
119
|
|
118
120
|
def needs_ingoing_parameter_conversion?
|
@@ -127,23 +129,13 @@ module GirFFI
|
|
127
129
|
base = "#{argument_class_name}[#{parameter_conversion_arguments}]"
|
128
130
|
"GirFFI::InOutPointer.from #{specialized_type_tag.inspect}, #{base}"
|
129
131
|
when :object, :struct, :void, :glist, :gslist, :ghash, :array,
|
130
|
-
:zero_terminated, :strv, :callback
|
132
|
+
:zero_terminated, :strv, :callback, :utf8, :c
|
131
133
|
base = "#{argument_class_name}.from(#{parameter_conversion_arguments})"
|
132
134
|
if has_output_value?
|
133
|
-
|
134
|
-
"GirFFI::InOutPointer.from #{type_specification}, #{base}"
|
135
|
-
else
|
136
|
-
"GirFFI::InOutPointer.from :pointer, #{base}"
|
137
|
-
end
|
135
|
+
"GirFFI::InOutPointer.from :pointer, #{base}"
|
138
136
|
else
|
139
137
|
base
|
140
138
|
end
|
141
|
-
when :c, :utf8
|
142
|
-
if has_output_value?
|
143
|
-
"GirFFI::InOutPointer.from #{parameter_conversion_arguments}"
|
144
|
-
else
|
145
|
-
"GirFFI::InPointer.from(#{parameter_conversion_arguments})"
|
146
|
-
end
|
147
139
|
else
|
148
140
|
base = "#{parameter_conversion_arguments}"
|
149
141
|
"GirFFI::InOutPointer.from #{specialized_type_tag.inspect}, #{base}"
|
@@ -157,9 +149,5 @@ module GirFFI
|
|
157
149
|
def parameter_conversion_arguments
|
158
150
|
conversion_arguments @name
|
159
151
|
end
|
160
|
-
|
161
|
-
def self_t
|
162
|
-
type_tag.inspect
|
163
|
-
end
|
164
152
|
end
|
165
153
|
end
|
@@ -33,45 +33,30 @@ module GirFFI
|
|
33
33
|
@typeinfo
|
34
34
|
end
|
35
35
|
|
36
|
-
def type_tag
|
37
|
-
type_info.tag
|
38
|
-
end
|
39
|
-
|
40
36
|
def specialized_type_tag
|
41
37
|
type_info.flattened_tag
|
42
38
|
end
|
43
39
|
|
44
|
-
def type_specification
|
45
|
-
type_info.type_specification
|
46
|
-
end
|
47
|
-
|
48
40
|
TAG_TO_WRAPPER_CLASS_MAP = {
|
41
|
+
:array => 'GLib::Array',
|
42
|
+
:byte_array => 'GLib::ByteArray',
|
43
|
+
:c => 'GLib::SizedArray',
|
44
|
+
:callback => 'GirFFI::Callback',
|
45
|
+
:ghash => 'GLib::HashTable',
|
49
46
|
:glist => 'GLib::List',
|
50
47
|
:gslist => 'GLib::SList',
|
51
|
-
:
|
52
|
-
:
|
48
|
+
:ptr_array => 'GLib::PtrArray',
|
49
|
+
:strv => 'GLib::Strv',
|
53
50
|
:utf8 => 'GirFFI::InPointer',
|
54
|
-
:void => 'GirFFI::InPointer'
|
51
|
+
:void => 'GirFFI::InPointer',
|
52
|
+
:zero_terminated => 'GirFFI::ZeroTerminated'
|
55
53
|
}
|
56
54
|
|
55
|
+
# TODO: Use class rather than class name
|
57
56
|
def argument_class_name
|
58
57
|
case (tag = type_info.flattened_tag)
|
59
58
|
when :struct, :union, :object, :interface, :enum, :flags
|
60
59
|
type_info.interface_type_name
|
61
|
-
when :callback
|
62
|
-
'GirFFI::Callback'
|
63
|
-
when :byte_array
|
64
|
-
'GLib::ByteArray'
|
65
|
-
when :array
|
66
|
-
'GLib::Array'
|
67
|
-
when :ptr_array
|
68
|
-
'GLib::PtrArray'
|
69
|
-
when :strv
|
70
|
-
'GLib::Strv'
|
71
|
-
when :c
|
72
|
-
'GirFFI::InPointer'
|
73
|
-
when :zero_terminated
|
74
|
-
'GirFFI::ZeroTerminated'
|
75
60
|
else
|
76
61
|
TAG_TO_WRAPPER_CLASS_MAP[tag]
|
77
62
|
end
|
@@ -130,11 +115,11 @@ module GirFFI
|
|
130
115
|
def conversion_arguments name
|
131
116
|
case specialized_type_tag
|
132
117
|
when :utf8, :void
|
133
|
-
"#{
|
118
|
+
"#{specialized_type_tag.inspect}, #{name}"
|
119
|
+
when :c
|
120
|
+
"#{subtype_tag_or_class_name}, #{type_info.array_fixed_size}, #{name}"
|
134
121
|
when :glist, :gslist, :ghash, :array, :zero_terminated
|
135
122
|
"#{elm_t}, #{name}"
|
136
|
-
when :c
|
137
|
-
"#{type_specification}, #{name}"
|
138
123
|
when :callback
|
139
124
|
iface = type_info.interface
|
140
125
|
"\"#{iface.namespace}\", \"#{iface.name}\", #{name}"
|
@@ -144,5 +129,3 @@ module GirFFI
|
|
144
129
|
end
|
145
130
|
end
|
146
131
|
end
|
147
|
-
|
148
|
-
|
@@ -29,7 +29,8 @@ module GirFFI
|
|
29
29
|
lib = modul.const_get(:Lib)
|
30
30
|
|
31
31
|
Builder.attach_ffi_function lib, go
|
32
|
-
|
32
|
+
definition = function_definition(go, lib)
|
33
|
+
modul.class_eval definition
|
33
34
|
|
34
35
|
true
|
35
36
|
end
|
@@ -46,13 +47,6 @@ module GirFFI
|
|
46
47
|
def build_module
|
47
48
|
unless defined? @module
|
48
49
|
build_dependencies
|
49
|
-
build_module_non_recursive
|
50
|
-
end
|
51
|
-
@module
|
52
|
-
end
|
53
|
-
|
54
|
-
def build_module_non_recursive
|
55
|
-
unless defined? @module
|
56
50
|
instantiate_module
|
57
51
|
setup_lib_for_ffi
|
58
52
|
setup_module unless already_set_up
|
@@ -66,7 +60,7 @@ module GirFFI
|
|
66
60
|
deps = gir.dependencies @namespace
|
67
61
|
deps.each {|dep|
|
68
62
|
name, version = dep.split '-'
|
69
|
-
Builder.
|
63
|
+
Builder.build_module name, version
|
70
64
|
}
|
71
65
|
end
|
72
66
|
|
@@ -1,4 +1,6 @@
|
|
1
|
-
require 'gir_ffi/builder/type/
|
1
|
+
require 'gir_ffi/builder/type/registered_type'
|
2
|
+
require 'gir_ffi/builder/type/with_layout'
|
3
|
+
require 'gir_ffi/builder/type/with_methods'
|
2
4
|
require 'gir_ffi/builder/property'
|
3
5
|
require 'gir_ffi/object_base'
|
4
6
|
|
@@ -7,7 +9,10 @@ module GirFFI
|
|
7
9
|
module Type
|
8
10
|
|
9
11
|
# Implements the creation of a class representing a GObject Object.
|
10
|
-
class Object <
|
12
|
+
class Object < RegisteredType
|
13
|
+
include WithMethods
|
14
|
+
include WithLayout
|
15
|
+
|
11
16
|
def find_signal signal_name
|
12
17
|
signal_definers.each do |inf|
|
13
18
|
inf.signals.each do |sig|
|
@@ -46,10 +51,15 @@ module GirFFI
|
|
46
51
|
setup_interfaces
|
47
52
|
end
|
48
53
|
|
54
|
+
# FIXME: Private method only in subclass
|
55
|
+
def layout_superclass
|
56
|
+
FFI::Struct
|
57
|
+
end
|
58
|
+
|
49
59
|
def parent
|
50
60
|
unless defined? @parent
|
51
61
|
pr = info.parent
|
52
|
-
if pr.nil? or (pr.
|
62
|
+
if pr.nil? or (pr.safe_name == @classname and pr.namespace == @namespace)
|
53
63
|
@parent = nil
|
54
64
|
else
|
55
65
|
@parent = pr
|