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
@@ -80,6 +80,8 @@ module GirFFI::Builder
|
|
80
80
|
po = (@data.map(&:post) + @data.map(&:postpost) + @rvdata.post)
|
81
81
|
po.unshift @errarg.post
|
82
82
|
|
83
|
+
po += @data.map {|d| d.cleanup}
|
84
|
+
|
83
85
|
retvals = ([@rvdata.retval] + @data.map(&:retval)).compact
|
84
86
|
po << "return #{retvals.join(', ')}" unless retvals.empty?
|
85
87
|
|
@@ -18,7 +18,7 @@ module GirFFI
|
|
18
18
|
build_module
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
21
|
+
def setup_method method
|
22
22
|
go = function_introspection_data method.to_s
|
23
23
|
|
24
24
|
return false if go.nil?
|
@@ -34,7 +34,7 @@ module GirFFI
|
|
34
34
|
true
|
35
35
|
end
|
36
36
|
|
37
|
-
def
|
37
|
+
def build_namespaced_class classname
|
38
38
|
info = gir.find_by_name @namespace, classname.to_s
|
39
39
|
Builder.build_class info
|
40
40
|
end
|
@@ -7,14 +7,7 @@ module GirFFI
|
|
7
7
|
# attached to the appropriate namespace module, and will be defined
|
8
8
|
# as a callback for FFI.
|
9
9
|
class Callback < Base
|
10
|
-
def
|
11
|
-
unless defined? @klass
|
12
|
-
instantiate_callback_class
|
13
|
-
end
|
14
|
-
@klass
|
15
|
-
end
|
16
|
-
|
17
|
-
def instantiate_callback_class
|
10
|
+
def instantiate_class
|
18
11
|
@klass = optionally_define_constant namespace_module, @classname do
|
19
12
|
args = Builder.ffi_function_argument_types info
|
20
13
|
ret = Builder.ffi_function_return_type info
|
@@ -7,12 +7,7 @@ module GirFFI
|
|
7
7
|
# attached to the appropriate namespace module, and will be defined
|
8
8
|
# as an enum for FFI.
|
9
9
|
class Enum < RegisteredType
|
10
|
-
|
11
|
-
unless defined? @klass
|
12
|
-
instantiate_enum_class
|
13
|
-
end
|
14
|
-
@klass
|
15
|
-
end
|
10
|
+
private
|
16
11
|
|
17
12
|
def value_spec
|
18
13
|
return info.values.map {|vinfo|
|
@@ -21,7 +16,7 @@ module GirFFI
|
|
21
16
|
}.flatten
|
22
17
|
end
|
23
18
|
|
24
|
-
def
|
19
|
+
def instantiate_class
|
25
20
|
if const_defined_for namespace_module, @classname
|
26
21
|
@klass = namespace_module.const_get @classname
|
27
22
|
else
|
@@ -1,29 +1,27 @@
|
|
1
|
-
require 'gir_ffi/builder/type/
|
1
|
+
require 'gir_ffi/builder/type/registered_type'
|
2
|
+
require 'gir_ffi/builder/type/with_methods'
|
3
|
+
require 'gir_ffi/interface_base'
|
4
|
+
|
2
5
|
module GirFFI
|
3
6
|
module Builder
|
4
7
|
module Type
|
5
8
|
|
6
|
-
# Implements the creation of a
|
9
|
+
# Implements the creation of a module representing an Interface.
|
7
10
|
class Interface < RegisteredType
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
end
|
12
|
-
@klass
|
13
|
-
end
|
11
|
+
include WithMethods
|
12
|
+
|
13
|
+
private
|
14
14
|
|
15
|
-
|
15
|
+
# FIXME: The word 'class' is not really correct.
|
16
|
+
def instantiate_class
|
16
17
|
@klass = optionally_define_constant(namespace_module, @classname) do
|
17
|
-
::Module.new
|
18
|
-
def self.gir_ffi_builder
|
19
|
-
const_get :GIR_FFI_BUILDER
|
20
|
-
end
|
21
|
-
end
|
18
|
+
::Module.new
|
22
19
|
end
|
23
20
|
setup_module unless already_set_up
|
24
21
|
end
|
25
22
|
|
26
23
|
def setup_module
|
24
|
+
@klass.extend InterfaceBase
|
27
25
|
setup_constants
|
28
26
|
stub_methods
|
29
27
|
end
|
@@ -10,7 +10,7 @@ module GirFFI
|
|
10
10
|
return true
|
11
11
|
else
|
12
12
|
if parent
|
13
|
-
return superclass.
|
13
|
+
return superclass._setup_method method
|
14
14
|
else
|
15
15
|
return false
|
16
16
|
end
|
@@ -21,22 +21,36 @@ module GirFFI
|
|
21
21
|
if super
|
22
22
|
return true
|
23
23
|
else
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
return
|
32
|
-
else
|
33
|
-
return false
|
24
|
+
setup_instance_method_in_ancestor method
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def find_signal signal_name
|
29
|
+
signal_definers.each do |inf|
|
30
|
+
inf.signals.each do |sig|
|
31
|
+
return sig if sig.name == signal_name
|
34
32
|
end
|
35
33
|
end
|
34
|
+
if parent
|
35
|
+
return superclass._find_signal signal_name
|
36
|
+
end
|
36
37
|
end
|
37
38
|
|
38
39
|
private
|
39
40
|
|
41
|
+
def setup_instance_method_in_ancestor method
|
42
|
+
interfaces.each do |iface|
|
43
|
+
if iface._setup_instance_method method
|
44
|
+
return true
|
45
|
+
end
|
46
|
+
end
|
47
|
+
if parent
|
48
|
+
return superclass._setup_instance_method method
|
49
|
+
else
|
50
|
+
return false
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
40
54
|
def setup_class
|
41
55
|
super
|
42
56
|
setup_vfunc_invokers
|
@@ -70,8 +84,7 @@ module GirFFI
|
|
70
84
|
end
|
71
85
|
|
72
86
|
def setup_interfaces
|
73
|
-
|
74
|
-
iface = GirFFI::Builder.build_class ifinfo
|
87
|
+
interfaces.each do |iface|
|
75
88
|
@klass.class_eval do
|
76
89
|
include iface
|
77
90
|
end
|
@@ -81,6 +94,12 @@ module GirFFI
|
|
81
94
|
def signal_definers
|
82
95
|
[info] + info.interfaces
|
83
96
|
end
|
97
|
+
|
98
|
+
def interfaces
|
99
|
+
info.interfaces.map do |ifinfo|
|
100
|
+
GirFFI::Builder.build_class ifinfo
|
101
|
+
end
|
102
|
+
end
|
84
103
|
end
|
85
104
|
end
|
86
105
|
end
|
@@ -9,72 +9,8 @@ module GirFFI
|
|
9
9
|
# of IRegisteredTypeInfo. These are types whose C representation is
|
10
10
|
# complex, i.e., a struct or a union.
|
11
11
|
class RegisteredType < Base
|
12
|
-
def setup_method method
|
13
|
-
klass = build_class
|
14
|
-
meta = (class << klass; self; end)
|
15
|
-
|
16
|
-
go = method_introspection_data method
|
17
|
-
attach_and_define_method method, go, meta
|
18
|
-
end
|
19
|
-
|
20
|
-
def setup_instance_method method
|
21
|
-
go = instance_method_introspection_data method
|
22
|
-
attach_and_define_method method, go, build_class
|
23
|
-
end
|
24
|
-
|
25
12
|
private
|
26
13
|
|
27
|
-
def method_introspection_data method
|
28
|
-
info.find_method method
|
29
|
-
end
|
30
|
-
|
31
|
-
def instance_method_introspection_data method
|
32
|
-
data = method_introspection_data method
|
33
|
-
return !data.nil? && data.method? ? data : nil
|
34
|
-
end
|
35
|
-
|
36
|
-
def function_definition go
|
37
|
-
Builder::Function.new(go, lib).generate
|
38
|
-
end
|
39
|
-
|
40
|
-
def attach_and_define_method method, go, modul
|
41
|
-
return false if go.nil?
|
42
|
-
Builder.attach_ffi_function lib, go
|
43
|
-
modul.class_eval { remove_method method }
|
44
|
-
modul.class_eval function_definition(go)
|
45
|
-
true
|
46
|
-
end
|
47
|
-
|
48
|
-
def setup_class
|
49
|
-
setup_layout
|
50
|
-
setup_constants
|
51
|
-
stub_methods
|
52
|
-
setup_gtype_getter
|
53
|
-
end
|
54
|
-
|
55
|
-
def setup_layout
|
56
|
-
spec = layout_specification
|
57
|
-
@structklass.class_eval { layout(*spec) }
|
58
|
-
end
|
59
|
-
|
60
|
-
def layout_specification
|
61
|
-
fields = info.fields
|
62
|
-
|
63
|
-
if fields.empty?
|
64
|
-
if parent
|
65
|
-
return [:parent, superclass.const_get(:Struct), 0]
|
66
|
-
else
|
67
|
-
return [:dummy, :char, 0]
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
fields.map do |finfo|
|
72
|
-
[ finfo.name.to_sym,
|
73
|
-
itypeinfo_to_ffitype_for_struct(finfo.field_type),
|
74
|
-
finfo.offset ]
|
75
|
-
end.flatten
|
76
|
-
end
|
77
|
-
|
78
14
|
# FIXME: Move this into a class with the other type knowledge.
|
79
15
|
def itypeinfo_to_ffitype_for_struct typeinfo
|
80
16
|
ffitype = Builder.itypeinfo_to_ffitype typeinfo
|
@@ -96,21 +32,8 @@ module GirFFI
|
|
96
32
|
const_defined_for @klass, :GIR_FFI_BUILDER
|
97
33
|
end
|
98
34
|
|
99
|
-
def stub_methods
|
100
|
-
info.get_methods.each do |minfo|
|
101
|
-
@klass.class_eval method_stub(minfo.name, minfo.method?)
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
def method_stub symbol, is_instance_method
|
106
|
-
"
|
107
|
-
def #{is_instance_method ? '' : 'self.'}#{symbol} *args, &block
|
108
|
-
setup_and_call :#{symbol}, *args, &block
|
109
|
-
end
|
110
|
-
"
|
111
|
-
end
|
112
|
-
|
113
35
|
# TODO: Rename the created method, or use a constant.
|
36
|
+
# FIXME: Only used in some of the subclases. Make mixin?
|
114
37
|
def setup_gtype_getter
|
115
38
|
gtype = info.g_type
|
116
39
|
return if gtype.nil?
|
@@ -1,39 +1,24 @@
|
|
1
1
|
require 'gir_ffi/builder/type/registered_type'
|
2
|
+
require 'gir_ffi/builder/type/with_layout'
|
3
|
+
require 'gir_ffi/builder/type/with_methods'
|
4
|
+
|
2
5
|
module GirFFI
|
3
6
|
module Builder
|
4
7
|
module Type
|
5
8
|
|
6
9
|
# Implements the creation of a class representing one of the types
|
7
|
-
# whose C representation is a struct, i.e., :object
|
8
|
-
# :interface.
|
10
|
+
# whose C representation is a struct, i.e., :object and :struct.
|
9
11
|
class StructBased < RegisteredType
|
10
|
-
|
11
|
-
|
12
|
-
instantiate_struct_class
|
13
|
-
end
|
14
|
-
@klass
|
15
|
-
end
|
12
|
+
include WithMethods
|
13
|
+
include WithLayout
|
16
14
|
|
17
|
-
|
15
|
+
private
|
16
|
+
|
17
|
+
def instantiate_class
|
18
18
|
@klass = get_or_define_class namespace_module, @classname, superclass
|
19
19
|
@structklass = get_or_define_class @klass, :Struct, FFI::Struct
|
20
20
|
setup_class unless already_set_up
|
21
21
|
end
|
22
|
-
|
23
|
-
def find_signal signal_name
|
24
|
-
signal_definers.each do |inf|
|
25
|
-
inf.signals.each do |sig|
|
26
|
-
return sig if sig.name == signal_name
|
27
|
-
end
|
28
|
-
end
|
29
|
-
if parent
|
30
|
-
return superclass.gir_ffi_builder.find_signal signal_name
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def signal_definers
|
35
|
-
[info]
|
36
|
-
end
|
37
22
|
end
|
38
23
|
end
|
39
24
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'gir_ffi/builder/type/object'
|
2
|
+
module GirFFI
|
3
|
+
module Builder
|
4
|
+
module Type
|
5
|
+
|
6
|
+
# Implements the creation of a class representing an object type for
|
7
|
+
# which no data is found in the GIR. Typically, these are created to
|
8
|
+
# cast objects returned by a function that returns an interface.
|
9
|
+
class Unintrospectable < Object
|
10
|
+
CACHE = {}
|
11
|
+
|
12
|
+
# FIXME: Breaks parent interface.
|
13
|
+
def initialize gtype
|
14
|
+
@gtype = gtype
|
15
|
+
@info = nil
|
16
|
+
end
|
17
|
+
|
18
|
+
def instantiate_class
|
19
|
+
CACHE[@gtype] ||= Class.new(superclass)
|
20
|
+
@klass = CACHE[@gtype]
|
21
|
+
setup_class unless already_set_up
|
22
|
+
end
|
23
|
+
|
24
|
+
def setup_class
|
25
|
+
setup_constants
|
26
|
+
setup_interfaces
|
27
|
+
end
|
28
|
+
|
29
|
+
def setup_instance_method method
|
30
|
+
setup_instance_method_in_ancestor method
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def parent
|
36
|
+
parent_type = ::GObject.type_parent @gtype
|
37
|
+
gir.find_by_gtype(parent_type)
|
38
|
+
end
|
39
|
+
|
40
|
+
def interface_infos
|
41
|
+
::GObject.type_interfaces(@gtype).map do |gtype|
|
42
|
+
gir.find_by_gtype gtype
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def interfaces
|
47
|
+
interface_infos.map do |info|
|
48
|
+
GirFFI::Builder.build_class info
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
def signal_definers
|
53
|
+
interface_infos
|
54
|
+
end
|
55
|
+
|
56
|
+
def gir
|
57
|
+
@gir ||= GirFFI::IRepository.default
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
@@ -1,4 +1,7 @@
|
|
1
1
|
require 'gir_ffi/builder/type/registered_type'
|
2
|
+
require 'gir_ffi/builder/type/with_layout'
|
3
|
+
require 'gir_ffi/builder/type/with_methods'
|
4
|
+
|
2
5
|
module GirFFI
|
3
6
|
module Builder
|
4
7
|
module Type
|
@@ -6,14 +9,12 @@ module GirFFI
|
|
6
9
|
# Implements the creation of a class representing union type. The
|
7
10
|
# class will have a nested FFI::Union class to represent its C union.
|
8
11
|
class Union < RegisteredType
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
@klass
|
14
|
-
end
|
12
|
+
include WithMethods
|
13
|
+
include WithLayout
|
14
|
+
|
15
|
+
private
|
15
16
|
|
16
|
-
def
|
17
|
+
def instantiate_class
|
17
18
|
@klass = get_or_define_class namespace_module, @classname, superclass
|
18
19
|
@structklass = get_or_define_class @klass, :Struct, FFI::Union
|
19
20
|
setup_class unless already_set_up
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module GirFFI
|
2
|
+
module Builder
|
3
|
+
module Type
|
4
|
+
|
5
|
+
# Implements the creation of classes representing types with layout,
|
6
|
+
# i.e., :union, :struct, :object.
|
7
|
+
module WithLayout
|
8
|
+
private
|
9
|
+
|
10
|
+
# TODO: Move to client classes.
|
11
|
+
def setup_class
|
12
|
+
setup_layout
|
13
|
+
setup_constants
|
14
|
+
stub_methods
|
15
|
+
setup_gtype_getter
|
16
|
+
end
|
17
|
+
|
18
|
+
def setup_layout
|
19
|
+
spec = layout_specification
|
20
|
+
@structklass.class_eval { layout(*spec) }
|
21
|
+
end
|
22
|
+
|
23
|
+
def layout_specification
|
24
|
+
fields = info.fields
|
25
|
+
|
26
|
+
if fields.empty?
|
27
|
+
if parent
|
28
|
+
return [:parent, superclass.const_get(:Struct), 0]
|
29
|
+
else
|
30
|
+
return [:dummy, :char, 0]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
fields.map do |finfo|
|
35
|
+
[ finfo.name.to_sym,
|
36
|
+
itypeinfo_to_ffitype_for_struct(finfo.field_type),
|
37
|
+
finfo.offset ]
|
38
|
+
end.flatten
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module GirFFI
|
2
|
+
module Builder
|
3
|
+
module Type
|
4
|
+
|
5
|
+
# Implements method creation for types such as, :union, :struct,
|
6
|
+
# :object, :interface.
|
7
|
+
module WithMethods
|
8
|
+
def setup_method method
|
9
|
+
klass = build_class
|
10
|
+
meta = (class << klass; self; end)
|
11
|
+
|
12
|
+
go = method_introspection_data method
|
13
|
+
attach_and_define_method method, go, meta
|
14
|
+
end
|
15
|
+
|
16
|
+
def setup_instance_method method
|
17
|
+
go = instance_method_introspection_data method
|
18
|
+
attach_and_define_method method, go, build_class
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def method_introspection_data method
|
24
|
+
info.find_method method
|
25
|
+
end
|
26
|
+
|
27
|
+
def instance_method_introspection_data method
|
28
|
+
data = method_introspection_data method
|
29
|
+
return !data.nil? && data.method? ? data : nil
|
30
|
+
end
|
31
|
+
|
32
|
+
def function_definition go
|
33
|
+
Builder::Function.new(go, lib).generate
|
34
|
+
end
|
35
|
+
|
36
|
+
def attach_and_define_method method, go, modul
|
37
|
+
return false if go.nil?
|
38
|
+
Builder.attach_ffi_function lib, go
|
39
|
+
modul.class_eval { remove_method method }
|
40
|
+
modul.class_eval function_definition(go)
|
41
|
+
true
|
42
|
+
end
|
43
|
+
|
44
|
+
def stub_methods
|
45
|
+
info.get_methods.each do |minfo|
|
46
|
+
@klass.class_eval method_stub(minfo.name, minfo.method?)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def method_stub symbol, is_instance_method
|
51
|
+
"
|
52
|
+
def #{is_instance_method ? '' : 'self.'}#{symbol} *args, &block
|
53
|
+
setup_and_call :#{symbol}, *args, &block
|
54
|
+
end
|
55
|
+
"
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
data/lib/gir_ffi/builder.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'gir_ffi/builder/type'
|
2
|
+
require 'gir_ffi/builder/type/unintrospectable'
|
2
3
|
require 'gir_ffi/builder/module'
|
3
4
|
require 'gir_ffi/builder_helper'
|
4
5
|
|
@@ -9,8 +10,12 @@ module GirFFI
|
|
9
10
|
module Builder
|
10
11
|
extend BuilderHelper
|
11
12
|
|
13
|
+
sz = FFI.type_size(:size_t) * 8
|
14
|
+
gtype_type = "uint#{sz}".to_sym
|
15
|
+
|
12
16
|
TAG_TYPE_MAP = {
|
13
17
|
:GType => :size_t,
|
18
|
+
:gtype => gtype_type,
|
14
19
|
:gboolean => :bool,
|
15
20
|
:gunichar => :uint32,
|
16
21
|
:gint8 => :int8,
|
@@ -31,6 +36,15 @@ module GirFFI
|
|
31
36
|
Builder::Type.build(info)
|
32
37
|
end
|
33
38
|
|
39
|
+
def self.build_by_gtype gtype
|
40
|
+
info = IRepository.default.find_by_gtype gtype
|
41
|
+
if info.nil?
|
42
|
+
Builder::Type::Unintrospectable.new(gtype).build_class
|
43
|
+
else
|
44
|
+
build_class info
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
34
48
|
def self.build_module namespace, version=nil
|
35
49
|
Builder::Module.new(namespace, version).generate
|
36
50
|
end
|
@@ -58,12 +72,37 @@ module GirFFI
|
|
58
72
|
types
|
59
73
|
end
|
60
74
|
|
75
|
+
def self.ffi_argument_types_for_signal info
|
76
|
+
types = info.args.map do |arg|
|
77
|
+
itypeinfo_to_callback_ffitype arg.argument_type
|
78
|
+
end
|
79
|
+
types.unshift(:pointer).push(:pointer)
|
80
|
+
end
|
81
|
+
|
61
82
|
def self.ffi_function_return_type info
|
62
83
|
rt = info.return_type
|
63
84
|
return :string if rt.tag == :utf8
|
64
85
|
itypeinfo_to_ffitype rt
|
65
86
|
end
|
66
87
|
|
88
|
+
def self.itypeinfo_to_callback_ffitype info
|
89
|
+
tag = info.tag
|
90
|
+
|
91
|
+
return :string if tag == :utf8
|
92
|
+
return :pointer if info.pointer?
|
93
|
+
|
94
|
+
if tag == :interface
|
95
|
+
case info.interface.info_type
|
96
|
+
when :enum, :flags
|
97
|
+
:int32
|
98
|
+
else
|
99
|
+
:pointer
|
100
|
+
end
|
101
|
+
else
|
102
|
+
return TAG_TYPE_MAP[tag] || tag
|
103
|
+
end
|
104
|
+
end
|
105
|
+
|
67
106
|
def self.itypeinfo_to_ffitype info
|
68
107
|
return :pointer if info.pointer?
|
69
108
|
|