gir_ffi 0.1.0 → 0.2.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 +14 -0
- data/TODO.rdoc +10 -5
- data/lib/ffi-glib.rb +7 -73
- data/lib/ffi-glib/array.rb +29 -4
- data/lib/ffi-glib/byte_array.rb +15 -1
- data/lib/ffi-glib/hash_table.rb +31 -24
- data/lib/ffi-glib/list.rb +28 -0
- data/lib/ffi-glib/list_methods.rb +10 -2
- data/lib/ffi-glib/ptr_array.rb +39 -0
- data/lib/ffi-glib/s_list.rb +29 -0
- data/lib/ffi-gobject.rb +49 -22
- data/lib/ffi-gobject/closure.rb +4 -3
- data/lib/ffi-gobject/helper.rb +20 -43
- data/lib/ffi-gobject/initially_unowned.rb +2 -0
- data/lib/ffi-gobject/object.rb +54 -0
- data/lib/ffi-gobject/ruby_closure.rb +22 -16
- data/lib/ffi-gobject/value.rb +54 -19
- data/lib/ffi-gobject_introspection/i_constant_info.rb +17 -1
- data/lib/ffi-gobject_introspection/i_field_info.rb +8 -0
- data/lib/ffi-gobject_introspection/i_property_info.rb +3 -1
- data/lib/ffi-gobject_introspection/lib.rb +19 -2
- data/lib/gir_ffi/arg_helper.rb +7 -45
- data/lib/gir_ffi/builder.rb +1 -1
- data/lib/gir_ffi/builder/argument.rb +148 -107
- data/lib/gir_ffi/builder/argument/base.rb +5 -5
- data/lib/gir_ffi/builder/argument/in_base.rb +2 -2
- data/lib/gir_ffi/builder/argument/in_out_base.rb +2 -3
- data/lib/gir_ffi/builder/argument/out_base.rb +2 -3
- data/lib/gir_ffi/builder/function.rb +11 -17
- data/lib/gir_ffi/builder/module.rb +26 -0
- data/lib/gir_ffi/builder/type.rb +5 -0
- data/lib/gir_ffi/builder/type/base.rb +2 -0
- data/lib/gir_ffi/builder/type/callback.rb +18 -3
- data/lib/gir_ffi/builder/type/constant.rb +4 -12
- data/lib/gir_ffi/builder/type/enum.rb +15 -6
- data/lib/gir_ffi/builder/type/interface.rb +4 -0
- data/lib/gir_ffi/builder/type/object.rb +11 -0
- data/lib/gir_ffi/builder/type/struct_based.rb +14 -4
- data/lib/gir_ffi/builder/type/union.rb +13 -7
- data/lib/gir_ffi/builder/type/with_layout.rb +59 -8
- data/lib/gir_ffi/class_base.rb +8 -1
- data/lib/gir_ffi/in_out_pointer.rb +17 -18
- data/lib/gir_ffi/in_pointer.rb +8 -1
- data/lib/gir_ffi/type_map.rb +12 -0
- data/lib/gir_ffi/variable_name_generator.rb +12 -0
- data/lib/gir_ffi/version.rb +1 -1
- data/test/ffi-glib/array_test.rb +54 -0
- data/test/ffi-glib/byte_array_test.rb +21 -0
- data/test/ffi-glib/glib_overrides_test.rb +1 -46
- data/test/ffi-glib/hash_table_test.rb +24 -0
- data/test/ffi-glib/list_test.rb +46 -0
- data/test/ffi-glib/ptr_array_test.rb +51 -0
- data/test/ffi-glib/s_list_test.rb +46 -0
- data/test/ffi-gobject/g_object_overrides_test.rb +8 -8
- data/test/ffi-gobject/gobject_test.rb +26 -0
- data/test/ffi-gobject/object_test.rb +12 -0
- data/test/ffi-gobject_introspection/i_constant_info_test.rb +5 -1
- data/test/ffi-gobject_introspection/lib_test.rb +56 -0
- data/test/integration/generated_gimarshallingtests_test.rb +118 -76
- data/test/integration/generated_regress_test.rb +220 -62
- data/test/integration/pretty_print_test.rb +11 -0
- data/test/type_builder_test.rb +0 -48
- data/test/unintrospectable_type_builder_test.rb +8 -2
- data/test/unit/builder_test.rb +1 -1
- data/test/unit/callback_builder_test.rb +19 -0
- data/test/unit/constant_builder_test.rb +11 -0
- data/test/unit/enum_builder_test.rb +25 -0
- data/test/unit/function_builder_test.rb +17 -0
- data/test/unit/in_out_pointer_test.rb +11 -0
- data/test/unit/in_pointer_test.rb +6 -2
- data/test/unit/interface_builder_test.rb +17 -0
- data/test/unit/module_builder_test.rb +95 -0
- data/test/unit/object_type_builder_test.rb +24 -0
- data/test/unit/struct_builder_test.rb +106 -0
- data/test/unit/union_builder_test.rb +17 -0
- data/test/unit/variable_name_generator_test.rb +16 -0
- metadata +102 -75
- data/test/module_builder_test.rb +0 -53
data/lib/gir_ffi/class_base.rb
CHANGED
@@ -5,7 +5,7 @@ module GirFFI
|
|
5
5
|
class ClassBase
|
6
6
|
# TODO: Make separate base for :struct, :union, :object.
|
7
7
|
extend Forwardable
|
8
|
-
def_delegators :@struct, :
|
8
|
+
def_delegators :@struct, :to_ptr
|
9
9
|
|
10
10
|
def initialize(*args)
|
11
11
|
@struct = ffi_structure.new(*args)
|
@@ -50,6 +50,10 @@ module GirFFI
|
|
50
50
|
_builder.find_signal name
|
51
51
|
end
|
52
52
|
|
53
|
+
def _find_property name
|
54
|
+
_builder.find_property name
|
55
|
+
end
|
56
|
+
|
53
57
|
def _setup_method name
|
54
58
|
_builder.setup_method name
|
55
59
|
end
|
@@ -63,6 +67,9 @@ module GirFFI
|
|
63
67
|
|
64
68
|
def wrap ptr
|
65
69
|
return nil if ptr.nil? or ptr.null?
|
70
|
+
unless ptr.is_a? FFI::Pointer
|
71
|
+
ptr = ptr.to_ptr
|
72
|
+
end
|
66
73
|
_real_new ptr
|
67
74
|
end
|
68
75
|
|
@@ -2,17 +2,28 @@ module GirFFI
|
|
2
2
|
# The InOutPointer class handles conversion between ruby types and
|
3
3
|
# pointers for arguments with direction :inout and :out.
|
4
4
|
class InOutPointer < FFI::Pointer
|
5
|
-
def initialize ptr, type, ffi_type
|
5
|
+
def initialize ptr, type, ffi_type, sub_type=nil
|
6
6
|
super ptr
|
7
7
|
@ffi_type = ffi_type
|
8
8
|
@value_type = type
|
9
|
+
@sub_type = sub_type
|
9
10
|
end
|
10
11
|
|
12
|
+
private :initialize
|
13
|
+
|
11
14
|
def to_value
|
12
15
|
value = self.send "get_#{@ffi_type}", 0
|
13
16
|
adjust_value_out value
|
14
17
|
end
|
15
18
|
|
19
|
+
def to_sized_array_value size
|
20
|
+
# FIXME: Simulated Polymorphism.
|
21
|
+
raise "Not allowed" if @value_type != :pointer or @sub_type.nil?
|
22
|
+
block = self.read_pointer
|
23
|
+
return nil if block.null?
|
24
|
+
ArgHelper.ptr_to_typed_array @sub_type, block, size
|
25
|
+
end
|
26
|
+
|
16
27
|
private
|
17
28
|
|
18
29
|
def adjust_value_out value
|
@@ -27,39 +38,27 @@ module GirFFI
|
|
27
38
|
end
|
28
39
|
|
29
40
|
def self.for type
|
30
|
-
ffi_type =
|
41
|
+
ffi_type = TypeMap.map_basic_type_or_string type
|
31
42
|
ptr = AllocationHelper.safe_malloc(FFI.type_size ffi_type)
|
32
43
|
ptr.send "put_#{ffi_type}", 0, nil_value_for(type)
|
33
44
|
self.new ptr, type, ffi_type
|
34
45
|
end
|
35
46
|
|
36
|
-
def self.from type, value
|
47
|
+
def self.from type, value, sub_type=nil
|
37
48
|
value = adjust_value_in type, value
|
38
|
-
ffi_type =
|
49
|
+
ffi_type = TypeMap.map_basic_type_or_string type
|
39
50
|
ptr = AllocationHelper.safe_malloc(FFI.type_size ffi_type)
|
40
51
|
ptr.send "put_#{ffi_type}", 0, value
|
41
|
-
self.new ptr, type, ffi_type
|
52
|
+
self.new ptr, type, ffi_type, sub_type
|
42
53
|
end
|
43
54
|
|
44
55
|
def self.from_array type, array
|
45
56
|
return nil if array.nil?
|
46
57
|
ptr = InPointer.from_array(type, array)
|
47
|
-
self.from :pointer, ptr
|
58
|
+
self.from :pointer, ptr, type
|
48
59
|
end
|
49
60
|
|
50
61
|
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
|
-
TypeMap.map_basic_type type
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
62
|
def adjust_value_in type, value
|
64
63
|
case type
|
65
64
|
when :gboolean
|
data/lib/gir_ffi/in_pointer.rb
CHANGED
data/lib/gir_ffi/type_map.rb
CHANGED
@@ -25,5 +25,17 @@ module GirFFI
|
|
25
25
|
def self.map_basic_type type
|
26
26
|
TAG_TYPE_MAP[type] || type
|
27
27
|
end
|
28
|
+
|
29
|
+
# FIXME: Make name more descriptive.
|
30
|
+
def self.map_basic_type_or_string type
|
31
|
+
case type
|
32
|
+
when :gboolean
|
33
|
+
:int32
|
34
|
+
when :utf8
|
35
|
+
:pointer
|
36
|
+
else
|
37
|
+
map_basic_type(type)
|
38
|
+
end
|
39
|
+
end
|
28
40
|
end
|
29
41
|
end
|
data/lib/gir_ffi/version.rb
CHANGED
@@ -0,0 +1,54 @@
|
|
1
|
+
require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe GLib::Array do
|
4
|
+
it "knows its element type" do
|
5
|
+
arr = GLib::Array.new :gint32
|
6
|
+
assert_equal :gint32, arr.element_type
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "#append_vals" do
|
10
|
+
before do
|
11
|
+
@arr = GLib::Array.new :gint32
|
12
|
+
@result = @arr.append_vals [1, 2, 3]
|
13
|
+
end
|
14
|
+
|
15
|
+
it "appends values" do
|
16
|
+
assert_equal 3, @arr.len
|
17
|
+
end
|
18
|
+
|
19
|
+
it "returns self" do
|
20
|
+
assert_equal @result, @arr
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe "#each" do
|
25
|
+
before do
|
26
|
+
@arr = GLib::Array.new(:gint32).append_vals [1, 2, 3]
|
27
|
+
end
|
28
|
+
|
29
|
+
it "iterates over the values" do
|
30
|
+
a = []
|
31
|
+
@arr.each {|v| a << v }
|
32
|
+
|
33
|
+
assert_equal [1, 2, 3], a
|
34
|
+
end
|
35
|
+
|
36
|
+
it "returns an enumerator if no block is given" do
|
37
|
+
en = @arr.each
|
38
|
+
assert_equal 1, en.next
|
39
|
+
assert_equal 2, en.next
|
40
|
+
assert_equal 3, en.next
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
it "includes Enumerable" do
|
45
|
+
GLib::Array.must_include Enumerable
|
46
|
+
end
|
47
|
+
|
48
|
+
it "has a working #to_a method" do
|
49
|
+
arr = GLib::Array.new :gint32
|
50
|
+
arr.append_vals [1, 2, 3]
|
51
|
+
assert_equal [1, 2, 3], arr.to_a
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe GLib::ByteArray do
|
4
|
+
it "can succesfully be created with Glib::ByteArray.new" do
|
5
|
+
ba = GLib::ByteArray.new
|
6
|
+
assert_instance_of GLib::ByteArray, ba
|
7
|
+
end
|
8
|
+
|
9
|
+
it "allows strings to be appended to it" do
|
10
|
+
ba = GLib::ByteArray.new
|
11
|
+
ba.append "abdc"
|
12
|
+
pass
|
13
|
+
end
|
14
|
+
|
15
|
+
it "has a working #to_string method" do
|
16
|
+
ba = GLib::ByteArray.new
|
17
|
+
ba = ba.append "abdc"
|
18
|
+
assert_equal "abdc", ba.to_string
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
@@ -27,57 +27,12 @@ describe "With the GLib overrides" do
|
|
27
27
|
end
|
28
28
|
|
29
29
|
describe "HashTable" do
|
30
|
-
it "can be created (for now) with Glib.hash_table_new" do
|
31
|
-
h = GLib.hash_table_new :utf8, :utf8
|
32
|
-
h.to_hash.must_be :==, {}
|
33
|
-
end
|
34
|
-
|
35
30
|
it "allows key-value pairs to be inserted" do
|
36
|
-
h = GLib.
|
31
|
+
h = GLib::HashTable.new :utf8, :utf8
|
37
32
|
h.insert "foo", "bar"
|
38
33
|
h.to_hash.must_be :==, {"foo" => "bar"}
|
39
34
|
end
|
40
35
|
end
|
41
|
-
|
42
|
-
describe "ByteArray" do
|
43
|
-
it "can be created (for now) with Glib.byte_array_new" do
|
44
|
-
ba = GLib.byte_array_new
|
45
|
-
assert_instance_of GLib::ByteArray, ba
|
46
|
-
end
|
47
|
-
|
48
|
-
it "allows strings to be appended to it" do
|
49
|
-
ba = GLib.byte_array_new
|
50
|
-
GLib::byte_array_append ba, "abdc"
|
51
|
-
pass
|
52
|
-
end
|
53
|
-
|
54
|
-
it "has a working #to_s method" do
|
55
|
-
ba = GLib.byte_array_new
|
56
|
-
ba = GLib::byte_array_append ba, "abdc"
|
57
|
-
assert_equal "abdc", ba.to_string
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
describe "Array" do
|
62
|
-
it "can be created (for now) with Glib.array_new" do
|
63
|
-
arr = GLib.array_new :int32
|
64
|
-
assert_instance_of GLib::Array, arr
|
65
|
-
assert_equal :int32, arr.element_type
|
66
|
-
end
|
67
|
-
|
68
|
-
it "allows values to be appended to it" do
|
69
|
-
ba = GLib.array_new :int32
|
70
|
-
GLib.array_append_vals ba, [1, 2, 3]
|
71
|
-
assert_equal 3, ba[:len]
|
72
|
-
end
|
73
|
-
|
74
|
-
# TODO: Make GLib::Array a full Enumerable"
|
75
|
-
it "has a working #to_a method" do
|
76
|
-
ba = GLib.array_new :int32
|
77
|
-
GLib.array_append_vals ba, [1, 2, 3]
|
78
|
-
assert_equal [1, 2, 3], ba.to_a
|
79
|
-
end
|
80
|
-
end
|
81
36
|
end
|
82
37
|
|
83
38
|
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe GLib::HashTable do
|
4
|
+
it "knows its key and value types" do
|
5
|
+
hsh = GLib::HashTable.new :gint32, :utf8
|
6
|
+
assert_equal :gint32, hsh.key_type
|
7
|
+
assert_equal :utf8, hsh.value_type
|
8
|
+
end
|
9
|
+
|
10
|
+
describe "::from_hash" do
|
11
|
+
it "creates a GHashTable from a Ruby array" do
|
12
|
+
hsh = GLib::HashTable.from_hash :utf8, :gint32,
|
13
|
+
{"foo" => 23, "bar" => 32}
|
14
|
+
assert_equal({"foo" => 23, "bar" => 32}, hsh.to_hash)
|
15
|
+
end
|
16
|
+
|
17
|
+
it "return its argument if given a GHashTable" do
|
18
|
+
hsh = GLib::HashTable.from_hash :utf8, :gint32, {"foo" => 23, "bar" => 32}
|
19
|
+
hsh2 = GLib::HashTable.from_hash :utf8, :gint32, hsh
|
20
|
+
assert_equal hsh, hsh2
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe GLib::List do
|
4
|
+
it "knows its element type" do
|
5
|
+
arr = GLib::List.new :gint32
|
6
|
+
assert_equal :gint32, arr.element_type
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "#append" do
|
10
|
+
it "appends integer values" do
|
11
|
+
lst = GLib::List.new :gint32
|
12
|
+
res = lst.append 1
|
13
|
+
assert_equal 1, res.data
|
14
|
+
end
|
15
|
+
|
16
|
+
it "appends string values" do
|
17
|
+
lst = GLib::List.new :utf8
|
18
|
+
res = lst.append "bla"
|
19
|
+
assert_equal "bla", res.data
|
20
|
+
end
|
21
|
+
|
22
|
+
it "appends multiple values into a single list" do
|
23
|
+
lst = GLib::List.new :gint32
|
24
|
+
|
25
|
+
lst = lst.append 1
|
26
|
+
lst = lst.append 2
|
27
|
+
|
28
|
+
assert_equal 1, lst.data
|
29
|
+
nxt = lst.next
|
30
|
+
assert_equal 2, nxt.data
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "::from_array" do
|
35
|
+
it "creates a GList from a Ruby array" do
|
36
|
+
lst = GLib::List.from_array :gint32, [3, 2, 1]
|
37
|
+
assert_equal [3, 2, 1], lst.to_a
|
38
|
+
end
|
39
|
+
|
40
|
+
it "return its argument if given a GList" do
|
41
|
+
lst = GLib::List.from_array :gint32, [3, 2, 1]
|
42
|
+
lst2 = GLib::List.from_array :gint32, lst
|
43
|
+
assert_equal lst, lst2
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe GLib::PtrArray do
|
4
|
+
it "knows its element type" do
|
5
|
+
arr = GLib::PtrArray.new :utf8
|
6
|
+
assert_equal :utf8, arr.element_type
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "::add" do
|
10
|
+
it "correctly takes the type into account" do
|
11
|
+
arr = GLib::PtrArray.new :utf8
|
12
|
+
str = "test"
|
13
|
+
GLib::PtrArray.add arr, str
|
14
|
+
|
15
|
+
assert_equal str, arr.pdata.read_pointer.read_string
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
it "has a working #each method" do
|
20
|
+
arr = GLib::PtrArray.new :utf8
|
21
|
+
|
22
|
+
GLib::PtrArray.add arr, "test1"
|
23
|
+
GLib::PtrArray.add arr, "test2"
|
24
|
+
GLib::PtrArray.add arr, "test3"
|
25
|
+
|
26
|
+
a = []
|
27
|
+
arr.each {|v| a << v}
|
28
|
+
|
29
|
+
assert_equal ["test1", "test2", "test3"], a
|
30
|
+
end
|
31
|
+
|
32
|
+
it "includes Enumerable" do
|
33
|
+
GLib::PtrArray.must_include Enumerable
|
34
|
+
end
|
35
|
+
|
36
|
+
it "has a working #to_a method" do
|
37
|
+
arr = GLib::PtrArray.new :utf8
|
38
|
+
|
39
|
+
GLib::PtrArray.add arr, "test1"
|
40
|
+
GLib::PtrArray.add arr, "test2"
|
41
|
+
GLib::PtrArray.add arr, "test3"
|
42
|
+
|
43
|
+
assert_equal ["test1", "test2", "test3"], arr.to_a
|
44
|
+
end
|
45
|
+
|
46
|
+
it "has #add as an instance method too" do
|
47
|
+
arr = GLib::PtrArray.new :utf8
|
48
|
+
arr.add "test1"
|
49
|
+
assert_equal ["test1"], arr.to_a
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require File.expand_path('../gir_ffi_test_helper.rb', File.dirname(__FILE__))
|
2
|
+
|
3
|
+
describe GLib::SList do
|
4
|
+
it "knows its element type" do
|
5
|
+
arr = GLib::SList.new :gint32
|
6
|
+
assert_equal :gint32, arr.element_type
|
7
|
+
end
|
8
|
+
|
9
|
+
describe "#prepend" do
|
10
|
+
it "prepends integer values" do
|
11
|
+
lst = GLib::SList.new :gint32
|
12
|
+
res = lst.prepend 1
|
13
|
+
assert_equal 1, res.data
|
14
|
+
end
|
15
|
+
|
16
|
+
it "prepends string values" do
|
17
|
+
lst = GLib::SList.new :utf8
|
18
|
+
res = lst.prepend "bla"
|
19
|
+
assert_equal "bla", res.data
|
20
|
+
end
|
21
|
+
|
22
|
+
it "prepends multiple values into a single list" do
|
23
|
+
lst = GLib::SList.new :gint32
|
24
|
+
|
25
|
+
res = lst.prepend 1
|
26
|
+
res2 = res.prepend 2
|
27
|
+
|
28
|
+
assert_equal 2, res2.data
|
29
|
+
assert_equal 1, res.data
|
30
|
+
assert_equal res.to_ptr, res2.next.to_ptr
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "::from_array" do
|
35
|
+
it "creates a GSList from a Ruby array" do
|
36
|
+
lst = GLib::SList.from_array :gint32, [3, 2, 1]
|
37
|
+
assert_equal [3, 2, 1], lst.to_a
|
38
|
+
end
|
39
|
+
|
40
|
+
it "return its argument if given a GSList" do
|
41
|
+
lst = GLib::SList.from_array :gint32, [3, 2, 1]
|
42
|
+
lst2 = GLib::SList.from_array :gint32, lst
|
43
|
+
assert_equal lst, lst2
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|