gir_ffi 0.6.7 → 0.7.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 +7 -0
- data/{History.txt → Changelog.md} +93 -61
- data/{DESIGN.rdoc → DESIGN.md} +7 -7
- data/README.md +5 -7
- data/TODO.md +90 -0
- data/lib/ffi-glib.rb +0 -1
- data/lib/ffi-glib/array.rb +13 -29
- data/lib/ffi-glib/array_methods.rb +13 -0
- data/lib/ffi-glib/container_class_methods.rb +6 -1
- data/lib/ffi-glib/hash_table.rb +3 -2
- data/lib/ffi-glib/list.rb +3 -17
- data/lib/ffi-glib/list_methods.rb +22 -3
- data/lib/ffi-glib/ptr_array.rb +19 -19
- data/lib/ffi-glib/s_list.rb +3 -17
- data/lib/ffi-gobject.rb +10 -17
- data/lib/ffi-gobject/object.rb +19 -9
- data/lib/ffi-gobject/object_class.rb +14 -0
- data/lib/ffi-gobject/ruby_closure.rb +4 -5
- data/lib/ffi-gobject/value.rb +7 -5
- data/lib/ffi-gobject_introspection/i_vfunc_info.rb +1 -1
- data/lib/gir_ffi-base.rb +0 -2
- data/lib/gir_ffi-base/gobject.rb +1 -0
- data/lib/gir_ffi-base/gobject/lib.rb +1 -1
- data/lib/gir_ffi.rb +2 -0
- data/lib/gir_ffi/arg_helper.rb +18 -8
- data/lib/gir_ffi/builders/argument_builder.rb +62 -55
- data/lib/gir_ffi/builders/base_argument_builder.rb +52 -106
- data/lib/gir_ffi/builders/base_type_builder.rb +3 -3
- data/lib/gir_ffi/builders/c_to_ruby_convertor.rb +34 -0
- data/lib/gir_ffi/builders/callback_argument_builder.rb +73 -0
- data/lib/gir_ffi/builders/callback_builder.rb +19 -9
- data/lib/gir_ffi/builders/callback_return_value_builder.rb +54 -0
- data/lib/gir_ffi/builders/closure_convertor.rb +9 -0
- data/lib/gir_ffi/builders/closure_to_pointer_convertor.rb +9 -0
- data/lib/gir_ffi/builders/constructor_result_convertor.rb +9 -0
- data/lib/gir_ffi/builders/enum_builder.rb +16 -16
- data/lib/gir_ffi/builders/field_builder.rb +36 -15
- data/lib/gir_ffi/builders/function_builder.rb +32 -27
- data/lib/gir_ffi/builders/interface_builder.rb +14 -4
- data/lib/gir_ffi/builders/mapping_method_builder.rb +95 -43
- data/lib/gir_ffi/builders/module_builder.rb +22 -35
- data/lib/gir_ffi/builders/null_convertor.rb +9 -0
- data/lib/gir_ffi/builders/object_builder.rb +11 -14
- data/lib/gir_ffi/builders/property_builder.rb +107 -9
- data/lib/gir_ffi/builders/registered_type_builder.rb +2 -2
- data/lib/gir_ffi/builders/return_value_builder.rb +42 -33
- data/lib/gir_ffi/builders/ruby_to_c_convertor.rb +15 -0
- data/lib/gir_ffi/builders/signal_builder.rb +18 -58
- data/lib/gir_ffi/builders/struct_builder.rb +1 -2
- data/lib/gir_ffi/builders/type_builder.rb +1 -0
- data/lib/gir_ffi/builders/unintrospectable_builder.rb +4 -4
- data/lib/gir_ffi/builders/user_defined_builder.rb +151 -26
- data/lib/gir_ffi/builders/vfunc_builder.rb +57 -0
- data/lib/gir_ffi/builders/with_layout.rb +10 -8
- data/lib/gir_ffi/builders/with_methods.rb +1 -1
- data/lib/gir_ffi/callback_base.rb +42 -8
- data/lib/gir_ffi/class_base.rb +1 -2
- data/lib/gir_ffi/enum_base.rb +26 -4
- data/lib/gir_ffi/error_argument_info.rb +21 -0
- data/lib/gir_ffi/{setter_argument_info.rb → field_argument_info.rb} +2 -1
- data/lib/gir_ffi/g_type.rb +25 -0
- data/lib/gir_ffi/in_out_pointer.rb +3 -14
- data/lib/gir_ffi/in_pointer.rb +20 -21
- data/lib/gir_ffi/info_ext.rb +2 -0
- data/lib/gir_ffi/info_ext/i_callable_info.rb +0 -9
- data/lib/gir_ffi/info_ext/i_callback_info.rb +17 -0
- data/lib/gir_ffi/info_ext/i_function_info.rb +4 -0
- data/lib/gir_ffi/info_ext/i_property_info.rb +4 -0
- data/lib/gir_ffi/info_ext/i_registered_type_info.rb +1 -0
- data/lib/gir_ffi/info_ext/i_signal_info.rb +14 -16
- data/lib/gir_ffi/info_ext/i_type_info.rb +72 -34
- data/lib/gir_ffi/info_ext/i_vfunc_info.rb +12 -0
- data/lib/gir_ffi/info_ext/safe_constant_name.rb +3 -2
- data/lib/gir_ffi/interface_base.rb +8 -3
- data/lib/gir_ffi/module_base.rb +3 -5
- data/lib/gir_ffi/object_base.rb +8 -0
- data/lib/gir_ffi/receiver_argument_info.rb +21 -0
- data/lib/gir_ffi/receiver_type_info.rb +27 -0
- data/lib/gir_ffi/return_value_info.rb +23 -0
- data/lib/gir_ffi/signal_base.rb +1 -1
- data/lib/{ffi-glib → gir_ffi}/sized_array.rb +10 -6
- data/lib/gir_ffi/struct_base.rb +10 -9
- data/lib/gir_ffi/type_base.rb +1 -0
- data/lib/gir_ffi/type_map.rb +3 -0
- data/lib/gir_ffi/unintrospectable_type_info.rb +4 -1
- data/lib/gir_ffi/union_base.rb +4 -21
- data/lib/gir_ffi/user_data_argument_info.rb +21 -0
- data/lib/gir_ffi/user_data_type_info.rb +17 -0
- data/lib/gir_ffi/user_defined_type_info.rb +18 -4
- data/lib/gir_ffi/version.rb +1 -1
- data/lib/gir_ffi/vfunc_base.rb +8 -0
- data/lib/gir_ffi/vfunc_implementation.rb +11 -0
- data/lib/gir_ffi/zero_terminated.rb +18 -24
- data/test/base_test_helper.rb +2 -3
- data/test/ffi-glib/array_test.rb +3 -3
- data/test/ffi-glib/ruby_closure_test.rb +3 -3
- data/test/ffi-gobject/value_test.rb +15 -1
- data/test/ffi-gobject_test.rb +2 -1
- data/test/gir_ffi/arg_helper_test.rb +21 -2
- data/test/gir_ffi/builders/argument_builder_test.rb +213 -287
- data/test/gir_ffi/builders/base_argument_builder_test.rb +1 -1
- data/test/gir_ffi/builders/callback_builder_test.rb +26 -8
- data/test/gir_ffi/builders/field_builder_test.rb +18 -3
- data/test/gir_ffi/builders/function_builder_test.rb +30 -12
- data/test/gir_ffi/builders/interface_builder_test.rb +9 -0
- data/test/gir_ffi/builders/module_builder_test.rb +0 -39
- data/test/gir_ffi/builders/object_builder_test.rb +27 -27
- data/test/gir_ffi/builders/property_builder_test.rb +110 -0
- data/test/gir_ffi/builders/return_value_builder_test.rb +168 -200
- data/test/gir_ffi/builders/signal_builder_test.rb +58 -14
- data/test/gir_ffi/builders/struct_builder_test.rb +2 -41
- data/test/gir_ffi/builders/user_defined_builder_test.rb +88 -20
- data/test/gir_ffi/builders/vfunc_builder_test.rb +44 -0
- data/test/gir_ffi/g_type_test.rb +29 -0
- data/test/gir_ffi/in_pointer_test.rb +28 -9
- data/test/gir_ffi/info_ext/i_callable_info_test.rb +0 -9
- data/test/gir_ffi/info_ext/i_callback_info_test.rb +19 -0
- data/test/gir_ffi/info_ext/i_function_info_test.rb +9 -0
- data/test/gir_ffi/info_ext/i_signal_info_test.rb +8 -11
- data/test/gir_ffi/info_ext/i_type_info_test.rb +140 -16
- data/test/gir_ffi/interface_base_test.rb +9 -3
- data/test/gir_ffi/object_base_test.rb +1 -2
- data/test/{ffi-glib → gir_ffi}/sized_array_test.rb +28 -28
- data/test/gir_ffi/type_map_test.rb +1 -1
- data/test/gir_ffi/user_defined_type_info_test.rb +36 -4
- data/test/gir_ffi_test.rb +5 -5
- data/test/gir_ffi_test_helper.rb +4 -0
- data/test/integration/generated_gimarshallingtests_test.rb +163 -59
- data/test/integration/generated_gobject_test.rb +21 -8
- data/test/integration/generated_pango_test.rb +2 -2
- data/test/integration/generated_regress_test.rb +361 -101
- data/test/lib/autogen.sh +5 -1
- metadata +51 -35
- data/TODO.rdoc +0 -63
- data/lib/gir_ffi-base/gir_ffi/library.rb +0 -17
- data/lib/gir_ffi-base/gir_ffi/struct.rb +0 -27
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'gir_ffi/return_value_info'
|
2
|
+
require 'gir_ffi/builders/base_type_builder'
|
3
|
+
require 'gir_ffi/builders/mapping_method_builder'
|
4
|
+
require 'gir_ffi/receiver_type_info'
|
5
|
+
require 'gir_ffi/receiver_argument_info'
|
6
|
+
require 'gir_ffi/vfunc_base'
|
7
|
+
|
8
|
+
module GirFFI
|
9
|
+
module Builders
|
10
|
+
# Implements the creation of a class representing the implementation of a
|
11
|
+
# vfunc. This class will be able to turn a proc into an FFI::Function that
|
12
|
+
# can serve as such an implementation in C.
|
13
|
+
class VFuncBuilder < BaseTypeBuilder
|
14
|
+
def instantiate_class
|
15
|
+
unless already_set_up
|
16
|
+
setup_constants
|
17
|
+
klass.class_eval mapping_method_definition
|
18
|
+
end
|
19
|
+
klass
|
20
|
+
end
|
21
|
+
|
22
|
+
def klass
|
23
|
+
@klass ||= get_or_define_class container_class, @classname, CallbackBase
|
24
|
+
end
|
25
|
+
|
26
|
+
def mapping_method_definition
|
27
|
+
arg_infos = info.args
|
28
|
+
|
29
|
+
receiver_info = ReceiverArgumentInfo.new(receiver_type_info)
|
30
|
+
|
31
|
+
MappingMethodBuilder.for_vfunc(receiver_info,
|
32
|
+
arg_infos,
|
33
|
+
info.return_type).method_definition
|
34
|
+
end
|
35
|
+
|
36
|
+
def receiver_type_info
|
37
|
+
ReceiverTypeInfo.new(container_info)
|
38
|
+
end
|
39
|
+
|
40
|
+
def container_class
|
41
|
+
@container_class ||= Builder.build_class(container_info)
|
42
|
+
end
|
43
|
+
|
44
|
+
def container_info
|
45
|
+
@container_info ||= info.container
|
46
|
+
end
|
47
|
+
|
48
|
+
def argument_types
|
49
|
+
@argument_types ||= info.argument_ffi_types.unshift(receiver_type_info.to_ffitype)
|
50
|
+
end
|
51
|
+
|
52
|
+
def return_type
|
53
|
+
@return_type ||= info.return_ffi_type
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -20,7 +20,7 @@ module GirFFI
|
|
20
20
|
|
21
21
|
def setup_layout
|
22
22
|
spec = layout_specification
|
23
|
-
|
23
|
+
struct_class.class_eval { layout(*spec) }
|
24
24
|
end
|
25
25
|
|
26
26
|
def dummy_layout_specification
|
@@ -35,21 +35,23 @@ module GirFFI
|
|
35
35
|
fields.map { |finfo| finfo.layout_specification }.flatten(1)
|
36
36
|
end
|
37
37
|
|
38
|
-
def setup_accessors_for_field_info finfo
|
39
|
-
FieldBuilder.new(finfo).build
|
40
|
-
end
|
41
|
-
|
42
38
|
def setup_field_accessors
|
43
39
|
fields.each do |finfo|
|
44
|
-
|
40
|
+
FieldBuilder.new(finfo).build
|
45
41
|
end
|
46
42
|
end
|
47
43
|
|
48
44
|
def instantiate_class
|
49
|
-
@klass = get_or_define_class namespace_module, @classname, superclass
|
50
|
-
@structklass = get_or_define_class @klass, :Struct, layout_superclass
|
51
45
|
setup_class unless already_set_up
|
52
46
|
end
|
47
|
+
|
48
|
+
def klass
|
49
|
+
@klass ||= get_or_define_class namespace_module, @classname, superclass
|
50
|
+
end
|
51
|
+
|
52
|
+
def struct_class
|
53
|
+
@structklass ||= get_or_define_class klass, :Struct, layout_superclass
|
54
|
+
end
|
53
55
|
end
|
54
56
|
end
|
55
57
|
end
|
@@ -1,31 +1,65 @@
|
|
1
1
|
require 'gir_ffi/type_base'
|
2
2
|
|
3
3
|
module GirFFI
|
4
|
-
module
|
5
|
-
|
4
|
+
# Base module for callbacks.
|
5
|
+
class CallbackBase < Proc
|
6
|
+
extend TypeBase
|
7
|
+
extend FFI::DataConverter
|
6
8
|
|
7
|
-
def
|
8
|
-
|
9
|
+
def self.native_type
|
10
|
+
FFI::Type::POINTER
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.from_native(value, _context)
|
14
|
+
return nil if !value || value.null?
|
15
|
+
FFI::Function.new gir_ffi_builder.return_type, gir_ffi_builder.argument_types, value
|
9
16
|
end
|
10
17
|
|
18
|
+
def self.to_native(value, _context)
|
19
|
+
return nil unless value
|
20
|
+
return value if FFI::Function === value
|
21
|
+
value.to_native
|
22
|
+
end
|
23
|
+
|
24
|
+
CALLBACKS = []
|
25
|
+
|
11
26
|
def self.store_callback prc
|
12
27
|
CALLBACKS << prc
|
13
28
|
end
|
14
29
|
|
15
30
|
# Create Callback from a Proc. Makes sure arguments are properly wrapped,
|
16
31
|
# and the callback is stored to prevent garbage collection.
|
17
|
-
def from prc
|
32
|
+
def self.from prc
|
18
33
|
wrap_in_callback_args_mapper(prc).tap do |cb|
|
19
34
|
store_callback cb
|
20
35
|
end
|
21
36
|
end
|
22
37
|
|
23
|
-
def wrap_in_callback_args_mapper prc
|
38
|
+
def self.wrap_in_callback_args_mapper prc
|
39
|
+
return nil unless prc
|
24
40
|
return prc if FFI::Function === prc
|
25
|
-
return
|
26
|
-
return Proc.new do |*args|
|
41
|
+
return self.new do |*args|
|
27
42
|
call_with_argument_mapping(prc, *args)
|
28
43
|
end
|
29
44
|
end
|
45
|
+
|
46
|
+
def self.to_ffitype
|
47
|
+
self
|
48
|
+
end
|
49
|
+
|
50
|
+
def to_native
|
51
|
+
@to_native ||= begin
|
52
|
+
builder = self.class.gir_ffi_builder
|
53
|
+
FFI::Function.new builder.return_type, builder.argument_types, self
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def self.copy_value_to_pointer value, pointer
|
58
|
+
pointer.put_pointer 0, to_native(value, nil)
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.get_value_from_pointer pointer
|
62
|
+
from_native pointer.get_pointer(0), nil
|
63
|
+
end
|
30
64
|
end
|
31
65
|
end
|
data/lib/gir_ffi/class_base.rb
CHANGED
data/lib/gir_ffi/enum_base.rb
CHANGED
@@ -1,9 +1,23 @@
|
|
1
1
|
require 'gir_ffi/type_base'
|
2
2
|
|
3
3
|
module GirFFI
|
4
|
+
# Base module for enums.
|
4
5
|
module EnumBase
|
6
|
+
include FFI::DataConverter
|
5
7
|
include TypeBase
|
6
|
-
|
8
|
+
|
9
|
+
def native_type
|
10
|
+
self::Enum.native_type
|
11
|
+
end
|
12
|
+
|
13
|
+
def to_native *args
|
14
|
+
self::Enum.to_native(*args)
|
15
|
+
end
|
16
|
+
|
17
|
+
def from_native *args
|
18
|
+
self::Enum.from_native(*args)
|
19
|
+
end
|
20
|
+
|
7
21
|
def [](arg)
|
8
22
|
self::Enum[arg]
|
9
23
|
end
|
@@ -12,8 +26,16 @@ module GirFFI
|
|
12
26
|
self[arg]
|
13
27
|
end
|
14
28
|
|
15
|
-
def
|
16
|
-
self
|
29
|
+
def from arg
|
30
|
+
self[arg]
|
31
|
+
end
|
32
|
+
|
33
|
+
def copy_value_to_pointer value, pointer
|
34
|
+
pointer.put_int32 0, to_native(value, nil)
|
35
|
+
end
|
36
|
+
|
37
|
+
def get_value_from_pointer pointer
|
38
|
+
from_native pointer.get_int32(0), nil
|
17
39
|
end
|
18
40
|
|
19
41
|
def setup_and_call method, *arguments, &block
|
@@ -27,7 +49,7 @@ module GirFFI
|
|
27
49
|
end
|
28
50
|
|
29
51
|
def to_ffitype
|
30
|
-
self
|
52
|
+
self
|
31
53
|
end
|
32
54
|
|
33
55
|
def setup_method name
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module GirFFI
|
2
|
+
# Represents an error argument with the same interface as IArgumentInfo
|
3
|
+
class ErrorArgumentInfo
|
4
|
+
def skip?
|
5
|
+
false
|
6
|
+
end
|
7
|
+
|
8
|
+
def direction
|
9
|
+
:error
|
10
|
+
end
|
11
|
+
|
12
|
+
def argument_type
|
13
|
+
nil
|
14
|
+
end
|
15
|
+
|
16
|
+
def name
|
17
|
+
nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
@@ -1,7 +1,8 @@
|
|
1
1
|
module GirFFI
|
2
2
|
# Class to represent argument info for the argument of a setter method.
|
3
3
|
# Implements the necessary parts of IArgumentInfo's interface.
|
4
|
-
|
4
|
+
# TODO: Rename and add direction argument or subclass
|
5
|
+
class FieldArgumentInfo
|
5
6
|
attr_reader :name, :argument_type
|
6
7
|
|
7
8
|
def initialize name, type
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# Wrapper class providing extended functionality for a GType, which is normally
|
2
|
+
# just a kind of integer
|
3
|
+
class GirFFI::GType
|
4
|
+
def initialize gtype
|
5
|
+
@gtype = gtype
|
6
|
+
end
|
7
|
+
|
8
|
+
def to_i
|
9
|
+
@gtype
|
10
|
+
end
|
11
|
+
|
12
|
+
def class_size
|
13
|
+
type_query.class_size
|
14
|
+
end
|
15
|
+
|
16
|
+
def instance_size
|
17
|
+
type_query.instance_size
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def type_query
|
23
|
+
@type_query ||= GObject.type_query @gtype
|
24
|
+
end
|
25
|
+
end
|
@@ -2,7 +2,7 @@ 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
|
#
|
5
|
-
# TODO: This has now become a more general
|
5
|
+
# TODO: This has now become a more general extended pointer class and should be renamed.
|
6
6
|
class InOutPointer < FFI::Pointer
|
7
7
|
attr_reader :value_type
|
8
8
|
|
@@ -18,16 +18,10 @@ module GirFFI
|
|
18
18
|
# TODO: Create type classes that extract values from pointers.
|
19
19
|
def to_value
|
20
20
|
case value_ffi_type
|
21
|
-
when
|
21
|
+
when Module
|
22
22
|
value_ffi_type.get_value_from_pointer(self)
|
23
|
-
# FIXME: This is a hack, since :c is not really a FFI type. Make
|
24
|
-
# SizedArray a type FFI understands instead.
|
25
|
-
when :c
|
26
|
-
self
|
27
23
|
when Symbol
|
28
24
|
self.send("get_#{value_ffi_type}", 0)
|
29
|
-
when FFI::Enum
|
30
|
-
value_ffi_type[self.get_int32(0)]
|
31
25
|
else
|
32
26
|
raise NotImplementedError
|
33
27
|
end
|
@@ -50,15 +44,10 @@ module GirFFI
|
|
50
44
|
|
51
45
|
def set_value value
|
52
46
|
case value_ffi_type
|
53
|
-
when
|
47
|
+
when Module
|
54
48
|
value_ffi_type.copy_value_to_pointer(value, self)
|
55
|
-
# FIXME: Make SizedArray an FFI DataConverter so it conflates with the code above.
|
56
|
-
when :c
|
57
|
-
GLib::SizedArray.copy_value_to_pointer(value, self)
|
58
49
|
when Symbol
|
59
50
|
self.send "put_#{value_ffi_type}", 0, value
|
60
|
-
when FFI::Enum
|
61
|
-
self.send "put_int32", 0, value_ffi_type.to_native(value, nil)
|
62
51
|
else
|
63
52
|
raise NotImplementedError, value_ffi_type
|
64
53
|
end
|
data/lib/gir_ffi/in_pointer.rb
CHANGED
@@ -21,7 +21,9 @@ module GirFFI
|
|
21
21
|
when Module
|
22
22
|
from_enum_array type, ary
|
23
23
|
when Array
|
24
|
-
|
24
|
+
main_type, sub_type = *type
|
25
|
+
raise "Unexpected main type #{main_type}" if main_type != :pointer
|
26
|
+
from_pointer_array sub_type, ary
|
25
27
|
else
|
26
28
|
raise NotImplementedError, type
|
27
29
|
end
|
@@ -34,21 +36,17 @@ module GirFFI
|
|
34
36
|
from_utf8 val
|
35
37
|
when :gint32, :guint32, :gint8
|
36
38
|
self.new val
|
39
|
+
when Class, :void
|
40
|
+
val.to_ptr
|
37
41
|
when Module
|
38
42
|
self.new type[val]
|
39
|
-
when :void
|
40
|
-
from_object val
|
41
43
|
else
|
42
44
|
raise NotImplementedError, type
|
43
45
|
end
|
44
46
|
end
|
45
47
|
|
46
48
|
class << self
|
47
|
-
|
48
|
-
def from_object obj
|
49
|
-
return nil if obj.nil?
|
50
|
-
return obj.to_ptr if obj.respond_to? :to_ptr
|
51
|
-
|
49
|
+
def from_closure_data obj
|
52
50
|
FFI::Pointer.new(obj.object_id).tap {|ptr|
|
53
51
|
ArgHelper::OBJECT_STORE[ptr.address] = obj }
|
54
52
|
end
|
@@ -63,8 +61,8 @@ module GirFFI
|
|
63
61
|
from_basic_type_array :int, ary.map {|val| val ? 1 : 0}
|
64
62
|
end
|
65
63
|
|
66
|
-
def
|
67
|
-
from_basic_type_array :pointer, ary.map {|
|
64
|
+
def from_pointer_array type, ary
|
65
|
+
from_basic_type_array :pointer, ary.map {|elem| from type, elem }
|
68
66
|
end
|
69
67
|
|
70
68
|
def from_gvalue_array type, ary
|
@@ -79,13 +77,15 @@ module GirFFI
|
|
79
77
|
end
|
80
78
|
|
81
79
|
def from_struct_array type, ary
|
82
|
-
|
80
|
+
ffi_type = TypeMap.type_specification_to_ffitype type
|
81
|
+
type_size = FFI.type_size(ffi_type)
|
83
82
|
length = ary.length
|
84
83
|
|
85
|
-
ptr = AllocationHelper.safe_malloc
|
84
|
+
ptr = AllocationHelper.safe_malloc type_size * (length + 1)
|
86
85
|
ary.each_with_index do |item, idx|
|
87
86
|
type.copy_value_to_pointer item, ptr, idx * type_size
|
88
87
|
end
|
88
|
+
ptr.put_bytes length * type_size, "\0" * type_size, 0, type_size
|
89
89
|
new ptr
|
90
90
|
end
|
91
91
|
|
@@ -100,18 +100,17 @@ module GirFFI
|
|
100
100
|
end
|
101
101
|
|
102
102
|
def from_basic_type_array type, ary
|
103
|
-
ffi_type = TypeMap.
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
block = AllocationHelper.safe_malloc size * (length + 1)
|
103
|
+
ffi_type = TypeMap.type_specification_to_ffitype type
|
104
|
+
ary = ary.dup << null_value(ffi_type)
|
105
|
+
type_size = FFI.type_size(ffi_type)
|
106
|
+
block = AllocationHelper.safe_malloc type_size * ary.length
|
108
107
|
block.send "put_array_of_#{ffi_type}", 0, ary
|
109
|
-
block.send("put_#{ffi_type}",
|
110
|
-
length * size,
|
111
|
-
(ffi_type == :pointer ? nil : 0))
|
112
|
-
|
113
108
|
new block
|
114
109
|
end
|
110
|
+
|
111
|
+
def null_value ffi_type
|
112
|
+
ffi_type == :pointer ? nil : 0
|
113
|
+
end
|
115
114
|
end
|
116
115
|
end
|
117
116
|
end
|
data/lib/gir_ffi/info_ext.rb
CHANGED
@@ -1,10 +1,12 @@
|
|
1
1
|
require 'gir_ffi/info_ext/i_arg_info'
|
2
2
|
require 'gir_ffi/info_ext/i_callable_info'
|
3
|
+
require 'gir_ffi/info_ext/i_callback_info'
|
3
4
|
require 'gir_ffi/info_ext/i_field_info'
|
4
5
|
require 'gir_ffi/info_ext/i_function_info'
|
5
6
|
require 'gir_ffi/info_ext/i_property_info'
|
6
7
|
require 'gir_ffi/info_ext/i_registered_type_info'
|
7
8
|
require 'gir_ffi/info_ext/i_signal_info'
|
8
9
|
require 'gir_ffi/info_ext/i_type_info'
|
10
|
+
require 'gir_ffi/info_ext/i_vfunc_info'
|
9
11
|
require 'gir_ffi/info_ext/safe_constant_name'
|
10
12
|
require 'gir_ffi/info_ext/safe_function_name'
|