ffi 1.16.3 → 1.17.1
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
- checksums.yaml.gz.sig +0 -0
- data/CHANGELOG.md +51 -0
- data/Gemfile +9 -2
- data/README.md +1 -1
- data/Rakefile +18 -6
- data/ext/ffi_c/AbstractMemory.c +39 -38
- data/ext/ffi_c/ArrayType.c +2 -2
- data/ext/ffi_c/Buffer.c +4 -4
- data/ext/ffi_c/Call.c +12 -6
- data/ext/ffi_c/Call.h +3 -2
- data/ext/ffi_c/DynamicLibrary.c +2 -2
- data/ext/ffi_c/Function.c +52 -34
- data/ext/ffi_c/FunctionInfo.c +1 -1
- data/ext/ffi_c/LastError.c +4 -4
- data/ext/ffi_c/MemoryPointer.c +2 -2
- data/ext/ffi_c/Pointer.c +14 -11
- data/ext/ffi_c/Struct.c +11 -4
- data/ext/ffi_c/StructLayout.c +13 -13
- data/ext/ffi_c/Type.c +17 -16
- data/ext/ffi_c/Types.c +7 -1
- data/ext/ffi_c/Types.h +0 -1
- data/ext/ffi_c/Variadic.c +6 -3
- data/ext/ffi_c/libffi/.allow-ai-service +0 -0
- data/ext/ffi_c/libffi/.github/workflows/build.yml +34 -15
- data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +2 -1
- data/ext/ffi_c/libffi/LICENSE +1 -1
- data/ext/ffi_c/libffi/README.md +10 -5
- data/ext/ffi_c/libffi/configure +1254 -940
- data/ext/ffi_c/libffi/configure.ac +2 -2
- data/ext/ffi_c/libffi/configure.host +1 -1
- data/ext/ffi_c/libffi/doc/libffi.texi +1 -1
- data/ext/ffi_c/libffi/doc/version.texi +4 -4
- data/ext/ffi_c/libffi/fficonfig.h.in +6 -6
- data/ext/ffi_c/libffi/include/ffi.h.in +2 -11
- data/ext/ffi_c/libffi/include/ffi_common.h +4 -2
- data/ext/ffi_c/libffi/libffi.map.in +5 -0
- data/ext/ffi_c/libffi/libtool-version +1 -1
- data/ext/ffi_c/libffi/ltmain.sh +8 -20
- data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +1 -1
- data/ext/ffi_c/libffi/src/aarch64/ffi.c +26 -13
- data/ext/ffi_c/libffi/src/aarch64/sysv.S +198 -46
- data/ext/ffi_c/libffi/src/closures.c +3 -3
- data/ext/ffi_c/libffi/src/debug.c +2 -2
- data/ext/ffi_c/libffi/src/dlmalloc.c +1 -1
- data/ext/ffi_c/libffi/src/loongarch64/ffi.c +3 -0
- data/ext/ffi_c/libffi/src/mips/ffi.c +12 -4
- data/ext/ffi_c/libffi/src/mips/n32.S +65 -14
- data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +36 -24
- data/ext/ffi_c/libffi/src/sparc/ffi64.c +7 -1
- data/ext/ffi_c/libffi/src/tramp.c +1 -1
- data/ext/ffi_c/libffi/src/types.c +4 -6
- data/ext/ffi_c/libffi/src/wasm32/ffi.c +13 -0
- data/ext/ffi_c/libffi/src/x86/ffiw64.c +1 -1
- data/ext/ffi_c/libffi/testsuite/Makefile.am +79 -127
- data/ext/ffi_c/libffi/testsuite/Makefile.in +79 -127
- data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +6 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback.c +99 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback2.c +108 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback3.c +114 -0
- data/ext/ffi_c/libffi/testsuite/libffi.call/callback4.c +119 -0
- data/ext/ffi_c/libffi.darwin.mk +2 -2
- data/lib/ffi/autopointer.rb +1 -9
- data/lib/ffi/dynamic_library.rb +34 -5
- data/lib/ffi/enum.rb +0 -1
- data/lib/ffi/ffi.rb +59 -0
- 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 -49
- data/lib/ffi/version.rb +1 -1
- data/sig/ffi/abstract_memory.rbs +165 -0
- data/sig/ffi/auto_pointer.rbs +26 -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
- data.tar.gz.sig +0 -0
- metadata +37 -18
- metadata.gz.sig +0 -0
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,55 +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
|
-
|
93
|
-
|
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
|
94
103
|
end
|
95
104
|
end
|
96
105
|
|
@@ -194,13 +203,6 @@ module FFI
|
|
194
203
|
|
195
204
|
__typedef(StrPtrConverter, :strptr)
|
196
205
|
|
197
|
-
# @param type +type+ is an instance of class accepted by {FFI.find_type}
|
198
|
-
# @return [Numeric]
|
199
|
-
# Get +type+ size, in bytes.
|
200
|
-
def self.type_size(type)
|
201
|
-
find_type(type).size
|
202
|
-
end
|
203
|
-
|
204
206
|
# Load all the platform dependent types
|
205
207
|
begin
|
206
208
|
File.open(File.join(Platform::CONF_DIR, 'types.conf'), "r") do |f|
|
data/lib/ffi/version.rb
CHANGED
@@ -0,0 +1,165 @@
|
|
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
|
+
def read_array_of_string: (?Integer? count) -> Array[String?]
|
148
|
+
|
149
|
+
def write_array_of_int8: (Array[int] ary) -> self
|
150
|
+
def write_array_of_int16: (Array[int] ary) -> self
|
151
|
+
def write_array_of_int32: (Array[int] ary) -> self
|
152
|
+
def write_array_of_int64: (Array[int] ary) -> self
|
153
|
+
def write_array_of_uint8: (Array[int] ary) -> self
|
154
|
+
def write_array_of_uint16: (Array[int] ary) -> self
|
155
|
+
def write_array_of_uint32: (Array[int] ary) -> self
|
156
|
+
def write_array_of_uint64: (Array[int] ary) -> self
|
157
|
+
def write_array_of_char: (Array[int] ary) -> self
|
158
|
+
def write_array_of_short: (Array[int] ary) -> self
|
159
|
+
def write_array_of_int: (Array[int] ary) -> self
|
160
|
+
def write_array_of_long_long: (Array[int] ary) -> self
|
161
|
+
def write_array_of_float: (Array[Numeric] ary) -> self
|
162
|
+
def write_array_of_double: (Array[Numeric] ary) -> self
|
163
|
+
def write_array_of_pointer: (Array[pointer] ary) -> self
|
164
|
+
end
|
165
|
+
end
|
@@ -0,0 +1,26 @@
|
|
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 # where class < `def self.release: (instance pointer) -> void`
|
17
|
+
|
18
|
+
extend DataConverter[Pointer, instance, nil]
|
19
|
+
def self.from_native: ...
|
20
|
+
def self.native_type: () -> Type::Builtin
|
21
|
+
|
22
|
+
def autorelease?: ...
|
23
|
+
def autorelease=: ...
|
24
|
+
def free: () -> nil
|
25
|
+
end
|
26
|
+
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, N, R, C] (T old, Symbol | DataConverter[N, R, C] 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
|