gir_ffi 0.0.10 → 0.0.11
Sign up to get free protection for your applications and to get access to all the features.
- 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
|