gir_ffi 0.10.2 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- 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