gir_ffi 0.7.10 → 0.8.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.
- checksums.yaml +4 -4
- data/Changelog.md +6 -0
- data/Gemfile +3 -1
- data/README.md +5 -2
- data/lib/ffi-glib.rb +1 -0
- data/lib/ffi-glib/array.rb +6 -6
- data/lib/ffi-glib/array_methods.rb +1 -1
- data/lib/ffi-glib/byte_array.rb +1 -1
- data/lib/ffi-glib/bytes.rb +3 -3
- data/lib/ffi-glib/container_class_methods.rb +2 -2
- data/lib/ffi-glib/error.rb +2 -2
- data/lib/ffi-glib/hash_table.rb +9 -9
- data/lib/ffi-glib/iconv.rb +1 -1
- data/lib/ffi-glib/list.rb +2 -2
- data/lib/ffi-glib/list_methods.rb +8 -7
- data/lib/ffi-glib/main_loop.rb +1 -1
- data/lib/ffi-glib/ptr_array.rb +7 -7
- data/lib/ffi-glib/s_list.rb +2 -2
- data/lib/ffi-glib/strv.rb +3 -3
- data/lib/ffi-glib/variant.rb +9 -2
- data/lib/ffi-gobject.rb +10 -10
- data/lib/ffi-gobject/closure.rb +1 -1
- data/lib/ffi-gobject/initially_unowned.rb +4 -3
- data/lib/ffi-gobject/object.rb +19 -19
- data/lib/ffi-gobject/object_class.rb +2 -2
- data/lib/ffi-gobject/ruby_closure.rb +5 -4
- data/lib/ffi-gobject/value.rb +15 -20
- data/lib/ffi-gobject_introspection/g_error.rb +1 -1
- data/lib/ffi-gobject_introspection/i_base_info.rb +6 -6
- data/lib/ffi-gobject_introspection/i_callable_info.rb +1 -1
- data/lib/ffi-gobject_introspection/i_enum_info.rb +2 -2
- data/lib/ffi-gobject_introspection/i_interface_info.rb +8 -8
- data/lib/ffi-gobject_introspection/i_object_info.rb +9 -9
- data/lib/ffi-gobject_introspection/i_repository.rb +13 -13
- data/lib/ffi-gobject_introspection/i_struct_info.rb +2 -2
- data/lib/ffi-gobject_introspection/i_type_info.rb +1 -1
- data/lib/ffi-gobject_introspection/i_union_info.rb +3 -3
- data/lib/ffi-gobject_introspection/lib.rb +4 -4
- data/lib/gir_ffi-base/glib/boolean.rb +4 -4
- data/lib/gir_ffi-base/glib/strv.rb +2 -2
- data/lib/gir_ffi/allocation_helper.rb +1 -1
- data/lib/gir_ffi/arg_helper.rb +8 -8
- data/lib/gir_ffi/boxed_base.rb +5 -9
- data/lib/gir_ffi/builder.rb +4 -4
- data/lib/gir_ffi/builder_helper.rb +3 -3
- data/lib/gir_ffi/builders/argument_builder_collection.rb +1 -1
- data/lib/gir_ffi/builders/base_argument_builder.rb +3 -3
- data/lib/gir_ffi/builders/base_method_builder.rb +71 -0
- data/lib/gir_ffi/builders/base_type_builder.rb +1 -1
- data/lib/gir_ffi/builders/boxed_builder.rb +3 -2
- data/lib/gir_ffi/builders/c_to_ruby_convertor.rb +1 -1
- data/lib/gir_ffi/builders/closure_convertor.rb +1 -1
- data/lib/gir_ffi/builders/closure_to_pointer_convertor.rb +1 -1
- data/lib/gir_ffi/builders/constructor_builder.rb +52 -0
- data/lib/gir_ffi/builders/enum_builder.rb +3 -3
- data/lib/gir_ffi/builders/field_builder.rb +3 -2
- data/lib/gir_ffi/builders/function_builder.rb +9 -50
- data/lib/gir_ffi/builders/initializer_builder.rb +32 -0
- data/lib/gir_ffi/builders/initializer_return_value_builder.rb +16 -0
- data/lib/gir_ffi/builders/mapping_method_builder.rb +7 -5
- data/lib/gir_ffi/builders/marshalling_method_builder.rb +5 -3
- data/lib/gir_ffi/builders/method_template.rb +1 -1
- data/lib/gir_ffi/builders/module_builder.rb +8 -7
- data/lib/gir_ffi/builders/null_convertor.rb +1 -1
- data/lib/gir_ffi/builders/null_return_value_builder.rb +21 -0
- data/lib/gir_ffi/builders/object_builder.rb +3 -3
- data/lib/gir_ffi/builders/property_builder.rb +1 -1
- data/lib/gir_ffi/builders/registered_type_builder.rb +31 -15
- data/lib/gir_ffi/builders/return_value_builder.rb +1 -14
- data/lib/gir_ffi/builders/ruby_to_c_convertor.rb +2 -2
- data/lib/gir_ffi/builders/signal_closure_builder.rb +1 -1
- data/lib/gir_ffi/builders/type_builder.rb +2 -2
- data/lib/gir_ffi/builders/unintrospectable_builder.rb +1 -1
- data/lib/gir_ffi/builders/user_defined_builder.rb +11 -11
- data/lib/gir_ffi/builders/vfunc_builder.rb +1 -1
- data/lib/gir_ffi/callback_base.rb +8 -13
- data/lib/gir_ffi/class_base.rb +41 -45
- data/lib/gir_ffi/core.rb +2 -2
- data/lib/gir_ffi/enum_base.rb +9 -14
- data/lib/gir_ffi/field_argument_info.rb +1 -1
- data/lib/gir_ffi/g_type.rb +1 -1
- data/lib/gir_ffi/glib_error.rb +1 -1
- data/lib/gir_ffi/in_out_pointer.rb +4 -4
- data/lib/gir_ffi/in_pointer.rb +12 -12
- data/lib/gir_ffi/info_ext/i_arg_info.rb +0 -10
- data/lib/gir_ffi/info_ext/i_callback_info.rb +0 -5
- data/lib/gir_ffi/info_ext/i_property_info.rb +1 -1
- data/lib/gir_ffi/info_ext/i_registered_type_info.rb +1 -6
- data/lib/gir_ffi/info_ext/i_signal_info.rb +2 -2
- data/lib/gir_ffi/info_ext/i_type_info.rb +2 -17
- data/lib/gir_ffi/info_ext/i_unresolved_info.rb +0 -5
- data/lib/gir_ffi/info_ext/i_vfunc_info.rb +2 -2
- data/lib/gir_ffi/interface_base.rb +2 -7
- data/lib/gir_ffi/method_stubber.rb +1 -1
- data/lib/gir_ffi/module_base.rb +4 -7
- data/lib/gir_ffi/object_base.rb +4 -9
- data/lib/gir_ffi/receiver_argument_info.rb +1 -1
- data/lib/gir_ffi/receiver_type_info.rb +1 -1
- data/lib/gir_ffi/registered_type_base.rb +0 -5
- data/lib/gir_ffi/return_value_info.rb +1 -1
- data/lib/gir_ffi/sized_array.rb +10 -10
- data/lib/gir_ffi/type_map.rb +3 -3
- data/lib/gir_ffi/unintrospectable_type_info.rb +3 -1
- data/lib/gir_ffi/user_data_argument_info.rb +1 -1
- data/lib/gir_ffi/user_defined_property_info.rb +1 -1
- data/lib/gir_ffi/user_defined_type_info.rb +4 -4
- data/lib/gir_ffi/version.rb +1 -1
- data/lib/gir_ffi/vfunc_implementation.rb +1 -1
- data/lib/gir_ffi/zero_terminated.rb +6 -6
- data/test/base_test_helper.rb +13 -13
- data/test/ffi-gobject/object_test.rb +22 -1
- data/test/ffi-gobject/value_test.rb +24 -24
- data/test/ffi-gobject_introspection/i_registered_type_info_test.rb +4 -4
- data/test/ffi-gobject_introspection/i_type_info_test.rb +2 -2
- data/test/ffi-gobject_test.rb +2 -2
- data/test/gir_ffi/builders/argument_builder_test.rb +60 -60
- data/test/gir_ffi/builders/callback_argument_builder_test.rb +8 -8
- data/test/gir_ffi/builders/callback_builder_test.rb +4 -4
- data/test/gir_ffi/builders/callback_return_value_builder_test.rb +8 -8
- data/test/gir_ffi/builders/constructor_builder_test.rb +34 -0
- data/test/gir_ffi/builders/function_builder_test.rb +8 -24
- data/test/gir_ffi/builders/initializer_builder_test.rb +36 -0
- data/test/gir_ffi/builders/interface_builder_test.rb +2 -2
- data/test/gir_ffi/builders/object_builder_test.rb +6 -18
- data/test/gir_ffi/builders/property_builder_test.rb +2 -2
- data/test/gir_ffi/builders/return_value_builder_test.rb +54 -79
- data/test/gir_ffi/builders/signal_closure_builder_test.rb +14 -14
- data/test/gir_ffi/builders/user_defined_builder_test.rb +8 -8
- data/test/gir_ffi/builders/vfunc_builder_test.rb +22 -22
- data/test/gir_ffi/class_base_test.rb +9 -7
- data/test/gir_ffi/in_pointer_test.rb +1 -1
- data/test/gir_ffi/info_ext/i_callable_info_test.rb +2 -2
- data/test/gir_ffi/info_ext/i_callback_info_test.rb +2 -2
- data/test/gir_ffi/info_ext/i_field_info_test.rb +2 -2
- data/test/gir_ffi/info_ext/i_function_info_test.rb +2 -2
- data/test/gir_ffi/info_ext/i_signal_info_test.rb +2 -2
- data/test/gir_ffi/info_ext/i_type_info_test.rb +18 -18
- data/test/gir_ffi/info_ext/i_unresolved_info_test.rb +2 -2
- data/test/gir_ffi/info_ext/safe_constant_name_test.rb +2 -2
- data/test/gir_ffi/info_ext/safe_function_name_test.rb +2 -2
- data/test/gir_ffi/method_stubber_test.rb +6 -6
- data/test/gir_ffi/user_defined_type_info_test.rb +3 -3
- data/test/gir_ffi_test_helper.rb +12 -12
- data/test/integration/derived_classes_test.rb +7 -3
- data/test/integration/generated_gimarshallingtests_test.rb +10 -10
- data/test/integration/generated_regress_test.rb +11 -20
- data/test/introspection_test_helper.rb +1 -1
- data/test/minitest/stats_plugin.rb +3 -3
- metadata +9 -3
- data/lib/gir_ffi/builders/constructor_result_convertor.rb +0 -14
@@ -63,15 +63,15 @@ module GObjectIntrospection
|
|
63
63
|
instance
|
64
64
|
end
|
65
65
|
|
66
|
-
def self.prepend_search_path
|
66
|
+
def self.prepend_search_path(path)
|
67
67
|
Lib.g_irepository_prepend_search_path path
|
68
68
|
end
|
69
69
|
|
70
|
-
def self.type_tag_to_string
|
70
|
+
def self.type_tag_to_string(type)
|
71
71
|
Lib.g_type_tag_to_string type
|
72
72
|
end
|
73
73
|
|
74
|
-
def require
|
74
|
+
def require(namespace, version = nil, flags = 0)
|
75
75
|
errpp = FFI::MemoryPointer.new(:pointer).write_pointer nil
|
76
76
|
|
77
77
|
Lib.g_irepository_require @gobj, namespace, version, flags, errpp
|
@@ -80,45 +80,45 @@ module GObjectIntrospection
|
|
80
80
|
raise GError.new(errp).message unless errp.null?
|
81
81
|
end
|
82
82
|
|
83
|
-
def n_infos
|
83
|
+
def n_infos(namespace)
|
84
84
|
Lib.g_irepository_get_n_infos @gobj, namespace
|
85
85
|
end
|
86
86
|
|
87
|
-
def info
|
87
|
+
def info(namespace, index)
|
88
88
|
wrap_info Lib.g_irepository_get_info(@gobj, namespace, index)
|
89
89
|
end
|
90
90
|
|
91
91
|
# Utility method
|
92
|
-
def infos
|
92
|
+
def infos(namespace)
|
93
93
|
(0..(n_infos(namespace) - 1)).map do |idx|
|
94
94
|
info namespace, idx
|
95
95
|
end
|
96
96
|
end
|
97
97
|
|
98
|
-
def find_by_name
|
98
|
+
def find_by_name(namespace, name)
|
99
99
|
wrap_info Lib.g_irepository_find_by_name(@gobj, namespace, name)
|
100
100
|
end
|
101
101
|
|
102
|
-
def find_by_gtype
|
102
|
+
def find_by_gtype(gtype)
|
103
103
|
raise ArgumentError, "Type #{gtype} is not a valid type" if gtype == 0
|
104
104
|
wrap_info Lib.g_irepository_find_by_gtype(@gobj, gtype)
|
105
105
|
end
|
106
106
|
|
107
|
-
def dependencies
|
107
|
+
def dependencies(namespace)
|
108
108
|
strv_p = Lib.g_irepository_get_dependencies(@gobj, namespace)
|
109
109
|
strv = GLib::Strv.new strv_p
|
110
110
|
strv.to_a
|
111
111
|
end
|
112
112
|
|
113
|
-
def shared_library
|
113
|
+
def shared_library(namespace)
|
114
114
|
Lib.g_irepository_get_shared_library @gobj, namespace
|
115
115
|
end
|
116
116
|
|
117
|
-
def version
|
117
|
+
def version(namespace)
|
118
118
|
Lib.g_irepository_get_version @gobj, namespace
|
119
119
|
end
|
120
120
|
|
121
|
-
def self.wrap_ibaseinfo_pointer
|
121
|
+
def self.wrap_ibaseinfo_pointer(ptr)
|
122
122
|
return nil if ptr.null?
|
123
123
|
type = Lib.g_base_info_get_type ptr
|
124
124
|
klass = TYPEMAP[type]
|
@@ -127,7 +127,7 @@ module GObjectIntrospection
|
|
127
127
|
|
128
128
|
private
|
129
129
|
|
130
|
-
def wrap_info
|
130
|
+
def wrap_info(ptr)
|
131
131
|
self.class.wrap_ibaseinfo_pointer ptr
|
132
132
|
end
|
133
133
|
end
|
@@ -6,7 +6,7 @@ module GObjectIntrospection
|
|
6
6
|
Lib.g_struct_info_get_n_fields @gobj
|
7
7
|
end
|
8
8
|
|
9
|
-
def field
|
9
|
+
def field(index)
|
10
10
|
IFieldInfo.wrap(Lib.g_struct_info_get_field @gobj, index)
|
11
11
|
end
|
12
12
|
|
@@ -18,7 +18,7 @@ module GObjectIntrospection
|
|
18
18
|
Lib.g_struct_info_get_n_methods @gobj
|
19
19
|
end
|
20
20
|
|
21
|
-
def get_method
|
21
|
+
def get_method(index)
|
22
22
|
IFunctionInfo.wrap(Lib.g_struct_info_get_method @gobj, index)
|
23
23
|
end
|
24
24
|
|
@@ -6,7 +6,7 @@ module GObjectIntrospection
|
|
6
6
|
Lib.g_union_info_get_n_fields @gobj
|
7
7
|
end
|
8
8
|
|
9
|
-
def field
|
9
|
+
def field(index)
|
10
10
|
IFieldInfo.wrap(Lib.g_union_info_get_field @gobj, index)
|
11
11
|
end
|
12
12
|
|
@@ -17,14 +17,14 @@ module GObjectIntrospection
|
|
17
17
|
Lib.g_union_info_get_n_methods @gobj
|
18
18
|
end
|
19
19
|
|
20
|
-
def get_method
|
20
|
+
def get_method(index)
|
21
21
|
IFunctionInfo.wrap(Lib.g_union_info_get_method @gobj, index)
|
22
22
|
end
|
23
23
|
|
24
24
|
##
|
25
25
|
build_array_method :get_methods
|
26
26
|
|
27
|
-
def find_method
|
27
|
+
def find_method(name)
|
28
28
|
IFunctionInfo.wrap(Lib.g_union_info_find_method @gobj, name)
|
29
29
|
end
|
30
30
|
|
@@ -10,11 +10,11 @@ module GObjectIntrospection
|
|
10
10
|
# Provide several guesses to #provide_guess, and the result in #best_guess
|
11
11
|
# will be the best (i.e., lowest) guess.
|
12
12
|
class VersionGuesser
|
13
|
-
def initialize
|
13
|
+
def initialize(base)
|
14
14
|
@guess = base
|
15
15
|
end
|
16
16
|
|
17
|
-
def provide_guess
|
17
|
+
def provide_guess(guessed)
|
18
18
|
@guess = guessed if guessed < @guess
|
19
19
|
end
|
20
20
|
|
@@ -131,14 +131,14 @@ module GObjectIntrospection
|
|
131
131
|
# gobject-introspection version 0.9.0 and 0.9.1. Therefore, we need to
|
132
132
|
# retrieve the correct values before declaring the ITypeTag enum.
|
133
133
|
attach_function :tmp_type_tag_to_string, :g_type_tag_to_string, [:int], :string
|
134
|
-
type_tag_map = (0..31).map
|
134
|
+
type_tag_map = (0..31).map do |id|
|
135
135
|
sym = tmp_type_tag_to_string(id).to_sym
|
136
136
|
if sym == :unknown
|
137
137
|
nil
|
138
138
|
else
|
139
139
|
[sym, id]
|
140
140
|
end
|
141
|
-
|
141
|
+
end.compact.flatten
|
142
142
|
enum :ITypeTag, type_tag_map
|
143
143
|
|
144
144
|
# Now, attach g_type_tag_to_string again under its own name with an
|
@@ -6,11 +6,11 @@ module GLib
|
|
6
6
|
extend FFI::DataConverter
|
7
7
|
native_type FFI::Type::INT
|
8
8
|
|
9
|
-
def self.from_native
|
9
|
+
def self.from_native(value, _context)
|
10
10
|
value != 0 ? true : false
|
11
11
|
end
|
12
12
|
|
13
|
-
def self.to_native
|
13
|
+
def self.to_native(value, _context)
|
14
14
|
value ? 1 : 0
|
15
15
|
end
|
16
16
|
|
@@ -18,11 +18,11 @@ module GLib
|
|
18
18
|
FFI.type_size FFI::Type::INT
|
19
19
|
end
|
20
20
|
|
21
|
-
def self.copy_value_to_pointer
|
21
|
+
def self.copy_value_to_pointer(value, pointer)
|
22
22
|
pointer.put_int 0, to_native(value, nil)
|
23
23
|
end
|
24
24
|
|
25
|
-
def self.get_value_from_pointer
|
25
|
+
def self.get_value_from_pointer(pointer)
|
26
26
|
from_native pointer.get_int(0), nil
|
27
27
|
end
|
28
28
|
end
|
@@ -4,7 +4,7 @@ module GirFFI
|
|
4
4
|
# Helper module providing a safe allocation method that raises an exception
|
5
5
|
# if memory cannot be allocated.
|
6
6
|
module AllocationHelper
|
7
|
-
def self.safe_malloc
|
7
|
+
def self.safe_malloc(size)
|
8
8
|
ptr = LibC.malloc size
|
9
9
|
raise NoMemoryError if ptr.null?
|
10
10
|
ptr
|
data/lib/gir_ffi/arg_helper.rb
CHANGED
@@ -13,11 +13,11 @@ module GirFFI
|
|
13
13
|
@store = {}
|
14
14
|
end
|
15
15
|
|
16
|
-
def store
|
16
|
+
def store(ptr, obj)
|
17
17
|
@store[ptr.address] = obj
|
18
18
|
end
|
19
19
|
|
20
|
-
def fetch
|
20
|
+
def fetch(ptr)
|
21
21
|
return if ptr.null?
|
22
22
|
key = ptr.address
|
23
23
|
if @store.key? key
|
@@ -30,22 +30,22 @@ module GirFFI
|
|
30
30
|
|
31
31
|
OBJECT_STORE = ObjectStore.new
|
32
32
|
|
33
|
-
def self.ptr_to_utf8_length
|
33
|
+
def self.ptr_to_utf8_length(ptr, len)
|
34
34
|
ptr.null? ? nil : ptr.read_string(len)
|
35
35
|
end
|
36
36
|
|
37
|
-
def self.check_error
|
37
|
+
def self.check_error(errpp)
|
38
38
|
err = GLib::Error.wrap(errpp.read_pointer)
|
39
39
|
raise GLibError, err if err
|
40
40
|
end
|
41
41
|
|
42
|
-
def self.check_fixed_array_size
|
42
|
+
def self.check_fixed_array_size(size, arr, name)
|
43
43
|
unless arr.size == size
|
44
44
|
raise ArgumentError, "#{name} should have size #{size}"
|
45
45
|
end
|
46
46
|
end
|
47
47
|
|
48
|
-
def self.cast_from_pointer
|
48
|
+
def self.cast_from_pointer(type, it)
|
49
49
|
case type
|
50
50
|
when :utf8, :filename
|
51
51
|
it.to_utf8
|
@@ -72,7 +72,7 @@ module GirFFI
|
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
75
|
-
def self.cast_uint32_to_int32
|
75
|
+
def self.cast_uint32_to_int32(val)
|
76
76
|
if val >= 0x80000000
|
77
77
|
-(0x100000000 - val)
|
78
78
|
else
|
@@ -80,7 +80,7 @@ module GirFFI
|
|
80
80
|
end
|
81
81
|
end
|
82
82
|
|
83
|
-
def self.cast_pointer_to_int32
|
83
|
+
def self.cast_pointer_to_int32(ptr)
|
84
84
|
cast_uint32_to_int32(ptr.address & 0xffffffff)
|
85
85
|
end
|
86
86
|
end
|
data/lib/gir_ffi/boxed_base.rb
CHANGED
@@ -9,30 +9,26 @@ module GirFFI
|
|
9
9
|
FFI::Type::Struct.new(self::Struct)
|
10
10
|
end
|
11
11
|
|
12
|
-
# @deprecated Use #to_ffi_type instead. Will be removed in 0.8.0.
|
13
|
-
def self.to_ffitype
|
14
|
-
to_ffi_type
|
15
|
-
end
|
16
|
-
|
17
12
|
def self.to_ffi_type
|
18
13
|
self
|
19
14
|
end
|
20
15
|
|
21
|
-
def self.to_native
|
16
|
+
def self.to_native(value, _context)
|
22
17
|
value.struct
|
23
18
|
end
|
24
19
|
|
25
|
-
def self.get_value_from_pointer
|
20
|
+
def self.get_value_from_pointer(pointer)
|
26
21
|
pointer.to_ptr
|
27
22
|
end
|
28
23
|
|
29
|
-
def self.copy_value_to_pointer
|
24
|
+
def self.copy_value_to_pointer(value, pointer, offset = 0)
|
30
25
|
size = self::Struct.size
|
31
26
|
pointer.put_bytes offset, value.to_ptr.read_bytes(size), 0, size
|
32
27
|
end
|
33
28
|
|
29
|
+
# TODO: Make this behave more like a real .new method
|
34
30
|
def self._allocate
|
35
|
-
obj =
|
31
|
+
obj = allocate
|
36
32
|
obj.instance_variable_set :@struct, self::Struct.new
|
37
33
|
obj
|
38
34
|
end
|
data/lib/gir_ffi/builder.rb
CHANGED
@@ -10,23 +10,23 @@ module GirFFI
|
|
10
10
|
module Builder
|
11
11
|
extend BuilderHelper
|
12
12
|
|
13
|
-
def self.build_class
|
13
|
+
def self.build_class(info)
|
14
14
|
Builders::TypeBuilder.build(info)
|
15
15
|
end
|
16
16
|
|
17
|
-
def self.build_by_gtype
|
17
|
+
def self.build_by_gtype(gtype)
|
18
18
|
info = GObjectIntrospection::IRepository.default.find_by_gtype gtype
|
19
19
|
info ||= UnintrospectableTypeInfo.new gtype
|
20
20
|
|
21
21
|
build_class info
|
22
22
|
end
|
23
23
|
|
24
|
-
def self.build_module
|
24
|
+
def self.build_module(namespace, version = nil)
|
25
25
|
Builders::ModuleBuilder.new(namespace, version).generate
|
26
26
|
end
|
27
27
|
|
28
28
|
# TODO: Move elsewhere, perhaps to FunctionBuilder.
|
29
|
-
def self.attach_ffi_function
|
29
|
+
def self.attach_ffi_function(lib, info)
|
30
30
|
sym = info.symbol
|
31
31
|
return if lib.method_defined? sym
|
32
32
|
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module GirFFI
|
2
2
|
# Set of helper methods used in the builders.
|
3
3
|
module BuilderHelper
|
4
|
-
def optionally_define_constant
|
4
|
+
def optionally_define_constant(parent, name)
|
5
5
|
if parent.const_defined? name, false
|
6
6
|
parent.const_get name
|
7
7
|
else
|
@@ -9,11 +9,11 @@ module GirFFI
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
-
def get_or_define_class
|
12
|
+
def get_or_define_class(namespace, name, parent)
|
13
13
|
optionally_define_constant(namespace, name) { Class.new parent }
|
14
14
|
end
|
15
15
|
|
16
|
-
def get_or_define_module
|
16
|
+
def get_or_define_module(parent, name)
|
17
17
|
optionally_define_constant(parent, name) { Module.new }
|
18
18
|
end
|
19
19
|
end
|
@@ -6,7 +6,7 @@ module GirFFI
|
|
6
6
|
class ArgumentBuilderCollection
|
7
7
|
attr_reader :return_value_builder
|
8
8
|
|
9
|
-
def initialize
|
9
|
+
def initialize(return_value_builder, argument_builders, options = {})
|
10
10
|
@receiver_builder = options[:receiver_builder]
|
11
11
|
@error_argument_builder = options[:error_argument_builder]
|
12
12
|
@base_argument_builders = argument_builders
|
@@ -22,11 +22,11 @@ module GirFFI
|
|
22
22
|
@is_closure
|
23
23
|
end
|
24
24
|
|
25
|
-
def closure=
|
25
|
+
def closure=(arg)
|
26
26
|
@is_closure = arg
|
27
27
|
end
|
28
28
|
|
29
|
-
def initialize
|
29
|
+
def initialize(var_gen, arginfo)
|
30
30
|
@var_gen = var_gen
|
31
31
|
@arginfo = arginfo
|
32
32
|
@length_arg = nil
|
@@ -64,7 +64,7 @@ module GirFFI
|
|
64
64
|
arginfo.ownership_transfer
|
65
65
|
end
|
66
66
|
|
67
|
-
def safe
|
67
|
+
def safe(name)
|
68
68
|
if KEYWORDS.include? name
|
69
69
|
"#{name}_"
|
70
70
|
else
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require 'gir_ffi/builders/argument_builder'
|
2
|
+
require 'gir_ffi/builders/argument_builder_collection'
|
3
|
+
require 'gir_ffi/builders/error_argument_builder'
|
4
|
+
require 'gir_ffi/builders/method_template'
|
5
|
+
require 'gir_ffi/error_argument_info'
|
6
|
+
require 'gir_ffi/return_value_info'
|
7
|
+
require 'gir_ffi/variable_name_generator'
|
8
|
+
|
9
|
+
module GirFFI
|
10
|
+
module Builders
|
11
|
+
# Base class for method definition builders.
|
12
|
+
class BaseMethodBuilder
|
13
|
+
def vargen
|
14
|
+
@vargen ||= VariableNameGenerator.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def method_definition
|
18
|
+
template.method_definition
|
19
|
+
end
|
20
|
+
|
21
|
+
def template
|
22
|
+
@template ||= MethodTemplate.new(self, argument_builder_collection)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Methods used for setting up the builders
|
26
|
+
|
27
|
+
def argument_builders
|
28
|
+
@argument_builders ||= @info.args.map { |arg| ArgumentBuilder.new vargen, arg }
|
29
|
+
end
|
30
|
+
|
31
|
+
def return_value_info
|
32
|
+
@return_value_info ||= ReturnValueInfo.new(@info.return_type,
|
33
|
+
@info.caller_owns,
|
34
|
+
@info.skip_return?)
|
35
|
+
end
|
36
|
+
|
37
|
+
def argument_builder_collection
|
38
|
+
@argument_builder_collection ||= ArgumentBuilderCollection.new(
|
39
|
+
@return_value_builder, argument_builders,
|
40
|
+
error_argument_builder: error_argument)
|
41
|
+
end
|
42
|
+
|
43
|
+
def error_argument
|
44
|
+
@error_argument ||=
|
45
|
+
if @info.throws?
|
46
|
+
ErrorArgumentBuilder.new vargen, ErrorArgumentInfo.new
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Methods used by MethodTemplate
|
51
|
+
|
52
|
+
def invocation
|
53
|
+
"#{lib_name}.#{@info.symbol} #{function_call_arguments.join(', ')}"
|
54
|
+
end
|
55
|
+
|
56
|
+
def method_arguments
|
57
|
+
argument_builder_collection.method_argument_names
|
58
|
+
end
|
59
|
+
|
60
|
+
def preparation
|
61
|
+
[]
|
62
|
+
end
|
63
|
+
|
64
|
+
private
|
65
|
+
|
66
|
+
def lib_name
|
67
|
+
"#{@info.safe_namespace}::Lib"
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|