gir_ffi 0.0.10 → 0.0.11
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 +11 -0
- data/README.rdoc +28 -14
- data/Rakefile +1 -1
- data/TODO.rdoc +3 -24
- data/examples/05_notification.rb +35 -0
- data/lib/gir_ffi/arg_helper.rb +15 -279
- data/lib/gir_ffi/builder/argument/base.rb +110 -0
- data/lib/gir_ffi/builder/argument/hash_table_base.rb +20 -0
- data/lib/gir_ffi/builder/argument/in_base.rb +19 -0
- data/lib/gir_ffi/builder/argument/in_out_base.rb +25 -0
- data/lib/gir_ffi/builder/argument/list_base.rb +16 -0
- data/lib/gir_ffi/builder/argument/out_base.rb +27 -0
- data/lib/gir_ffi/builder/argument.rb +167 -357
- data/lib/gir_ffi/builder/function.rb +2 -0
- data/lib/gir_ffi/builder/module.rb +2 -2
- data/lib/gir_ffi/builder/type/base.rb +7 -0
- data/lib/gir_ffi/builder/type/callback.rb +1 -8
- data/lib/gir_ffi/builder/type/constant.rb +1 -6
- data/lib/gir_ffi/builder/type/enum.rb +2 -7
- data/lib/gir_ffi/builder/type/interface.rb +12 -14
- data/lib/gir_ffi/builder/type/object.rb +32 -13
- data/lib/gir_ffi/builder/type/registered_type.rb +1 -78
- data/lib/gir_ffi/builder/type/struct.rb +2 -0
- data/lib/gir_ffi/builder/type/struct_based.rb +9 -24
- data/lib/gir_ffi/builder/type/unintrospectable.rb +63 -0
- data/lib/gir_ffi/builder/type/union.rb +8 -7
- data/lib/gir_ffi/builder/type/with_layout.rb +43 -0
- data/lib/gir_ffi/builder/type/with_methods.rb +61 -0
- data/lib/gir_ffi/builder.rb +39 -0
- data/lib/gir_ffi/callback_helper.rb +58 -0
- data/lib/gir_ffi/class_base.rb +17 -5
- data/lib/gir_ffi/i_repository.rb +0 -4
- data/lib/gir_ffi/in_out_pointer.rb +76 -0
- data/lib/gir_ffi/in_pointer.rb +46 -0
- data/lib/gir_ffi/interface_base.rb +12 -0
- data/lib/gir_ffi/module_base.rb +7 -3
- data/lib/gir_ffi/overrides/glib.rb +14 -3
- data/lib/gir_ffi/overrides/gobject.rb +37 -15
- data/lib/gir_ffi/overrides/gtk.rb +1 -1
- data/lib/gir_ffi/version.rb +1 -1
- data/lib/gir_ffi.rb +3 -0
- data/tasks/rdoc.rake +6 -0
- data/tasks/test.rake +22 -3
- data/tasks/yardoc.rake +6 -0
- data/test/arg_helper_test.rb +2 -72
- data/test/builder_test.rb +15 -19
- data/test/function_definition_builder_test.rb +30 -37
- data/test/g_object_overrides_test.rb +29 -1
- data/test/glib_overrides_test.rb +4 -0
- data/test/gtk_overrides_test.rb +21 -15
- data/test/i_repository_test.rb +2 -1
- data/test/{generated_gimarshallingtests_test.rb → integration/generated_gimarshallingtests_test.rb} +1 -1
- data/test/integration/generated_gio_test.rb +98 -0
- data/test/integration/generated_gobject_test.rb +30 -0
- data/test/{generated_gtk_test.rb → integration/generated_gtk_test.rb} +5 -5
- data/test/{generated_regress_test.rb → integration/generated_regress_test.rb} +19 -5
- data/test/interface_type_builder_test.rb +1 -1
- data/test/module_builder_test.rb +3 -3
- data/test/test_helper.rb +4 -9
- data/test/type_builder_test.rb +5 -5
- data/test/{dynamic_type_builder_test.rb → unintrospectable_type_builder_test.rb} +12 -8
- data/test/unit/builder_test.rb +31 -0
- data/test/unit/callback_helper_test.rb +19 -0
- data/test/unit/constant_builder_test.rb +5 -0
- data/test/unit/i_constant_info_test.rb +17 -0
- data/test/unit/in_out_pointer_test.rb +118 -0
- data/test/unit/in_pointer_test.rb +69 -0
- data/test/unit/object_type_builder_test.rb +20 -0
- metadata +47 -19
- data/lib/gir_ffi/builder/dynamic_type.rb +0 -41
- data/test/generated_gio_test.rb +0 -39
- data/test/generated_gobject_test.rb +0 -15
- data/test/object_type_builder_test.rb +0 -34
@@ -0,0 +1,58 @@
|
|
1
|
+
module GirFFI
|
2
|
+
module CallbackHelper
|
3
|
+
def self.wrap_in_callback_args_mapper namespace, name, prc
|
4
|
+
return prc if FFI::Function === prc
|
5
|
+
return nil if prc.nil?
|
6
|
+
info = IRepository.default.find_by_name namespace, name
|
7
|
+
return Proc.new do |*args|
|
8
|
+
prc.call(*map_callback_args(args, info))
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.map_callback_args args, info
|
13
|
+
args.zip(info.args).map { |arg, inf|
|
14
|
+
map_single_callback_arg arg, inf }
|
15
|
+
end
|
16
|
+
|
17
|
+
# TODO: Use GirFFI::ReturnValue classes for mapping.
|
18
|
+
def self.map_single_callback_arg arg, info
|
19
|
+
case info.argument_type.tag
|
20
|
+
when :interface
|
21
|
+
map_interface_callback_arg arg, info
|
22
|
+
when :utf8
|
23
|
+
ArgHelper.ptr_to_utf8 arg
|
24
|
+
when :void
|
25
|
+
map_void_callback_arg arg
|
26
|
+
else
|
27
|
+
arg
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.map_interface_callback_arg arg, info
|
32
|
+
iface = info.argument_type.interface
|
33
|
+
case iface.info_type
|
34
|
+
when :object
|
35
|
+
ArgHelper.object_pointer_to_object arg
|
36
|
+
when :struct
|
37
|
+
klass = GirFFI::Builder.build_class iface
|
38
|
+
klass.wrap arg
|
39
|
+
else
|
40
|
+
arg
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.map_void_callback_arg arg
|
45
|
+
if arg.null?
|
46
|
+
nil
|
47
|
+
else
|
48
|
+
begin
|
49
|
+
# TODO: Use custom object store.
|
50
|
+
ObjectSpace._id2ref arg.address
|
51
|
+
rescue RangeError
|
52
|
+
arg
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
data/lib/gir_ffi/class_base.rb
CHANGED
@@ -15,19 +15,19 @@ module GirFFI
|
|
15
15
|
self.class.ffi_structure
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
19
|
-
self.class.
|
18
|
+
def _builder
|
19
|
+
self.class._builder
|
20
20
|
end
|
21
21
|
|
22
22
|
def setup_and_call method, *arguments, &block
|
23
|
-
unless
|
23
|
+
unless _builder.setup_instance_method method.to_s
|
24
24
|
raise RuntimeError, "Unable to set up instance method #{method} in #{self}"
|
25
25
|
end
|
26
26
|
self.send method, *arguments, &block
|
27
27
|
end
|
28
28
|
|
29
29
|
def self.setup_and_call method, *arguments, &block
|
30
|
-
unless
|
30
|
+
unless _builder.setup_method method.to_s
|
31
31
|
raise RuntimeError, "Unable to set up method #{method} in #{self}"
|
32
32
|
end
|
33
33
|
self.send method, *arguments, &block
|
@@ -42,10 +42,22 @@ module GirFFI
|
|
42
42
|
self.const_get :GIR_INFO
|
43
43
|
end
|
44
44
|
|
45
|
-
def
|
45
|
+
def _builder
|
46
46
|
self.const_get :GIR_FFI_BUILDER
|
47
47
|
end
|
48
48
|
|
49
|
+
def _find_signal name
|
50
|
+
_builder.find_signal name
|
51
|
+
end
|
52
|
+
|
53
|
+
def _setup_method name
|
54
|
+
_builder.setup_method name
|
55
|
+
end
|
56
|
+
|
57
|
+
def _setup_instance_method name
|
58
|
+
_builder.setup_instance_method name
|
59
|
+
end
|
60
|
+
|
49
61
|
alias_method :_real_new, :new
|
50
62
|
undef new
|
51
63
|
|
data/lib/gir_ffi/i_repository.rb
CHANGED
@@ -1,6 +1,5 @@
|
|
1
1
|
require 'singleton'
|
2
2
|
require 'gir_ffi/lib'
|
3
|
-
require 'gir_ffi/g_object'
|
4
3
|
require 'gir_ffi/g_error'
|
5
4
|
require 'gir_ffi/i_base_info'
|
6
5
|
require 'gir_ffi/i_callable_info'
|
@@ -53,7 +52,6 @@ module GirFFI
|
|
53
52
|
}
|
54
53
|
|
55
54
|
def initialize
|
56
|
-
GObject.type_init
|
57
55
|
@gobj = Lib::g_irepository_get_default
|
58
56
|
end
|
59
57
|
|
@@ -63,12 +61,10 @@ module GirFFI
|
|
63
61
|
self.instance
|
64
62
|
end
|
65
63
|
|
66
|
-
# TODO: Make sure GType is initialized first.
|
67
64
|
def self.prepend_search_path path
|
68
65
|
Lib.g_irepository_prepend_search_path path
|
69
66
|
end
|
70
67
|
|
71
|
-
# TODO: Make sure GType is initialized first.
|
72
68
|
def self.type_tag_to_string type
|
73
69
|
Lib.g_type_tag_to_string type
|
74
70
|
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
module GirFFI
|
2
|
+
# The InOutPointer class handles conversion between ruby types and
|
3
|
+
# pointers for arguments with direction :inout and :out.
|
4
|
+
class InOutPointer < FFI::Pointer
|
5
|
+
def initialize ptr, type, ffi_type
|
6
|
+
super ptr
|
7
|
+
@ffi_type = ffi_type
|
8
|
+
@value_type = type
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_value
|
12
|
+
value = self.send "get_#{@ffi_type}", 0
|
13
|
+
adjust_value_out value
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def adjust_value_out value
|
19
|
+
case @value_type
|
20
|
+
when :gboolean
|
21
|
+
(value != 0)
|
22
|
+
when :utf8
|
23
|
+
ArgHelper.ptr_to_utf8 value
|
24
|
+
else
|
25
|
+
value
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.for type
|
30
|
+
ffi_type = type_to_ffi_type type
|
31
|
+
ptr = AllocationHelper.safe_malloc(FFI.type_size ffi_type)
|
32
|
+
ptr.send "put_#{ffi_type}", 0, 0
|
33
|
+
self.new ptr, type, ffi_type
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.from type, value
|
37
|
+
value = adjust_value_in type, value
|
38
|
+
ffi_type = type_to_ffi_type type
|
39
|
+
ptr = AllocationHelper.safe_malloc(FFI.type_size ffi_type)
|
40
|
+
ptr.send "put_#{ffi_type}", 0, value
|
41
|
+
self.new ptr, type, ffi_type
|
42
|
+
end
|
43
|
+
|
44
|
+
def self.from_array type, array
|
45
|
+
return nil if array.nil?
|
46
|
+
ptr = InPointer.from_array(type, array)
|
47
|
+
self.from :pointer, ptr
|
48
|
+
end
|
49
|
+
|
50
|
+
class << self
|
51
|
+
# TODO: Make separate module to hold type info.
|
52
|
+
def type_to_ffi_type type
|
53
|
+
case type
|
54
|
+
when :gboolean
|
55
|
+
:int32
|
56
|
+
when :utf8
|
57
|
+
:pointer
|
58
|
+
else
|
59
|
+
GirFFI::Builder::TAG_TYPE_MAP[type] || type
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def adjust_value_in type, value
|
64
|
+
case type
|
65
|
+
when :gboolean
|
66
|
+
(value ? 1 : 0)
|
67
|
+
when :utf8
|
68
|
+
InPointer.from :utf8, value
|
69
|
+
else
|
70
|
+
value
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
@@ -0,0 +1,46 @@
|
|
1
|
+
module GirFFI
|
2
|
+
# The InPointer class handles conversion from ruby types to pointers for
|
3
|
+
# arguments with direction :in. This is used for arguments that are
|
4
|
+
# arrays, strings, or interfaces.
|
5
|
+
class InPointer < FFI::Pointer
|
6
|
+
def self.from_array type, ary
|
7
|
+
return nil if ary.nil?
|
8
|
+
return from_utf8_array ary if type == :utf8
|
9
|
+
return from_interface_pointer_array ary if type == :interface_pointer
|
10
|
+
|
11
|
+
ffi_type = GirFFI::Builder::TAG_TYPE_MAP[type] || type
|
12
|
+
block = ArgHelper.allocate_array_of_type ffi_type, ary.length
|
13
|
+
block.send "put_array_of_#{ffi_type}", 0, ary
|
14
|
+
|
15
|
+
self.new block
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.from type, val
|
19
|
+
return nil if val.nil?
|
20
|
+
from_utf8 val
|
21
|
+
end
|
22
|
+
|
23
|
+
class << self
|
24
|
+
|
25
|
+
private
|
26
|
+
|
27
|
+
def from_utf8_array ary
|
28
|
+
ptr_ary = ary.map {|str| self.from :utf8, str}
|
29
|
+
ptr_ary << nil
|
30
|
+
self.from_array :pointer, ptr_ary
|
31
|
+
end
|
32
|
+
|
33
|
+
def from_interface_pointer_array ary
|
34
|
+
ptr_ary = ary.map {|ifc| ifc.to_ptr}
|
35
|
+
ptr_ary << nil
|
36
|
+
self.from_array :pointer, ptr_ary
|
37
|
+
end
|
38
|
+
|
39
|
+
def from_utf8 str
|
40
|
+
len = str.bytesize
|
41
|
+
ptr = AllocationHelper.safe_malloc(len + 1).write_string(str).put_char(len, 0)
|
42
|
+
self.new ptr
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/gir_ffi/module_base.rb
CHANGED
@@ -1,19 +1,23 @@
|
|
1
1
|
module GirFFI
|
2
2
|
module ModuleBase
|
3
3
|
def method_missing method, *arguments, &block
|
4
|
-
result =
|
4
|
+
result = _setup_method method.to_s
|
5
5
|
return super unless result
|
6
6
|
self.send method, *arguments, &block
|
7
7
|
end
|
8
8
|
|
9
9
|
def const_missing classname
|
10
|
-
klass =
|
10
|
+
klass = _builder.build_namespaced_class classname.to_s
|
11
11
|
return super if klass.nil?
|
12
12
|
klass
|
13
13
|
end
|
14
14
|
|
15
|
-
def
|
15
|
+
def _builder
|
16
16
|
self.const_get :GIR_FFI_BUILDER
|
17
17
|
end
|
18
|
+
|
19
|
+
def _setup_method name
|
20
|
+
_builder.setup_method name
|
21
|
+
end
|
18
22
|
end
|
19
23
|
end
|
@@ -39,20 +39,27 @@ module GirFFI
|
|
39
39
|
def self.attach_non_introspectable_functions base
|
40
40
|
base::Lib.attach_function :g_slist_prepend, [:pointer, :pointer],
|
41
41
|
:pointer
|
42
|
+
|
42
43
|
base::Lib.attach_function :g_list_append, [:pointer, :pointer],
|
43
44
|
:pointer
|
45
|
+
|
44
46
|
base::Lib.attach_function :g_hash_table_foreach,
|
45
47
|
[:pointer, base::HFunc, :pointer], :void
|
46
48
|
base::Lib.attach_function :g_hash_table_new,
|
47
49
|
[base::HashFunc, base::EqualFunc], :pointer
|
48
50
|
base::Lib.attach_function :g_hash_table_insert,
|
49
51
|
[:pointer, :pointer, :pointer], :void
|
52
|
+
|
50
53
|
base::Lib.attach_function :g_byte_array_new, [], :pointer
|
51
54
|
base::Lib.attach_function :g_byte_array_append,
|
52
55
|
[:pointer, :pointer, :uint], :pointer
|
56
|
+
|
53
57
|
base::Lib.attach_function :g_array_new, [:int, :int, :uint], :pointer
|
54
58
|
base::Lib.attach_function :g_array_append_vals,
|
55
59
|
[:pointer, :pointer, :uint], :pointer
|
60
|
+
|
61
|
+
base::Lib.attach_function :g_main_loop_new,
|
62
|
+
[:pointer, :bool], :pointer
|
56
63
|
end
|
57
64
|
|
58
65
|
module ClassMethods
|
@@ -99,7 +106,7 @@ module GirFFI
|
|
99
106
|
|
100
107
|
# FIXME: Turn into instance method
|
101
108
|
def byte_array_append arr, data
|
102
|
-
bytes = GirFFI::
|
109
|
+
bytes = GirFFI::InPointer.from :utf8, data
|
103
110
|
len = data.bytesize
|
104
111
|
::GLib::ByteArray.wrap(::GLib::Lib.g_byte_array_append arr.to_ptr, bytes, len)
|
105
112
|
end
|
@@ -115,7 +122,7 @@ module GirFFI
|
|
115
122
|
|
116
123
|
# FIXME: Turn into instance method
|
117
124
|
def array_append_vals arr, data
|
118
|
-
bytes = GirFFI::
|
125
|
+
bytes = GirFFI::InPointer.from_array arr.element_type, data
|
119
126
|
len = data.length
|
120
127
|
res = ::GLib::Array.wrap(
|
121
128
|
::GLib::Lib.g_array_append_vals(arr.to_ptr, bytes, len))
|
@@ -123,6 +130,10 @@ module GirFFI
|
|
123
130
|
res
|
124
131
|
end
|
125
132
|
|
133
|
+
# FIXME: Turn into real constructor?
|
134
|
+
def main_loop_new context, is_running
|
135
|
+
::GLib::MainLoop.wrap(::GLib::Lib.g_main_loop_new context, is_running)
|
136
|
+
end
|
126
137
|
end
|
127
138
|
|
128
139
|
module ListInstanceMethods
|
@@ -178,7 +189,7 @@ module GirFFI
|
|
178
189
|
|
179
190
|
def cast_to_pointer type, it
|
180
191
|
if type == :utf8
|
181
|
-
GirFFI::
|
192
|
+
GirFFI::InPointer.from :utf8, it
|
182
193
|
else
|
183
194
|
FFI::Pointer.new(it)
|
184
195
|
end
|
@@ -105,7 +105,7 @@ module GirFFI
|
|
105
105
|
end
|
106
106
|
|
107
107
|
def signal_connect object, signal, data=nil, &block
|
108
|
-
sig = object.class.
|
108
|
+
sig = object.class._find_signal signal
|
109
109
|
if sig.nil?
|
110
110
|
raise "Signal #{signal} is invalid for #{object}"
|
111
111
|
end
|
@@ -115,8 +115,7 @@ module GirFFI
|
|
115
115
|
|
116
116
|
rettype = GirFFI::Builder.itypeinfo_to_ffitype sig.return_type
|
117
117
|
|
118
|
-
|
119
|
-
argtypes = [:pointer] + sig.args.map {|arg| :pointer} + [:pointer]
|
118
|
+
argtypes = GirFFI::Builder.ffi_argument_types_for_signal sig
|
120
119
|
|
121
120
|
callback = FFI::Function.new rettype, argtypes,
|
122
121
|
&(Helper.signal_callback_args(sig, object.class, &block))
|
@@ -129,6 +128,10 @@ module GirFFI
|
|
129
128
|
end
|
130
129
|
|
131
130
|
module Helper
|
131
|
+
TAG_TYPE_TO_GTYPE_NAME_MAP = {
|
132
|
+
:utf8 => "gchararray"
|
133
|
+
}
|
134
|
+
|
132
135
|
def self.signal_callback_args sig, klass, &block
|
133
136
|
return Proc.new do |*args|
|
134
137
|
mapped = cast_back_signal_arguments sig, klass, *args
|
@@ -137,7 +140,7 @@ module GirFFI
|
|
137
140
|
end
|
138
141
|
|
139
142
|
def self.signal_arguments_to_gvalue_array signal, instance, *rest
|
140
|
-
sig = instance.class.
|
143
|
+
sig = instance.class._find_signal signal
|
141
144
|
|
142
145
|
arr = ::GObject::ValueArray.new sig.n_args+1
|
143
146
|
|
@@ -155,7 +158,10 @@ module GirFFI
|
|
155
158
|
end
|
156
159
|
|
157
160
|
def self.signal_argument_to_gvalue info, arg
|
158
|
-
|
161
|
+
arg_type = info.argument_type
|
162
|
+
tag = arg_type.tag
|
163
|
+
|
164
|
+
if tag == :interface
|
159
165
|
interface = info.argument_type.interface
|
160
166
|
|
161
167
|
val = ::GObject::Value.new
|
@@ -165,13 +171,17 @@ module GirFFI
|
|
165
171
|
val.set_boxed arg
|
166
172
|
when :object
|
167
173
|
val.set_instance arg
|
174
|
+
when :enum
|
175
|
+
val.set_enum arg
|
168
176
|
else
|
169
177
|
raise NotImplementedError, interface.info_type
|
170
178
|
end
|
171
179
|
|
172
180
|
return val
|
173
181
|
else
|
174
|
-
|
182
|
+
val = ::GObject::Value.new
|
183
|
+
val.init ::GObject.type_from_name(TAG_TYPE_TO_GTYPE_NAME_MAP[tag])
|
184
|
+
val.set_ruby_value arg
|
175
185
|
end
|
176
186
|
end
|
177
187
|
|
@@ -192,6 +202,7 @@ module GirFFI
|
|
192
202
|
rval
|
193
203
|
end
|
194
204
|
|
205
|
+
# TODO: Generate cast back methods using existing Argument builders.
|
195
206
|
def self.cast_back_signal_arguments signalinfo, klass, *args
|
196
207
|
result = []
|
197
208
|
|
@@ -202,14 +213,7 @@ module GirFFI
|
|
202
213
|
|
203
214
|
# Extra arguments
|
204
215
|
signalinfo.args.each do |info|
|
205
|
-
|
206
|
-
if info.argument_type.tag == :interface
|
207
|
-
iface = info.argument_type.interface
|
208
|
-
kls = GirFFI::Builder.build_class iface
|
209
|
-
result << kls.wrap(arg)
|
210
|
-
else
|
211
|
-
result << arg
|
212
|
-
end
|
216
|
+
result << cast_signal_argument(info, args.shift)
|
213
217
|
end
|
214
218
|
|
215
219
|
# User Data
|
@@ -227,6 +231,22 @@ module GirFFI
|
|
227
231
|
|
228
232
|
return result
|
229
233
|
end
|
234
|
+
|
235
|
+
def self.cast_signal_argument info, arg
|
236
|
+
arg_t = info.argument_type
|
237
|
+
if arg_t.tag == :interface
|
238
|
+
iface = arg_t.interface
|
239
|
+
kls = GirFFI::Builder.build_class iface
|
240
|
+
case iface.info_type
|
241
|
+
when :enum, :flags
|
242
|
+
kls[arg]
|
243
|
+
else
|
244
|
+
kls.wrap(arg)
|
245
|
+
end
|
246
|
+
else
|
247
|
+
arg
|
248
|
+
end
|
249
|
+
end
|
230
250
|
end
|
231
251
|
|
232
252
|
module InitiallyUnownedClassMethods
|
@@ -252,6 +272,8 @@ module GirFFI
|
|
252
272
|
set_boolean val
|
253
273
|
when "gint"
|
254
274
|
set_int val
|
275
|
+
when "gchararray"
|
276
|
+
set_string val
|
255
277
|
else
|
256
278
|
nil
|
257
279
|
end
|
@@ -296,7 +318,7 @@ module GirFFI
|
|
296
318
|
|
297
319
|
module ClosureInstanceMethods
|
298
320
|
def set_marshal marshal
|
299
|
-
_v1 = GirFFI::
|
321
|
+
_v1 = GirFFI::CallbackHelper.wrap_in_callback_args_mapper(
|
300
322
|
"GObject", "ClosureMarshal", marshal)
|
301
323
|
::GObject::Lib::CALLBACKS << _v1
|
302
324
|
::GObject::Lib.g_closure_set_marshal self, _v1
|
data/lib/gir_ffi/version.rb
CHANGED
data/lib/gir_ffi.rb
CHANGED
data/tasks/rdoc.rake
ADDED
data/tasks/test.rake
CHANGED
@@ -2,9 +2,21 @@ require 'rake/testtask'
|
|
2
2
|
|
3
3
|
namespace :test do
|
4
4
|
|
5
|
+
Rake::TestTask.new(:integration) do |t|
|
6
|
+
t.libs = ['lib']
|
7
|
+
t.test_files = FileList['test/integration/*_test.rb']
|
8
|
+
t.ruby_opts += ["-w"]
|
9
|
+
end
|
10
|
+
|
5
11
|
Rake::TestTask.new(:run) do |t|
|
6
12
|
t.libs = ['lib']
|
7
|
-
t.test_files = FileList['test
|
13
|
+
t.test_files = FileList['test/*_test.rb']
|
14
|
+
t.ruby_opts += ["-w"]
|
15
|
+
end
|
16
|
+
|
17
|
+
Rake::TestTask.new(:unit) do |t|
|
18
|
+
t.libs = ['lib']
|
19
|
+
t.test_files = FileList['test/unit/*_test.rb']
|
8
20
|
t.ruby_opts += ["-w"]
|
9
21
|
end
|
10
22
|
|
@@ -13,7 +25,14 @@ namespace :test do
|
|
13
25
|
sh %{cd test/lib && make}
|
14
26
|
end
|
15
27
|
|
28
|
+
task :integration => :lib
|
16
29
|
task :run => :lib
|
30
|
+
|
31
|
+
desc 'Run rcov for the entire test suite'
|
32
|
+
task :coverage => :lib do
|
33
|
+
rm_f "coverage"
|
34
|
+
system "rcov", "-Ilib", "--exclude", "\.gem\/,\/gems\/", *FileList['test/**/*_test.rb']
|
35
|
+
end
|
17
36
|
end
|
18
37
|
|
19
38
|
file "test/lib/Makefile" => "test/lib/configure" do
|
@@ -24,5 +43,5 @@ file "test/lib/configure" do
|
|
24
43
|
sh %{cd test/lib && NOCONFIGURE=1 ./autogen.sh}
|
25
44
|
end
|
26
45
|
|
27
|
-
desc '
|
28
|
-
task :test => 'test:run'
|
46
|
+
desc 'Run unit an integration tests'
|
47
|
+
task :test => ['test:unit', 'test:run', 'test:integration']
|
data/tasks/yardoc.rake
ADDED
data/test/arg_helper_test.rb
CHANGED
@@ -1,54 +1,6 @@
|
|
1
1
|
require File.expand_path('test_helper.rb', File.dirname(__FILE__))
|
2
2
|
|
3
3
|
class ArgHelperTest < MiniTest::Spec
|
4
|
-
context "The gint32_to_inoutptr method's return value" do
|
5
|
-
setup do
|
6
|
-
@result = GirFFI::ArgHelper.gint32_to_inoutptr 24
|
7
|
-
end
|
8
|
-
|
9
|
-
should "be an FFI::Pointer" do
|
10
|
-
assert_instance_of FFI::Pointer, @result
|
11
|
-
end
|
12
|
-
|
13
|
-
should "hold a pointer to the correct input value" do
|
14
|
-
assert_equal 24, @result.read_int
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
context "The utf8_array_to_inoutptr method" do
|
19
|
-
context "when called with an array of strings" do
|
20
|
-
setup do
|
21
|
-
@result = GirFFI::ArgHelper.utf8_array_to_inoutptr ["foo", "bar", "baz"]
|
22
|
-
end
|
23
|
-
|
24
|
-
should "return an FFI::Pointer" do
|
25
|
-
assert_instance_of FFI::Pointer, @result
|
26
|
-
end
|
27
|
-
|
28
|
-
should "return a pointer to an array of pointers to strings" do
|
29
|
-
ptr = @result.read_pointer
|
30
|
-
ary = ptr.read_array_of_pointer(3)
|
31
|
-
assert_equal ["foo", "bar", "baz"], ary.map {|p| p.read_string}
|
32
|
-
end
|
33
|
-
end
|
34
|
-
context "when called with nil" do
|
35
|
-
should "return nil" do
|
36
|
-
assert_nil GirFFI::ArgHelper.utf8_array_to_inoutptr nil
|
37
|
-
end
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
context "The outptr_to_gint32 method" do
|
42
|
-
setup do
|
43
|
-
@ptr = GirFFI::AllocationHelper.safe_malloc FFI.type_size(:int)
|
44
|
-
@ptr.write_int 342
|
45
|
-
end
|
46
|
-
|
47
|
-
should "retrieve the correct integer value" do
|
48
|
-
assert_equal 342, GirFFI::ArgHelper.outptr_to_gint32(@ptr)
|
49
|
-
end
|
50
|
-
end
|
51
|
-
|
52
4
|
context "The outptr_to_utf8_array method" do
|
53
5
|
context "when called with a valid pointer to a string array" do
|
54
6
|
setup do
|
@@ -88,7 +40,8 @@ class ArgHelperTest < MiniTest::Spec
|
|
88
40
|
|
89
41
|
context "when called with a pointer to null" do
|
90
42
|
should "return nil" do
|
91
|
-
ptr = GirFFI::
|
43
|
+
ptr = GirFFI::InOutPointer.for :pointer
|
44
|
+
assert ptr.read_pointer.null?
|
92
45
|
assert_nil GirFFI::ArgHelper.outptr_to_utf8_array(ptr, 0)
|
93
46
|
end
|
94
47
|
end
|
@@ -110,14 +63,6 @@ class ArgHelperTest < MiniTest::Spec
|
|
110
63
|
end
|
111
64
|
end
|
112
65
|
|
113
|
-
context "The pointer_outptr method" do
|
114
|
-
should "return a pointer to a null pointer" do
|
115
|
-
ptr = GirFFI::ArgHelper.pointer_outptr
|
116
|
-
pptr = ptr.read_pointer
|
117
|
-
assert pptr.null?
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
66
|
context "The object_pointer_to_object method" do
|
122
67
|
setup do
|
123
68
|
GirFFI.setup :Regress
|
@@ -134,19 +79,4 @@ class ArgHelperTest < MiniTest::Spec
|
|
134
79
|
end
|
135
80
|
end
|
136
81
|
|
137
|
-
context "The map_single_callback_arg method" do
|
138
|
-
should "correctly map a :struct type" do
|
139
|
-
GirFFI.setup :GObject
|
140
|
-
|
141
|
-
cl = GObject::Closure.new_simple GObject::Closure::Struct.size, nil
|
142
|
-
|
143
|
-
cinfo = GirFFI::IRepository.default.find_by_name 'GObject', 'ClosureMarshal'
|
144
|
-
ainfo = cinfo.args[0]
|
145
|
-
|
146
|
-
r = GirFFI::ArgHelper.map_single_callback_arg cl.to_ptr, ainfo
|
147
|
-
|
148
|
-
assert_instance_of GObject::Closure, r
|
149
|
-
assert_equal r.to_ptr, cl.to_ptr
|
150
|
-
end
|
151
|
-
end
|
152
82
|
end
|