ffi 1.16.2-x86-mingw32 → 1.17.0.rc1-x86-mingw32
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +36 -0
- data/Gemfile +9 -2
- data/README.md +2 -2
- data/Rakefile +17 -5
- data/lib/2.5/ffi_c.so +0 -0
- data/lib/2.6/ffi_c.so +0 -0
- data/lib/2.7/ffi_c.so +0 -0
- data/lib/3.0/ffi_c.so +0 -0
- data/lib/3.1/ffi_c.so +0 -0
- data/lib/3.2/ffi_c.so +0 -0
- data/lib/3.3/ffi_c.so +0 -0
- data/lib/ffi/dynamic_library.rb +34 -5
- data/lib/ffi/enum.rb +0 -1
- data/lib/ffi/function.rb +1 -1
- data/lib/ffi/io.rb +2 -2
- data/lib/ffi/library.rb +23 -23
- data/lib/ffi/platform/aarch64-linux/types.conf +74 -3
- data/lib/ffi/pointer.rb +6 -6
- data/lib/ffi/struct.rb +4 -4
- data/lib/ffi/struct_layout.rb +2 -2
- data/lib/ffi/struct_layout_builder.rb +8 -8
- data/lib/ffi/types.rb +51 -48
- data/lib/ffi/version.rb +1 -1
- data/samples/hello_ractor.rb +11 -0
- data/samples/qsort_ractor.rb +28 -0
- data/sig/ffi/abstract_memory.rbs +164 -0
- data/sig/ffi/auto_pointer.rbs +27 -0
- data/sig/ffi/buffer.rbs +18 -0
- data/sig/ffi/data_converter.rbs +10 -0
- data/sig/ffi/dynamic_library.rbs +9 -0
- data/sig/ffi/enum.rbs +38 -0
- data/sig/ffi/function.rbs +39 -0
- data/sig/ffi/library.rbs +42 -0
- data/sig/ffi/native_type.rbs +86 -0
- data/sig/ffi/pointer.rbs +42 -0
- data/sig/ffi/struct.rbs +76 -0
- data/sig/ffi/struct_by_reference.rbs +11 -0
- data/sig/ffi/struct_by_value.rbs +7 -0
- data/sig/ffi/struct_layout.rbs +9 -0
- data/sig/ffi/struct_layout_builder.rbs +5 -0
- data/sig/ffi/type.rbs +39 -0
- data/sig/ffi.rbs +26 -0
- metadata +25 -5
data/lib/ffi/types.rb
CHANGED
@@ -33,7 +33,8 @@
|
|
33
33
|
# see {file:README}
|
34
34
|
module FFI
|
35
35
|
|
36
|
-
|
36
|
+
# Unless custom_typedefs already defined in the C-ext?
|
37
|
+
unless defined?(custom_typedefs)
|
37
38
|
# Truffleruby and JRuby don't support Ractor so far.
|
38
39
|
# So they don't need separation between builtin and custom types.
|
39
40
|
def self.custom_typedefs
|
@@ -42,54 +43,63 @@ module FFI
|
|
42
43
|
writable_typemap = true
|
43
44
|
end
|
44
45
|
|
45
|
-
# @param [Type, DataConverter, Symbol] old type definition used by {FFI.find_type}
|
46
|
-
# @param [Symbol] add new type definition's name to add
|
47
|
-
# @return [Type]
|
48
|
-
# Add a definition type to type definitions.
|
49
|
-
#
|
50
|
-
# The type definition is local per Ractor.
|
51
|
-
def self.typedef(old, add)
|
52
|
-
tm = custom_typedefs
|
53
|
-
tm[add] = self.find_type(old)
|
54
|
-
end
|
55
|
-
|
56
|
-
# (see FFI.typedef)
|
57
|
-
def self.add_typedef(old, add)
|
58
|
-
typedef old, add
|
59
|
-
end
|
60
|
-
|
61
46
|
class << self
|
62
|
-
private def __typedef(old, add)
|
63
|
-
TypeDefs[add] = self.find_type(old)
|
64
|
-
end
|
65
47
|
|
66
48
|
private :custom_typedefs
|
67
|
-
end
|
68
49
|
|
50
|
+
# @param [Type, DataConverter, Symbol] old type definition used by {FFI.find_type}
|
51
|
+
# @param [Symbol] add new type definition's name to add
|
52
|
+
# @return [Type]
|
53
|
+
# Add a definition type to type definitions.
|
54
|
+
#
|
55
|
+
# The type definition is local per Ractor.
|
56
|
+
def typedef(old, add)
|
57
|
+
tm = custom_typedefs
|
58
|
+
tm[add] = find_type(old)
|
59
|
+
end
|
69
60
|
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
# a type objet, a type name (symbol). If +name+ is a {DataConverter},
|
75
|
-
# a new {Type::Mapped} is created.
|
76
|
-
def self.find_type(name, type_map = nil)
|
77
|
-
if name.is_a?(Type)
|
78
|
-
name
|
79
|
-
|
80
|
-
elsif type_map&.has_key?(name)
|
81
|
-
type_map[name]
|
61
|
+
# (see FFI.typedef)
|
62
|
+
def add_typedef(old, add)
|
63
|
+
typedef old, add
|
64
|
+
end
|
82
65
|
|
83
|
-
|
84
|
-
|
66
|
+
private def __typedef(old, add)
|
67
|
+
TypeDefs[add] = find_type(old, TypeDefs)
|
68
|
+
end
|
85
69
|
|
86
|
-
|
87
|
-
|
70
|
+
# @param [Type, DataConverter, Symbol] name
|
71
|
+
# @param [Hash] type_map if nil, {FFI::TypeDefs} is used
|
72
|
+
# @return [Type]
|
73
|
+
# Find a type in +type_map+ ({FFI::TypeDefs}, by default) from
|
74
|
+
# a type objet, a type name (symbol). If +name+ is a {DataConverter},
|
75
|
+
# a new {Type::Mapped} is created.
|
76
|
+
def find_type(name, type_map = nil)
|
77
|
+
if name.is_a?(Type)
|
78
|
+
name
|
79
|
+
|
80
|
+
elsif type_map&.has_key?(name)
|
81
|
+
type_map[name]
|
82
|
+
|
83
|
+
elsif (tm=custom_typedefs).has_key?(name)
|
84
|
+
tm[name]
|
85
|
+
|
86
|
+
elsif TypeDefs.has_key?(name)
|
87
|
+
TypeDefs[name]
|
88
|
+
|
89
|
+
elsif name.is_a?(DataConverter)
|
90
|
+
# Add a typedef so next time the converter is used, it hits the cache
|
91
|
+
tm = (type_map || custom_typedefs)
|
92
|
+
tm[name] = Type::Mapped.new(name)
|
93
|
+
else
|
94
|
+
raise TypeError, "unable to resolve type '#{name}'"
|
95
|
+
end
|
96
|
+
end
|
88
97
|
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
98
|
+
# @param type +type+ is an instance of class accepted by {FFI.find_type}
|
99
|
+
# @return [Integer]
|
100
|
+
# Get +type+ size, in bytes.
|
101
|
+
def type_size(type)
|
102
|
+
find_type(type).size
|
93
103
|
end
|
94
104
|
end
|
95
105
|
|
@@ -193,13 +203,6 @@ module FFI
|
|
193
203
|
|
194
204
|
__typedef(StrPtrConverter, :strptr)
|
195
205
|
|
196
|
-
# @param type +type+ is an instance of class accepted by {FFI.find_type}
|
197
|
-
# @return [Numeric]
|
198
|
-
# Get +type+ size, in bytes.
|
199
|
-
def self.type_size(type)
|
200
|
-
find_type(type).size
|
201
|
-
end
|
202
|
-
|
203
206
|
# Load all the platform dependent types
|
204
207
|
begin
|
205
208
|
File.open(File.join(Platform::CONF_DIR, 'types.conf'), "r") do |f|
|
data/lib/ffi/version.rb
CHANGED
@@ -0,0 +1,28 @@
|
|
1
|
+
require 'ffi'
|
2
|
+
|
3
|
+
module LibC
|
4
|
+
extend FFI::Library
|
5
|
+
ffi_lib FFI::Library::LIBC
|
6
|
+
callback :qsort_cmp, [ :pointer, :pointer ], :int
|
7
|
+
attach_function :qsort, [ :pointer, :ulong, :ulong, :qsort_cmp ], :int
|
8
|
+
|
9
|
+
freeze # Freeze the module variables, so that it can be shared across ractors.
|
10
|
+
end
|
11
|
+
|
12
|
+
p = FFI::MemoryPointer.new(:int, 3)
|
13
|
+
p.put_array_of_int32(0, [ 2, 3, 1 ]) # Write some unsorted data into the memory
|
14
|
+
# Ractor.make_shareable(p) # freeze the pointer to be shared between ractors instead of copied
|
15
|
+
puts "main -ptr=#{p.inspect}"
|
16
|
+
res = Ractor.new(p) do |p|
|
17
|
+
puts "ractor-ptr=#{p.inspect}"
|
18
|
+
puts "Before qsort #{p.get_array_of_int32(0, 3).join(', ')}"
|
19
|
+
LibC.qsort(p, 3, 4) do |p1, p2|
|
20
|
+
i1 = p1.get_int32(0)
|
21
|
+
i2 = p2.get_int32(0)
|
22
|
+
puts "In block: comparing #{i1} and #{i2}"
|
23
|
+
i1 < i2 ? -1 : i1 > i2 ? 1 : 0
|
24
|
+
end
|
25
|
+
puts "After qsort #{p.get_array_of_int32(0, 3).join(', ')}"
|
26
|
+
end.take
|
27
|
+
|
28
|
+
puts "After ractor termination #{p.get_array_of_int32(0, 3).join(', ')}"
|
@@ -0,0 +1,164 @@
|
|
1
|
+
module FFI
|
2
|
+
class AbstractMemory
|
3
|
+
interface _Size
|
4
|
+
def size: () -> Integer
|
5
|
+
end
|
6
|
+
include _Size
|
7
|
+
type type_size = Integer | _Size | Symbol
|
8
|
+
|
9
|
+
type order_out = :big | :little
|
10
|
+
type order_in = order_out | :network
|
11
|
+
|
12
|
+
def []: (Integer idx) -> instance
|
13
|
+
def clear: () -> self
|
14
|
+
def freeze: ...
|
15
|
+
def get: (ffi_type type, Integer offset) -> top
|
16
|
+
def put: (ffi_type type, Integer offset, top value) -> nil
|
17
|
+
def size_limit?: () -> bool
|
18
|
+
def type_size: () -> Integer
|
19
|
+
alias total size
|
20
|
+
|
21
|
+
def get_int8: (Integer offset) -> Integer
|
22
|
+
def get_int16: (Integer offset) -> Integer
|
23
|
+
def get_int32: (Integer offset) -> Integer
|
24
|
+
def get_int64: (Integer offset) -> Integer
|
25
|
+
def get_uint8: (Integer offset) -> Integer
|
26
|
+
def get_uint16: (Integer offset) -> Integer
|
27
|
+
def get_uint32: (Integer offset) -> Integer
|
28
|
+
def get_uint64: (Integer offset) -> Integer
|
29
|
+
def get_char: (Integer offset) -> Integer
|
30
|
+
def get_short: (Integer offset) -> Integer
|
31
|
+
def get_int: (Integer offset) -> Integer
|
32
|
+
def get_long_long: (Integer offset) -> Integer
|
33
|
+
def get_float32: (Integer offset) -> Float
|
34
|
+
def get_float64: (Integer offset) -> Float
|
35
|
+
def get_pointer: (Integer offset) -> Pointer
|
36
|
+
def get_bytes: (Integer offset, Integer length) -> String
|
37
|
+
def get_string: (Integer offset, ?Integer? length) -> String
|
38
|
+
alias get_float get_float32
|
39
|
+
alias get_double get_float64
|
40
|
+
|
41
|
+
def put_int8: (Integer offset, int value) -> self
|
42
|
+
def put_int16: (Integer offset, int value) -> self
|
43
|
+
def put_int32: (Integer offset, int value) -> self
|
44
|
+
def put_int64: (Integer offset, int value) -> self
|
45
|
+
def put_uint8: (Integer offset, int value) -> self
|
46
|
+
def put_uint16: (Integer offset, int value) -> self
|
47
|
+
def put_uint32: (Integer offset, int value) -> self
|
48
|
+
def put_uint64: (Integer offset, int value) -> self
|
49
|
+
def put_char: (Integer offset, int value) -> self
|
50
|
+
def put_short: (Integer offset, int value) -> self
|
51
|
+
def put_int: (Integer offset, int value) -> self
|
52
|
+
def put_long_long: (Integer offset, int value) -> self
|
53
|
+
def put_float32: (Integer offset, Numeric value) -> self
|
54
|
+
def put_float64: (Integer offset, Numeric value) -> self
|
55
|
+
def put_pointer: (Integer offset, pointer value) -> self
|
56
|
+
def put_bytes: (Integer offset, String str, ?Integer index, ?Integer? length) -> self
|
57
|
+
def put_string: (Integer offset, String value) -> self
|
58
|
+
alias put_float put_float32
|
59
|
+
alias put_double put_float64
|
60
|
+
|
61
|
+
def read_int8: () -> Integer
|
62
|
+
def read_int16: () -> Integer
|
63
|
+
def read_int32: () -> Integer
|
64
|
+
def read_int64: () -> Integer
|
65
|
+
def read_uint8: () -> Integer
|
66
|
+
def read_uint16: () -> Integer
|
67
|
+
def read_uint32: () -> Integer
|
68
|
+
def read_uint64: () -> Integer
|
69
|
+
def read_char: () -> Integer
|
70
|
+
def read_short: () -> Integer
|
71
|
+
def read_int: () -> Integer
|
72
|
+
def read_long_long: () -> Integer
|
73
|
+
def read_float: () -> Float
|
74
|
+
def read_double: () -> Float
|
75
|
+
def read_pointer: () -> Pointer
|
76
|
+
def read_bytes: (Integer length) -> String
|
77
|
+
|
78
|
+
def write_int8: (int value) -> self
|
79
|
+
def write_int16: (int value) -> self
|
80
|
+
def write_int32: (int value) -> self
|
81
|
+
def write_int64: (int value) -> self
|
82
|
+
def write_uint8: (int value) -> self
|
83
|
+
def write_uint16: (int value) -> self
|
84
|
+
def write_uint32: (int value) -> self
|
85
|
+
def write_uint64: (int value) -> self
|
86
|
+
def write_char: (int value) -> self
|
87
|
+
def write_short: (int value) -> self
|
88
|
+
def write_int: (int value) -> self
|
89
|
+
def write_long_long: (int value) -> self
|
90
|
+
def write_float: (Numeric value) -> self
|
91
|
+
def write_double: (Numeric value) -> self
|
92
|
+
def write_pointer: (pointer value) -> self
|
93
|
+
def write_bytes: (String str, ?Integer index, ?Integer? length) -> self
|
94
|
+
|
95
|
+
def get_array_of_int8: (Integer offset, Integer length) -> Array[Integer]
|
96
|
+
def get_array_of_int16: (Integer offset, Integer length) -> Array[Integer]
|
97
|
+
def get_array_of_int32: (Integer offset, Integer length) -> Array[Integer]
|
98
|
+
def get_array_of_int64: (Integer offset, Integer length) -> Array[Integer]
|
99
|
+
def get_array_of_uint8: (Integer offset, Integer length) -> Array[Integer]
|
100
|
+
def get_array_of_uint16: (Integer offset, Integer length) -> Array[Integer]
|
101
|
+
def get_array_of_uint32: (Integer offset, Integer length) -> Array[Integer]
|
102
|
+
def get_array_of_uint64: (Integer offset, Integer length) -> Array[Integer]
|
103
|
+
def get_array_of_char: (Integer offset, Integer length) -> Array[Integer]
|
104
|
+
def get_array_of_short: (Integer offset, Integer length) -> Array[Integer]
|
105
|
+
def get_array_of_int: (Integer offset, Integer length) -> Array[Integer]
|
106
|
+
def get_array_of_long_long: (Integer offset, Integer length) -> Array[Integer]
|
107
|
+
def get_array_of_float32: (Integer offset, Integer length) -> Array[Float]
|
108
|
+
def get_array_of_float64: (Integer offset, Integer length) -> Array[Float]
|
109
|
+
def get_array_of_pointer: (Integer offset, Integer length) -> Array[Pointer]
|
110
|
+
def get_array_of_string: (Integer offset, ?Integer? count) -> Array[String?]
|
111
|
+
alias get_array_of_float get_array_of_float32
|
112
|
+
alias get_array_of_double get_array_of_float64
|
113
|
+
|
114
|
+
def put_array_of_int8: (Integer offset, Array[int] ary) -> self
|
115
|
+
def put_array_of_int16: (Integer offset, Array[int] ary) -> self
|
116
|
+
def put_array_of_int32: (Integer offset, Array[int] ary) -> self
|
117
|
+
def put_array_of_int64: (Integer offset, Array[int] ary) -> self
|
118
|
+
def put_array_of_uint8: (Integer offset, Array[int] ary) -> self
|
119
|
+
def put_array_of_uint16: (Integer offset, Array[int] ary) -> self
|
120
|
+
def put_array_of_uint32: (Integer offset, Array[int] ary) -> self
|
121
|
+
def put_array_of_uint64: (Integer offset, Array[int] ary) -> self
|
122
|
+
def put_array_of_char: (Integer offset, Array[int] ary) -> self
|
123
|
+
def put_array_of_short: (Integer offset, Array[int] ary) -> self
|
124
|
+
def put_array_of_int: (Integer offset, Array[int] ary) -> self
|
125
|
+
def put_array_of_long_long: (Integer offset, Array[int] ary) -> self
|
126
|
+
def put_array_of_float32: (Integer offset, Array[Numeric] ary) -> self
|
127
|
+
def put_array_of_float64: (Integer offset, Array[Numeric] ary) -> self
|
128
|
+
def put_array_of_pointer: (Integer offset, Array[pointer] ary) -> self
|
129
|
+
alias put_array_of_float put_array_of_float32
|
130
|
+
alias put_array_of_double put_array_of_float64
|
131
|
+
|
132
|
+
def read_array_of_int8: (Integer length) -> Array[Integer]
|
133
|
+
def read_array_of_int16: (Integer length) -> Array[Integer]
|
134
|
+
def read_array_of_int32: (Integer length) -> Array[Integer]
|
135
|
+
def read_array_of_int64: (Integer length) -> Array[Integer]
|
136
|
+
def read_array_of_uint8: (Integer length) -> Array[Integer]
|
137
|
+
def read_array_of_uint16: (Integer length) -> Array[Integer]
|
138
|
+
def read_array_of_uint32: (Integer length) -> Array[Integer]
|
139
|
+
def read_array_of_uint64: (Integer length) -> Array[Integer]
|
140
|
+
def read_array_of_char: (Integer length) -> Array[Integer]
|
141
|
+
def read_array_of_short: (Integer length) -> Array[Integer]
|
142
|
+
def read_array_of_int: (Integer length) -> Array[Integer]
|
143
|
+
def read_array_of_long_long: (Integer length) -> Array[Integer]
|
144
|
+
def read_array_of_float: (Integer length) -> Array[Float]
|
145
|
+
def read_array_of_double: (Integer length) -> Array[Float]
|
146
|
+
def read_array_of_pointer: (Integer length) -> Array[Pointer]
|
147
|
+
|
148
|
+
def write_array_of_int8: (Array[int] ary) -> self
|
149
|
+
def write_array_of_int16: (Array[int] ary) -> self
|
150
|
+
def write_array_of_int32: (Array[int] ary) -> self
|
151
|
+
def write_array_of_int64: (Array[int] ary) -> self
|
152
|
+
def write_array_of_uint8: (Array[int] ary) -> self
|
153
|
+
def write_array_of_uint16: (Array[int] ary) -> self
|
154
|
+
def write_array_of_uint32: (Array[int] ary) -> self
|
155
|
+
def write_array_of_uint64: (Array[int] ary) -> self
|
156
|
+
def write_array_of_char: (Array[int] ary) -> self
|
157
|
+
def write_array_of_short: (Array[int] ary) -> self
|
158
|
+
def write_array_of_int: (Array[int] ary) -> self
|
159
|
+
def write_array_of_long_long: (Array[int] ary) -> self
|
160
|
+
def write_array_of_float: (Array[Numeric] ary) -> self
|
161
|
+
def write_array_of_double: (Array[Numeric] ary) -> self
|
162
|
+
def write_array_of_pointer: (Array[pointer] ary) -> self
|
163
|
+
end
|
164
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module FFI
|
2
|
+
class AutoPointer < Pointer
|
3
|
+
class Releaser
|
4
|
+
attr_accessor autorelease: boolish
|
5
|
+
interface _Proc[P < Pointer]
|
6
|
+
def call: (P) -> void
|
7
|
+
end
|
8
|
+
def initialize: [P < Pointer] (P ptr, _Proc[P] proc) -> void
|
9
|
+
|
10
|
+
def call: (*untyped) -> void
|
11
|
+
def free: () -> nil
|
12
|
+
def release: (Pointer ptr) -> void
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize: (Pointer pointer, Method | ^(self) -> void | Releaser::_Proc[self] callable) -> self
|
16
|
+
# | (Pointer pointer) { (self) -> void } -> self # https://github.com/ffi/ffi/issues/1071
|
17
|
+
| (Pointer pointer) -> self # where class < `def self.release: (instance pointer) -> void`
|
18
|
+
|
19
|
+
extend DataConverter[Pointer, instance, nil]
|
20
|
+
def self.from_native: ...
|
21
|
+
def self.native_type: () -> Type::Builtin
|
22
|
+
|
23
|
+
def autorelease?: ...
|
24
|
+
def autorelease=: ...
|
25
|
+
def free: () -> nil
|
26
|
+
end
|
27
|
+
end
|
data/sig/ffi/buffer.rbs
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
module FFI
|
2
|
+
class Buffer < AbstractMemory
|
3
|
+
def initialize: (AbstractMemory::type_size, ?Integer count, boolish clear) -> self
|
4
|
+
alias self.alloc_inout self.new
|
5
|
+
alias self.new_inout self.alloc_inout
|
6
|
+
alias self.alloc_in self.alloc_inout
|
7
|
+
alias self.new_in self.alloc_in
|
8
|
+
alias self.alloc_out self.alloc_inout
|
9
|
+
alias self.new_out self.alloc_out
|
10
|
+
|
11
|
+
def +: (Integer) -> Buffer
|
12
|
+
def inspect: ...
|
13
|
+
def order: () -> AbstractMemory::order_out
|
14
|
+
| (AbstractMemory::order_in order) -> Buffer
|
15
|
+
| (untyped order) -> (self | Buffer)
|
16
|
+
def slice: (Integer offset, Integer length) -> Buffer
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
module FFI
|
2
|
+
interface _DataConverter[N, R, in C]
|
3
|
+
def from_native: (N value, C ctx) -> R
|
4
|
+
def native_type: (?ffi_auto_type? type) -> Type
|
5
|
+
def to_native: (R value, C ctx) -> N
|
6
|
+
end
|
7
|
+
module DataConverter[N, R, in C]
|
8
|
+
include _DataConverter[N, R, C]
|
9
|
+
end
|
10
|
+
end
|
data/sig/ffi/enum.rbs
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
module FFI
|
2
|
+
class Enums
|
3
|
+
def initialize: () -> void
|
4
|
+
|
5
|
+
def <<: (Enum enum) -> void
|
6
|
+
def __map_symbol: (Symbol symbol) -> Integer?
|
7
|
+
def find: (Symbol query) -> Enum
|
8
|
+
end
|
9
|
+
|
10
|
+
class Enum
|
11
|
+
include DataConverter[Integer, Symbol | Integer, untyped]
|
12
|
+
|
13
|
+
attr_reader native_type: Type
|
14
|
+
attr_reader tag: Symbol?
|
15
|
+
def initialize: (Enumerable[Symbol | Integer], ?Symbol? tag, *untyped) -> void
|
16
|
+
| (Type native_type, Enumerable[Symbol | Integer], ?Symbol? tag, *untyped) -> void
|
17
|
+
|
18
|
+
def []: (Symbol query) -> Integer?
|
19
|
+
| (Integer query) -> Symbol?
|
20
|
+
def symbol_map: () -> Hash[Symbol, Integer]
|
21
|
+
alias to_h symbol_map
|
22
|
+
alias to_hash symbol_map
|
23
|
+
def symbols: () -> Array[Symbol]
|
24
|
+
def to_native: (Symbol | int value, untyped ctx) -> Integer
|
25
|
+
end
|
26
|
+
|
27
|
+
class Bitmask < Enum
|
28
|
+
def initialize: ...
|
29
|
+
|
30
|
+
def []: (*Symbol query) -> Integer
|
31
|
+
| (Array[Symbol] query) -> Integer
|
32
|
+
| (*Integer query) -> Array[Symbol]
|
33
|
+
| (Array[Integer] query) -> Array[Symbol]
|
34
|
+
def from_native: (Integer, untyped ctx) -> Array[Symbol | Integer]
|
35
|
+
def to_native: (Array[Symbol | int] value, untyped ctx) -> Integer
|
36
|
+
| ...
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module FFI
|
2
|
+
interface _Function
|
3
|
+
# TODO: leads to a endless recursion when used with -rrbs/test/setup
|
4
|
+
# def attach: (Module mod, String name) -> self
|
5
|
+
def call: (*untyped args) -> untyped
|
6
|
+
def param_types: () -> Array[Type]
|
7
|
+
def return_type: () -> Type
|
8
|
+
end
|
9
|
+
|
10
|
+
class Function < Pointer
|
11
|
+
include _Function
|
12
|
+
# ?blocking: boolish?, ?convention: Library::convention?, ?enums: Enums?
|
13
|
+
def initialize:
|
14
|
+
(
|
15
|
+
ffi_type return_type, Array[ffi_type] param_types,
|
16
|
+
?Hash[Symbol, untyped] options
|
17
|
+
) { (*untyped) -> untyped } -> self
|
18
|
+
| (
|
19
|
+
ffi_type return_type, Array[ffi_type] param_types, Proc | Pointer proc,
|
20
|
+
?Hash[Symbol, untyped] options
|
21
|
+
) -> self
|
22
|
+
|
23
|
+
def autorelease?: ...
|
24
|
+
alias autorelease autorelease?
|
25
|
+
def autorelease=: ...
|
26
|
+
def free: () -> self
|
27
|
+
end
|
28
|
+
|
29
|
+
class VariadicInvoker
|
30
|
+
include _Function
|
31
|
+
def initialize:
|
32
|
+
(
|
33
|
+
Pointer function, Array[ffi_type] parameter_types, ffi_type return_type,
|
34
|
+
Hash[Symbol, untyped] options #TODO
|
35
|
+
) -> void
|
36
|
+
|
37
|
+
def invoke: (Array[Type] parameter_types, Array[untyped] parameter_values) -> untyped
|
38
|
+
end
|
39
|
+
end
|
data/sig/ffi/library.rbs
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
module FFI
|
2
|
+
module Library
|
3
|
+
type convention = :default | :stdcall
|
4
|
+
type ffi_lib_flag = :global | :local | :lazy | :now
|
5
|
+
type ffi_lib_type = ffi_auto_type | singleton(Struct)
|
6
|
+
|
7
|
+
CURRENT_PROCESS: current_process
|
8
|
+
LIBC: String
|
9
|
+
FlagsMap: Hash[ffi_lib_flag, Integer]
|
10
|
+
|
11
|
+
def self.extended: ...
|
12
|
+
|
13
|
+
def attach_function: ( _ToS func, Array[ffi_lib_type] args, ffi_lib_type? returns, ?blocking: boolish, ?convention: convention, ?enums: Enums, ?type_map: type_map) -> (Function | VariadicInvoker)
|
14
|
+
| (_ToS name, _ToS func, Array[ffi_lib_type] args, ?ffi_lib_type? returns, ?blocking: boolish, ?convention: convention, ?enums: Enums, ?type_map: type_map) -> (Function | VariadicInvoker)
|
15
|
+
def attach_variable: (?_ToS mname, _ToS cname, ffi_lib_type type) -> DynamicLibrary::Symbol
|
16
|
+
def attached_functions: () -> Hash[Symbol, Function | VariadicInvoker]
|
17
|
+
def attached_variables: () -> Hash[Symbol, Type | singleton(Struct)]
|
18
|
+
|
19
|
+
def bitmask: (?Type native_type, Symbol name, Array[Symbol | Integer] values) -> Bitmask
|
20
|
+
| (?Type native_type, *Symbol | Integer args) -> Bitmask
|
21
|
+
| (?Type native_type, Array[Symbol | Integer] values) -> Bitmask
|
22
|
+
def enum: (?Type native_type, Symbol name, Array[Symbol | Integer] values) -> Enum
|
23
|
+
| (?Type native_type, *Symbol | Integer args) -> Enum
|
24
|
+
| (?Type native_type, Array[Symbol | Integer] values) -> Enum
|
25
|
+
def enum_type: (Symbol name) -> Enum?
|
26
|
+
def enum_for: (Symbol name) -> Integer?
|
27
|
+
|
28
|
+
def callback: (?Symbol name, Array[ffi_lib_type] params, ffi_lib_type ret) -> CallbackInfo
|
29
|
+
def ffi_convention: (?convention? convention) -> convention
|
30
|
+
def ffi_lib: (*_ToS names) -> Array[DynamicLibrary]
|
31
|
+
def ffi_lib_flags: (*ffi_lib_flag flags) -> Integer
|
32
|
+
def ffi_libraries: () -> Array[DynamicLibrary]
|
33
|
+
def find_type: (ffi_lib_type t) -> Type
|
34
|
+
def freeze: () -> void
|
35
|
+
def function_names: (_ToS name, Array[Type | singleton(Struct)] arg_types) -> Array[String]
|
36
|
+
def typedef: [T < Type] (T old, Symbol | DataConverter add, ?untyped) -> T
|
37
|
+
| (Symbol old, Symbol add, ?untyped) -> (Type | Enum)
|
38
|
+
| [X < DataConverter[N, R, C], N, R, C] (X old, Symbol add, ?untyped) -> Type::Mapped[X, N, R, C]
|
39
|
+
| (:enum old, Array[Symbol | Integer] add, ?untyped) -> Enum
|
40
|
+
| (:enum old, Symbol | Type add, Array[Symbol | Integer] info) -> Enum
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module FFI
|
2
|
+
class Type
|
3
|
+
INT8: Builtin
|
4
|
+
SCHAR: Builtin
|
5
|
+
CHAR: Builtin
|
6
|
+
UINT8: Builtin
|
7
|
+
UCHAR: Builtin
|
8
|
+
INT16: Builtin
|
9
|
+
SHORT: Builtin
|
10
|
+
SSHORT: Builtin
|
11
|
+
UINT16: Builtin
|
12
|
+
USHORT: Builtin
|
13
|
+
INT32: Builtin
|
14
|
+
INT: Builtin
|
15
|
+
SINT: Builtin
|
16
|
+
UINT32: Builtin
|
17
|
+
UINT: Builtin
|
18
|
+
INT64: Builtin
|
19
|
+
LONG_LONG: Builtin
|
20
|
+
SLONG_LONG: Builtin
|
21
|
+
UINT64: Builtin
|
22
|
+
ULONG_LONG: Builtin
|
23
|
+
LONG: Builtin
|
24
|
+
SLONG: Builtin
|
25
|
+
ULONG: Builtin
|
26
|
+
FLOAT32: Builtin
|
27
|
+
FLOAT: Builtin
|
28
|
+
FLOAT64: Builtin
|
29
|
+
DOUBLE: Builtin
|
30
|
+
LONGDOUBLE: Builtin
|
31
|
+
POINTER: Builtin
|
32
|
+
BOOL: Builtin
|
33
|
+
STRING: Builtin
|
34
|
+
BUFFER_IN: Builtin
|
35
|
+
BUFFER_OUT: Builtin
|
36
|
+
BUFFER_INOUT: Builtin
|
37
|
+
VARARGS: Builtin
|
38
|
+
VOID: Builtin
|
39
|
+
end
|
40
|
+
|
41
|
+
module NativeType
|
42
|
+
INT8: Type::Builtin
|
43
|
+
UINT8: Type::Builtin
|
44
|
+
INT16: Type::Builtin
|
45
|
+
UINT16: Type::Builtin
|
46
|
+
INT32: Type::Builtin
|
47
|
+
UINT32: Type::Builtin
|
48
|
+
INT64: Type::Builtin
|
49
|
+
UINT64: Type::Builtin
|
50
|
+
LONG: Type::Builtin
|
51
|
+
ULONG: Type::Builtin
|
52
|
+
FLOAT32: Type::Builtin
|
53
|
+
FLOAT64: Type::Builtin
|
54
|
+
LONGDOUBLE: Type::Builtin
|
55
|
+
POINTER: Type::Builtin
|
56
|
+
BOOL: Type::Builtin
|
57
|
+
STRING: Type::Builtin
|
58
|
+
BUFFER_IN: Type::Builtin
|
59
|
+
BUFFER_OUT: Type::Builtin
|
60
|
+
BUFFER_INOUT: Type::Builtin
|
61
|
+
VARARGS: Type::Builtin
|
62
|
+
VOID: Type::Builtin
|
63
|
+
end
|
64
|
+
|
65
|
+
TYPE_INT8: Type::Builtin
|
66
|
+
TYPE_UINT8: Type::Builtin
|
67
|
+
TYPE_INT16: Type::Builtin
|
68
|
+
TYPE_UINT16: Type::Builtin
|
69
|
+
TYPE_INT32: Type::Builtin
|
70
|
+
TYPE_UINT32: Type::Builtin
|
71
|
+
TYPE_INT64: Type::Builtin
|
72
|
+
TYPE_UINT64: Type::Builtin
|
73
|
+
TYPE_LONG: Type::Builtin
|
74
|
+
TYPE_ULONG: Type::Builtin
|
75
|
+
TYPE_FLOAT32: Type::Builtin
|
76
|
+
TYPE_FLOAT64: Type::Builtin
|
77
|
+
TYPE_LONGDOUBLE: Type::Builtin
|
78
|
+
TYPE_POINTER: Type::Builtin
|
79
|
+
TYPE_BOOL: Type::Builtin
|
80
|
+
TYPE_STRING: Type::Builtin
|
81
|
+
TYPE_BUFFER_IN: Type::Builtin
|
82
|
+
TYPE_BUFFER_OUT: Type::Builtin
|
83
|
+
TYPE_BUFFER_INOUT: Type::Builtin
|
84
|
+
TYPE_VARARGS: Type::Builtin
|
85
|
+
TYPE_VOID: Type::Builtin
|
86
|
+
end
|
data/sig/ffi/pointer.rbs
ADDED
@@ -0,0 +1,42 @@
|
|
1
|
+
module FFI
|
2
|
+
type pointer = Pointer::_ToPtr? | Integer
|
3
|
+
class Pointer < AbstractMemory
|
4
|
+
interface _ToPtr
|
5
|
+
def to_ptr: () -> Pointer
|
6
|
+
end
|
7
|
+
include _ToPtr
|
8
|
+
|
9
|
+
SIZE: Integer
|
10
|
+
NULL: Pointer
|
11
|
+
def self.size: () -> Integer
|
12
|
+
|
13
|
+
def initialize: (?AbstractMemory::type_size type, (Pointer | Integer) address) -> void
|
14
|
+
def +: (Integer offset) -> Pointer
|
15
|
+
def ==: (Pointer? other) -> bool
|
16
|
+
def address: () -> Integer
|
17
|
+
alias to_i address
|
18
|
+
def autorelease?: () -> bool
|
19
|
+
def autorelease=: (boolish autorelease) -> boolish
|
20
|
+
def free: () -> self
|
21
|
+
def inspect: ...
|
22
|
+
def null?: () -> bool
|
23
|
+
def order: () -> AbstractMemory::order_out
|
24
|
+
| (AbstractMemory::order_in) -> Pointer
|
25
|
+
def read: (ffi_type type) -> top
|
26
|
+
def read_array_of_type: (ffi_auto_type type, Symbol reader, Integer length) -> Array[top]
|
27
|
+
def read_string: (?Integer? len) -> String
|
28
|
+
def read_string_length: (Integer len) -> String
|
29
|
+
def read_string_to_null: () -> String
|
30
|
+
def slice: (Integer offset, Integer length) -> Pointer
|
31
|
+
def type_size: () -> Integer
|
32
|
+
def write: (ffi_type type, top value) -> nil
|
33
|
+
def write_array_of_type: (ffi_auto_type type, Symbol writer, Array[top]) -> self
|
34
|
+
def write_string: (String str, ?Integer? len) -> self
|
35
|
+
def write_string_length: (String str, Integer len) -> self
|
36
|
+
end
|
37
|
+
|
38
|
+
class MemoryPointer < Pointer
|
39
|
+
def initialize: (AbstractMemory::type_size size, ?Integer count, ?boolish clear) -> self
|
40
|
+
def self.from_string: (String s) -> instance
|
41
|
+
end
|
42
|
+
end
|