gir_ffi 0.10.2 → 0.11.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 +13 -0
- data/Gemfile +9 -4
- data/README.md +3 -2
- data/Rakefile +2 -1
- data/lib/ffi-glib/byte_array.rb +1 -1
- data/lib/ffi-glib/main_loop.rb +2 -1
- data/lib/ffi-glib/strv.rb +5 -2
- data/lib/ffi-glib/variant.rb +3 -5
- data/lib/ffi-glib.rb +4 -0
- data/lib/ffi-gobject/closure.rb +8 -10
- data/lib/ffi-gobject/object.rb +9 -6
- data/lib/ffi-gobject/param_spec.rb +4 -0
- data/lib/ffi-gobject/value.rb +13 -16
- data/lib/ffi-gobject_introspection/gobject_type_init.rb +18 -0
- data/lib/ffi-gobject_introspection/i_callable_info.rb +1 -5
- data/lib/ffi-gobject_introspection/i_constant_info.rb +3 -3
- data/lib/ffi-gobject_introspection/i_repository.rb +3 -47
- data/lib/ffi-gobject_introspection/i_vfunc_info.rb +3 -11
- data/lib/ffi-gobject_introspection/lib.rb +8 -31
- data/lib/{gir_ffi-base/glib → ffi-gobject_introspection}/strv.rb +9 -13
- data/lib/ffi-gobject_introspection.rb +47 -2
- data/lib/gir_ffi/allocation_helper.rb +1 -19
- data/lib/gir_ffi/arg_helper.rb +36 -26
- data/lib/{gir_ffi-base/glib → gir_ffi}/boolean.rb +7 -5
- data/lib/gir_ffi/boxed_base.rb +5 -23
- data/lib/gir_ffi/builder.rb +3 -3
- data/lib/gir_ffi/builders/argument_builder.rb +7 -8
- data/lib/gir_ffi/builders/base_argument_builder.rb +0 -1
- data/lib/gir_ffi/builders/callback_argument_builder.rb +2 -2
- data/lib/gir_ffi/builders/callback_return_value_builder.rb +21 -13
- data/lib/gir_ffi/builders/field_builder.rb +4 -10
- data/lib/gir_ffi/builders/module_builder.rb +6 -4
- data/lib/gir_ffi/builders/object_builder.rb +16 -16
- data/lib/gir_ffi/builders/struct_builder.rb +4 -6
- data/lib/gir_ffi/builders/struct_like.rb +1 -1
- data/lib/gir_ffi/builders/user_defined_builder.rb +83 -23
- data/lib/gir_ffi/builders/vfunc_argument_builder.rb +12 -17
- data/lib/gir_ffi/class_base.rb +0 -4
- data/lib/gir_ffi/core.rb +16 -13
- data/lib/gir_ffi/enum_base.rb +2 -41
- data/lib/gir_ffi/enum_like_base.rb +48 -0
- data/lib/gir_ffi/ffi_ext/pointer.rb +1 -1
- data/lib/gir_ffi/flags_base.rb +2 -41
- data/lib/gir_ffi/in_out_pointer.rb +1 -1
- data/lib/gir_ffi/in_pointer.rb +4 -4
- data/lib/gir_ffi/info_ext/i_type_info.rb +14 -5
- data/lib/gir_ffi/info_ext/i_vfunc_info.rb +8 -0
- data/lib/gir_ffi/module_base.rb +4 -0
- data/lib/gir_ffi/receiver_argument_info.rb +1 -1
- data/lib/gir_ffi/sized_array.rb +6 -6
- data/lib/gir_ffi/struct_base.rb +1 -6
- data/lib/gir_ffi/struct_like_base.rb +54 -45
- data/lib/gir_ffi/type_map.rb +6 -7
- data/lib/gir_ffi/union_base.rb +1 -1
- data/lib/gir_ffi/{user_defined_type_info.rb → user_defined_object_info.rb} +1 -2
- data/lib/gir_ffi/user_defined_property_info.rb +80 -2
- data/lib/gir_ffi/version.rb +1 -1
- data/lib/gir_ffi-base/gobject/lib.rb +0 -1
- data/lib/gir_ffi-base/gobject.rb +3 -5
- data/lib/gir_ffi-base.rb +3 -8
- data/tasks/test.rake +17 -3
- data/test/base_test_helper.rb +39 -23
- data/test/ffi-glib/closure_test.rb +37 -0
- data/test/ffi-glib/main_loop_test.rb +24 -0
- data/test/ffi-glib/ruby_closure_test.rb +0 -5
- data/test/ffi-gobject/object_test.rb +6 -10
- data/test/ffi-gobject/param_spec_test.rb +17 -5
- data/test/ffi-gobject/value_test.rb +15 -6
- data/test/ffi-gobject_introspection/gobject_type_init_test.rb +25 -0
- data/test/ffi-gobject_introspection/i_base_info_test.rb +1 -1
- data/test/ffi-gobject_introspection/i_repository_test.rb +18 -0
- data/test/ffi-gobject_introspection/i_vfunc_info_test.rb +40 -0
- data/test/{gir_ffi-base/glib → ffi-gobject_introspection}/strv_test.rb +8 -8
- data/test/gir_ffi/allocation_helper_test.rb +35 -0
- data/test/gir_ffi/arg_helper_test.rb +102 -7
- data/test/gir_ffi/boolean_test.rb +34 -0
- data/test/gir_ffi/boxed_base_test.rb +46 -6
- data/test/gir_ffi/builder_test.rb +88 -29
- data/test/gir_ffi/builders/argument_builder_test.rb +19 -0
- data/test/gir_ffi/builders/callback_argument_builder_test.rb +17 -0
- data/test/gir_ffi/builders/callback_return_value_builder_test.rb +1 -1
- data/test/gir_ffi/builders/field_builder_test.rb +2 -1
- data/test/gir_ffi/builders/struct_builder_test.rb +42 -25
- data/test/gir_ffi/builders/user_defined_builder_test.rb +365 -17
- data/test/gir_ffi/builders/vfunc_argument_builder_test.rb +100 -0
- data/test/gir_ffi/builders/vfunc_builder_test.rb +5 -3
- data/test/{gir_ffi_test.rb → gir_ffi/core_test.rb} +8 -6
- data/test/gir_ffi/in_out_pointer_test.rb +1 -1
- data/test/gir_ffi/receiver_argument_info_test.rb +32 -0
- data/test/gir_ffi/sized_array_test.rb +34 -0
- data/test/gir_ffi/struct_base_test.rb +4 -32
- data/test/gir_ffi/struct_like_base_test.rb +164 -0
- data/test/gir_ffi/union_base_test.rb +4 -20
- data/test/gir_ffi/{user_defined_type_info_test.rb → user_defined_object_info_test.rb} +10 -10
- data/test/gir_ffi/user_defined_property_info_test.rb +22 -5
- data/test/gir_ffi/version_test.rb +1 -1
- data/test/integration/callback_exceptions_test.rb +2 -0
- data/test/integration/derived_classes_test.rb +2 -0
- data/test/integration/generated_everything_test.rb +22 -0
- data/test/integration/generated_gimarshallingtests_test.rb +23 -21
- data/test/integration/generated_gio_test.rb +2 -0
- data/test/integration/generated_glib_test.rb +2 -0
- data/test/integration/generated_gst_test.rb +2 -0
- data/test/integration/generated_gtop_test.rb +2 -0
- data/test/integration/generated_regress_test.rb +113 -29
- data/test/integration/generated_secret_test.rb +2 -0
- data/test/integration/generated_warnlib_test.rb +2 -0
- data/test/integration/method_lookup_test.rb +2 -0
- data/test/introspection_test_helper.rb +15 -0
- metadata +21 -27
- data/lib/gir_ffi-base/glib.rb +0 -8
- data/test/gir_ffi-base/glib/boolean_test.rb +0 -34
data/lib/gir_ffi/core.rb
CHANGED
@@ -2,10 +2,10 @@
|
|
2
2
|
require 'ffi'
|
3
3
|
require 'ffi/bit_masks'
|
4
4
|
|
5
|
-
require 'gir_ffi-base'
|
6
|
-
|
7
5
|
require 'ffi-gobject_introspection'
|
8
6
|
|
7
|
+
require 'gir_ffi-base'
|
8
|
+
|
9
9
|
require 'gir_ffi/ffi_ext'
|
10
10
|
require 'gir_ffi/class_base'
|
11
11
|
require 'gir_ffi/type_map'
|
@@ -16,22 +16,25 @@ require 'gir_ffi/sized_array'
|
|
16
16
|
require 'gir_ffi/zero_terminated'
|
17
17
|
require 'gir_ffi/arg_helper'
|
18
18
|
require 'gir_ffi/builder'
|
19
|
-
require 'gir_ffi/
|
19
|
+
require 'gir_ffi/user_defined_object_info'
|
20
20
|
require 'gir_ffi/builders/user_defined_builder'
|
21
21
|
require 'gir_ffi/version'
|
22
22
|
|
23
|
-
# Main module containing classes and modules needed for generating GLib and
|
24
|
-
# GObject bindings.
|
25
23
|
module GirFFI
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
24
|
+
# Core GirFFI interface.
|
25
|
+
module Core
|
26
|
+
def setup(namespace, version = nil)
|
27
|
+
namespace = namespace.to_s
|
28
|
+
Builder.build_module namespace, version
|
29
|
+
end
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
|
31
|
+
def define_type(klass, &block)
|
32
|
+
info = UserDefinedObjectInfo.new(klass, &block)
|
33
|
+
Builders::UserDefinedBuilder.new(info).build_class
|
34
34
|
|
35
|
-
|
35
|
+
klass.gtype
|
36
|
+
end
|
36
37
|
end
|
37
38
|
end
|
39
|
+
|
40
|
+
GirFFI.extend GirFFI::Core
|
data/lib/gir_ffi/enum_base.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require 'gir_ffi/
|
2
|
+
require 'gir_ffi/enum_like_base'
|
3
3
|
|
4
4
|
module GirFFI
|
5
5
|
# Base module for enums.
|
6
6
|
module EnumBase
|
7
|
-
include
|
8
|
-
include RegisteredTypeBase
|
7
|
+
include EnumLikeBase
|
9
8
|
|
10
9
|
def native_type
|
11
10
|
self::Enum.native_type
|
@@ -22,43 +21,5 @@ module GirFFI
|
|
22
21
|
def [](arg)
|
23
22
|
self::Enum[arg]
|
24
23
|
end
|
25
|
-
|
26
|
-
def wrap(arg)
|
27
|
-
self[arg]
|
28
|
-
end
|
29
|
-
|
30
|
-
def from(arg)
|
31
|
-
self[arg]
|
32
|
-
end
|
33
|
-
|
34
|
-
def size
|
35
|
-
native_type.size
|
36
|
-
end
|
37
|
-
|
38
|
-
def copy_value_to_pointer(value, pointer)
|
39
|
-
pointer.put_int32 0, to_native(value, nil)
|
40
|
-
end
|
41
|
-
|
42
|
-
def get_value_from_pointer(pointer, offset)
|
43
|
-
from_native pointer.get_int32(offset), nil
|
44
|
-
end
|
45
|
-
|
46
|
-
def setup_and_call(method, arguments, &block)
|
47
|
-
result = setup_method method.to_s
|
48
|
-
|
49
|
-
unless result
|
50
|
-
raise "Unable to set up method #{method} in #{self}"
|
51
|
-
end
|
52
|
-
|
53
|
-
send method, *arguments, &block
|
54
|
-
end
|
55
|
-
|
56
|
-
def to_ffi_type
|
57
|
-
self
|
58
|
-
end
|
59
|
-
|
60
|
-
def setup_method(name)
|
61
|
-
gir_ffi_builder.setup_method name
|
62
|
-
end
|
63
24
|
end
|
64
25
|
end
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require 'gir_ffi/registered_type_base'
|
3
|
+
|
4
|
+
module GirFFI
|
5
|
+
# Base module for enums and flags.
|
6
|
+
module EnumLikeBase
|
7
|
+
include FFI::DataConverter
|
8
|
+
include RegisteredTypeBase
|
9
|
+
|
10
|
+
def wrap(arg)
|
11
|
+
self[arg]
|
12
|
+
end
|
13
|
+
|
14
|
+
def from(arg)
|
15
|
+
self[arg]
|
16
|
+
end
|
17
|
+
|
18
|
+
def size
|
19
|
+
native_type.size
|
20
|
+
end
|
21
|
+
|
22
|
+
def copy_value_to_pointer(value, pointer)
|
23
|
+
pointer.put_int32 0, to_native(value, nil)
|
24
|
+
end
|
25
|
+
|
26
|
+
def get_value_from_pointer(pointer, offset)
|
27
|
+
from_native pointer.get_int32(offset), nil
|
28
|
+
end
|
29
|
+
|
30
|
+
def setup_and_call(method, arguments, &block)
|
31
|
+
result = setup_method method.to_s
|
32
|
+
|
33
|
+
unless result
|
34
|
+
raise "Unable to set up method #{method} in #{self}"
|
35
|
+
end
|
36
|
+
|
37
|
+
send method, *arguments, &block
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_ffi_type
|
41
|
+
self
|
42
|
+
end
|
43
|
+
|
44
|
+
def setup_method(name)
|
45
|
+
gir_ffi_builder.setup_method name
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
data/lib/gir_ffi/flags_base.rb
CHANGED
@@ -1,11 +1,10 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require 'gir_ffi/
|
2
|
+
require 'gir_ffi/enum_like_base'
|
3
3
|
|
4
4
|
module GirFFI
|
5
5
|
# Base module for flags.
|
6
6
|
module FlagsBase
|
7
|
-
include
|
8
|
-
include RegisteredTypeBase
|
7
|
+
include EnumLikeBase
|
9
8
|
|
10
9
|
def native_type
|
11
10
|
self::BitMask.native_type
|
@@ -26,43 +25,5 @@ module GirFFI
|
|
26
25
|
def [](arg)
|
27
26
|
self::BitMask[arg]
|
28
27
|
end
|
29
|
-
|
30
|
-
def wrap(arg)
|
31
|
-
self[arg]
|
32
|
-
end
|
33
|
-
|
34
|
-
def from(arg)
|
35
|
-
self[arg]
|
36
|
-
end
|
37
|
-
|
38
|
-
def size
|
39
|
-
native_type.size
|
40
|
-
end
|
41
|
-
|
42
|
-
def copy_value_to_pointer(value, pointer)
|
43
|
-
pointer.put_int32 0, to_native(value, nil)
|
44
|
-
end
|
45
|
-
|
46
|
-
def get_value_from_pointer(pointer, offset)
|
47
|
-
from_native pointer.get_int32(offset), nil
|
48
|
-
end
|
49
|
-
|
50
|
-
def setup_and_call(method, arguments, &block)
|
51
|
-
result = setup_method method.to_s
|
52
|
-
|
53
|
-
unless result
|
54
|
-
raise "Unable to set up method #{method} in #{self}"
|
55
|
-
end
|
56
|
-
|
57
|
-
send method, *arguments, &block
|
58
|
-
end
|
59
|
-
|
60
|
-
def to_ffi_type
|
61
|
-
self
|
62
|
-
end
|
63
|
-
|
64
|
-
def setup_method(name)
|
65
|
-
gir_ffi_builder.setup_method name
|
66
|
-
end
|
67
28
|
end
|
68
29
|
end
|
data/lib/gir_ffi/in_pointer.rb
CHANGED
@@ -103,10 +103,10 @@ module GirFFI
|
|
103
103
|
def from_basic_type_array(type, ary)
|
104
104
|
ffi_type = TypeMap.type_specification_to_ffi_type type
|
105
105
|
type_size = FFI.type_size(ffi_type)
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
106
|
+
FFI::MemoryPointer.new(type_size * (ary.length + 1)).tap do |block|
|
107
|
+
block.autorelease = false
|
108
|
+
block.send "put_array_of_#{ffi_type}", 0, ary
|
109
|
+
end
|
110
110
|
end
|
111
111
|
end
|
112
112
|
end
|
@@ -55,10 +55,14 @@ module GirFFI
|
|
55
55
|
tag == :interface && interface.info_type
|
56
56
|
end
|
57
57
|
|
58
|
+
def hidden_struct_type?
|
59
|
+
flattened_tag == :struct && interface.size.zero?
|
60
|
+
end
|
61
|
+
|
58
62
|
def tag_or_class
|
59
63
|
base = case tag
|
60
64
|
when :interface
|
61
|
-
|
65
|
+
interface_class
|
62
66
|
when :ghash
|
63
67
|
[tag, *element_type]
|
64
68
|
else
|
@@ -71,6 +75,10 @@ module GirFFI
|
|
71
75
|
end
|
72
76
|
end
|
73
77
|
|
78
|
+
def interface_class
|
79
|
+
Builder.build_class interface if tag == :interface
|
80
|
+
end
|
81
|
+
|
74
82
|
TAG_TO_WRAPPER_CLASS_MAP = {
|
75
83
|
array: 'GLib::Array',
|
76
84
|
byte_array: 'GLib::ByteArray',
|
@@ -88,11 +96,12 @@ module GirFFI
|
|
88
96
|
|
89
97
|
# TODO: Use class rather than class name
|
90
98
|
def argument_class_name
|
91
|
-
|
92
|
-
interface.full_type_name
|
93
|
-
else
|
99
|
+
interface_class_name ||
|
94
100
|
TAG_TO_WRAPPER_CLASS_MAP[flattened_tag]
|
95
|
-
|
101
|
+
end
|
102
|
+
|
103
|
+
def interface_class_name
|
104
|
+
interface.full_type_name if tag == :interface
|
96
105
|
end
|
97
106
|
|
98
107
|
def to_ffi_type
|
data/lib/gir_ffi/module_base.rb
CHANGED
data/lib/gir_ffi/sized_array.rb
CHANGED
@@ -16,7 +16,7 @@ module GirFFI
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def index(idx)
|
19
|
-
ptr =
|
19
|
+
ptr = InOutPointer.new element_type, @pointer + idx * element_size
|
20
20
|
ptr.to_ruby_value
|
21
21
|
end
|
22
22
|
|
@@ -27,7 +27,7 @@ module GirFFI
|
|
27
27
|
end
|
28
28
|
|
29
29
|
def ==(other)
|
30
|
-
to_a
|
30
|
+
to_a.eql? other.to_a
|
31
31
|
end
|
32
32
|
|
33
33
|
def size_in_bytes
|
@@ -40,7 +40,7 @@ module GirFFI
|
|
40
40
|
|
41
41
|
def self.copy_value_to_pointer(value, pointer)
|
42
42
|
size = value.size_in_bytes
|
43
|
-
pointer.put_bytes(0, value.to_ptr.read_bytes(size)
|
43
|
+
pointer.put_bytes(0, value.to_ptr.read_bytes(size))
|
44
44
|
end
|
45
45
|
|
46
46
|
def self.wrap(element_type, size, pointer)
|
@@ -50,7 +50,7 @@ module GirFFI
|
|
50
50
|
private
|
51
51
|
|
52
52
|
def element_ffi_type
|
53
|
-
@element_ffi_type ||=
|
53
|
+
@element_ffi_type ||= TypeMap.type_specification_to_ffi_type element_type
|
54
54
|
end
|
55
55
|
|
56
56
|
def element_size
|
@@ -101,12 +101,12 @@ module GirFFI
|
|
101
101
|
def from_enumerable(element_type, expected_size, arr)
|
102
102
|
size = arr.size
|
103
103
|
check_size expected_size, size
|
104
|
-
ptr =
|
104
|
+
ptr = InPointer.from_array element_type, arr
|
105
105
|
wrap element_type, size, ptr
|
106
106
|
end
|
107
107
|
|
108
108
|
def check_size(expected_size, size)
|
109
|
-
if expected_size
|
109
|
+
if expected_size != -1 && size != expected_size
|
110
110
|
raise ArgumentError, "Expected size #{expected_size}, got #{size}"
|
111
111
|
end
|
112
112
|
end
|
data/lib/gir_ffi/struct_base.rb
CHANGED
@@ -5,17 +5,12 @@ module GirFFI
|
|
5
5
|
# Base class for generated classes representing GLib structs.
|
6
6
|
class StructBase < ClassBase
|
7
7
|
extend FFI::DataConverter
|
8
|
-
|
8
|
+
include GirFFI::StructLikeBase
|
9
9
|
|
10
10
|
def initialize
|
11
11
|
@struct = self.class::Struct.new
|
12
12
|
@struct.owned = true
|
13
13
|
@struct.to_ptr.autorelease = false
|
14
14
|
end
|
15
|
-
|
16
|
-
# Wrap value and take ownership of it
|
17
|
-
def self.wrap_own(val)
|
18
|
-
own wrap(val)
|
19
|
-
end
|
20
15
|
end
|
21
16
|
end
|
@@ -3,62 +3,71 @@ module GirFFI
|
|
3
3
|
# Base module providing class methods for generated classes representing GLib
|
4
4
|
# structs, unions and boxed types.
|
5
5
|
module StructLikeBase
|
6
|
-
def
|
7
|
-
|
6
|
+
def self.included(base)
|
7
|
+
base.extend ClassMethods
|
8
8
|
end
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
# Class methods for struct-like classes.
|
11
|
+
module ClassMethods
|
12
|
+
def native_type
|
13
|
+
FFI::Type::Struct.new(self::Struct)
|
14
|
+
end
|
13
15
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
end
|
16
|
+
def to_ffi_type
|
17
|
+
self
|
18
|
+
end
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
# NOTE: Needed for JRuby's FFI
|
21
|
+
def to_native(value, _context)
|
22
|
+
value.struct
|
23
|
+
end
|
22
24
|
|
23
|
-
|
24
|
-
|
25
|
-
|
25
|
+
def get_value_from_pointer(pointer, offset)
|
26
|
+
pointer + offset
|
27
|
+
end
|
26
28
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
value.to_ptr.read_bytes(size)
|
31
|
-
else
|
32
|
-
"\x00" * size
|
33
|
-
end
|
34
|
-
pointer.put_bytes offset, bytes, 0, size
|
35
|
-
end
|
29
|
+
def size
|
30
|
+
self::Struct.size
|
31
|
+
end
|
36
32
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
33
|
+
def copy_value_to_pointer(value, pointer, offset = 0)
|
34
|
+
bytes = value.to_ptr.read_bytes(size)
|
35
|
+
pointer.put_bytes offset, bytes
|
36
|
+
end
|
41
37
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
38
|
+
# Create an unowned copy of the struct represented by val
|
39
|
+
def copy_from(val)
|
40
|
+
disown copy from(val)
|
41
|
+
end
|
46
42
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
43
|
+
# Wrap an owned copy of the struct represented by val
|
44
|
+
def wrap_copy(val)
|
45
|
+
own copy(val)
|
46
|
+
end
|
51
47
|
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
48
|
+
# Wrap value and take ownership of it
|
49
|
+
def wrap_own(val)
|
50
|
+
own wrap(val)
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def own(val)
|
56
|
+
val.struct.owned = true if val
|
57
|
+
val
|
58
|
+
end
|
59
|
+
|
60
|
+
def disown(val)
|
61
|
+
val.struct.owned = nil if val
|
62
|
+
val
|
63
|
+
end
|
56
64
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
65
|
+
# Create a copy of the struct represented by val
|
66
|
+
def copy(val)
|
67
|
+
return unless val
|
68
|
+
new.tap do |copy|
|
69
|
+
copy_value_to_pointer(val, copy.to_ptr)
|
70
|
+
end
|
62
71
|
end
|
63
72
|
end
|
64
73
|
end
|
data/lib/gir_ffi/type_map.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
+
require 'gir_ffi/boolean'
|
2
3
|
require 'gir_ffi/sized_array'
|
3
4
|
|
4
5
|
module GirFFI
|
@@ -14,25 +15,27 @@ module GirFFI
|
|
14
15
|
glist: :pointer,
|
15
16
|
gslist: :pointer,
|
16
17
|
strv: :pointer,
|
17
|
-
|
18
|
-
struct: :pointer,
|
18
|
+
interface: :pointer,
|
19
19
|
error: :pointer,
|
20
20
|
ptr_array: :pointer,
|
21
21
|
array: :pointer,
|
22
22
|
c: GirFFI::SizedArray,
|
23
23
|
utf8: :pointer,
|
24
24
|
GType: gsize_type,
|
25
|
-
gboolean:
|
25
|
+
gboolean: GirFFI::Boolean,
|
26
26
|
gunichar: :uint32,
|
27
27
|
gint8: :int8,
|
28
28
|
guint8: :uint8,
|
29
29
|
gint16: :int16,
|
30
30
|
guint16: :uint16,
|
31
31
|
gint: :int,
|
32
|
+
guint: :uint,
|
32
33
|
gint32: :int32,
|
33
34
|
guint32: :uint32,
|
34
35
|
gint64: :int64,
|
35
36
|
guint64: :uint64,
|
37
|
+
glong: :long,
|
38
|
+
gulong: :ulong,
|
36
39
|
gsize: gsize_type,
|
37
40
|
gfloat: :float,
|
38
41
|
gdouble: :double,
|
@@ -44,10 +47,6 @@ module GirFFI
|
|
44
47
|
TAG_TYPE_MAP[sym] || sym
|
45
48
|
end
|
46
49
|
|
47
|
-
def self.type_specification_to_ffitype(type)
|
48
|
-
type_specification_to_ffi_type type
|
49
|
-
end
|
50
|
-
|
51
50
|
def self.type_specification_to_ffi_type(type)
|
52
51
|
case type
|
53
52
|
when Module
|
data/lib/gir_ffi/union_base.rb
CHANGED
@@ -5,8 +5,7 @@ require 'gir_ffi/vfunc_implementation'
|
|
5
5
|
module GirFFI
|
6
6
|
# Represents a user defined type, conforming, as needed, to the interface of
|
7
7
|
# GObjectIntrospection::IObjectInfo.
|
8
|
-
|
9
|
-
class UserDefinedTypeInfo
|
8
|
+
class UserDefinedObjectInfo
|
10
9
|
attr_reader :properties, :vfunc_implementations
|
11
10
|
|
12
11
|
def initialize(klass)
|
@@ -1,7 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
module GirFFI
|
3
|
-
# Represents a property of a user defined type
|
4
|
-
# interface of GObjectIntrospection::IPropertyInfo.
|
3
|
+
# Represents a property of a user defined type.
|
5
4
|
class UserDefinedPropertyInfo
|
6
5
|
def initialize(param_spec)
|
7
6
|
@param_spec = param_spec
|
@@ -12,5 +11,84 @@ module GirFFI
|
|
12
11
|
def name
|
13
12
|
@param_spec.get_name
|
14
13
|
end
|
14
|
+
|
15
|
+
def accessor_name
|
16
|
+
@param_spec.accessor_name
|
17
|
+
end
|
18
|
+
|
19
|
+
def writable?
|
20
|
+
@param_spec.flags[:writable]
|
21
|
+
end
|
22
|
+
|
23
|
+
def value_type
|
24
|
+
@param_spec.value_type
|
25
|
+
end
|
26
|
+
|
27
|
+
# TODO: Unify with InfoExt::ITypeInfo.flattened_tag_to_gtype_map
|
28
|
+
G_TYPE_POINTER_MAP = {
|
29
|
+
GObject::TYPE_BOOLEAN => false,
|
30
|
+
GObject::TYPE_CHAR => false,
|
31
|
+
GObject::TYPE_UCHAR => false,
|
32
|
+
GObject::TYPE_FLOAT => false,
|
33
|
+
GObject::TYPE_DOUBLE => false,
|
34
|
+
GObject::TYPE_INT => false,
|
35
|
+
GObject::TYPE_UINT => false,
|
36
|
+
GObject::TYPE_LONG => false,
|
37
|
+
GObject::TYPE_ULONG => false,
|
38
|
+
GObject::TYPE_INT64 => false,
|
39
|
+
GObject::TYPE_UINT64 => false,
|
40
|
+
GObject::TYPE_ENUM => false,
|
41
|
+
GObject::TYPE_FLAGS => false,
|
42
|
+
GObject::TYPE_STRING => true,
|
43
|
+
GObject::TYPE_BOXED => true,
|
44
|
+
GObject::TYPE_OBJECT => true
|
45
|
+
}.freeze
|
46
|
+
|
47
|
+
def pointer_type?
|
48
|
+
G_TYPE_POINTER_MAP.fetch(fundamental_value_type)
|
49
|
+
end
|
50
|
+
|
51
|
+
# TODO: Unify with InfoExt::ITypeInfo.flattened_tag_to_gtype_map
|
52
|
+
G_TYPE_TAG_MAP = {
|
53
|
+
GObject::TYPE_BOOLEAN => :gboolean,
|
54
|
+
GObject::TYPE_CHAR => :gint8,
|
55
|
+
GObject::TYPE_UCHAR => :guint8,
|
56
|
+
GObject::TYPE_FLOAT => :gfloat,
|
57
|
+
GObject::TYPE_DOUBLE => :gdouble,
|
58
|
+
GObject::TYPE_INT => :gint,
|
59
|
+
GObject::TYPE_UINT => :guint,
|
60
|
+
GObject::TYPE_LONG => :glong,
|
61
|
+
GObject::TYPE_ULONG => :gulong,
|
62
|
+
GObject::TYPE_INT64 => :gint64,
|
63
|
+
GObject::TYPE_UINT64 => :guint64,
|
64
|
+
GObject::TYPE_ENUM => :interface,
|
65
|
+
GObject::TYPE_FLAGS => :interface,
|
66
|
+
GObject::TYPE_STRING => :utf8,
|
67
|
+
GObject::TYPE_BOXED => :interface,
|
68
|
+
GObject::TYPE_OBJECT => :interface
|
69
|
+
}.freeze
|
70
|
+
|
71
|
+
def type_tag
|
72
|
+
G_TYPE_TAG_MAP.fetch(fundamental_value_type)
|
73
|
+
end
|
74
|
+
|
75
|
+
G_TYPE_INTERFACE_TAG_MAP = {
|
76
|
+
GObject::TYPE_ENUM => :enum,
|
77
|
+
GObject::TYPE_FLAGS => :flags,
|
78
|
+
GObject::TYPE_BOXED => :struct,
|
79
|
+
GObject::TYPE_OBJECT => :object
|
80
|
+
}.freeze
|
81
|
+
|
82
|
+
def interface_type_tag
|
83
|
+
G_TYPE_INTERFACE_TAG_MAP.fetch(fundamental_value_type)
|
84
|
+
end
|
85
|
+
|
86
|
+
def fundamental_value_type
|
87
|
+
@fundamental_value_type ||= GObject.type_fundamental value_type
|
88
|
+
end
|
89
|
+
|
90
|
+
def ffi_type
|
91
|
+
GirFFI::TypeMap.map_basic_type(type_tag)
|
92
|
+
end
|
15
93
|
end
|
16
94
|
end
|
data/lib/gir_ffi/version.rb
CHANGED