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.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +51 -0
  4. data/Gemfile +9 -2
  5. data/README.md +1 -1
  6. data/Rakefile +18 -6
  7. data/ext/ffi_c/AbstractMemory.c +39 -38
  8. data/ext/ffi_c/ArrayType.c +2 -2
  9. data/ext/ffi_c/Buffer.c +4 -4
  10. data/ext/ffi_c/Call.c +12 -6
  11. data/ext/ffi_c/Call.h +3 -2
  12. data/ext/ffi_c/DynamicLibrary.c +2 -2
  13. data/ext/ffi_c/Function.c +52 -34
  14. data/ext/ffi_c/FunctionInfo.c +1 -1
  15. data/ext/ffi_c/LastError.c +4 -4
  16. data/ext/ffi_c/MemoryPointer.c +2 -2
  17. data/ext/ffi_c/Pointer.c +14 -11
  18. data/ext/ffi_c/Struct.c +11 -4
  19. data/ext/ffi_c/StructLayout.c +13 -13
  20. data/ext/ffi_c/Type.c +17 -16
  21. data/ext/ffi_c/Types.c +7 -1
  22. data/ext/ffi_c/Types.h +0 -1
  23. data/ext/ffi_c/Variadic.c +6 -3
  24. data/ext/ffi_c/libffi/.allow-ai-service +0 -0
  25. data/ext/ffi_c/libffi/.github/workflows/build.yml +34 -15
  26. data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +2 -1
  27. data/ext/ffi_c/libffi/LICENSE +1 -1
  28. data/ext/ffi_c/libffi/README.md +10 -5
  29. data/ext/ffi_c/libffi/configure +1254 -940
  30. data/ext/ffi_c/libffi/configure.ac +2 -2
  31. data/ext/ffi_c/libffi/configure.host +1 -1
  32. data/ext/ffi_c/libffi/doc/libffi.texi +1 -1
  33. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  34. data/ext/ffi_c/libffi/fficonfig.h.in +6 -6
  35. data/ext/ffi_c/libffi/include/ffi.h.in +2 -11
  36. data/ext/ffi_c/libffi/include/ffi_common.h +4 -2
  37. data/ext/ffi_c/libffi/libffi.map.in +5 -0
  38. data/ext/ffi_c/libffi/libtool-version +1 -1
  39. data/ext/ffi_c/libffi/ltmain.sh +8 -20
  40. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +1 -1
  41. data/ext/ffi_c/libffi/src/aarch64/ffi.c +26 -13
  42. data/ext/ffi_c/libffi/src/aarch64/sysv.S +198 -46
  43. data/ext/ffi_c/libffi/src/closures.c +3 -3
  44. data/ext/ffi_c/libffi/src/debug.c +2 -2
  45. data/ext/ffi_c/libffi/src/dlmalloc.c +1 -1
  46. data/ext/ffi_c/libffi/src/loongarch64/ffi.c +3 -0
  47. data/ext/ffi_c/libffi/src/mips/ffi.c +12 -4
  48. data/ext/ffi_c/libffi/src/mips/n32.S +65 -14
  49. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +36 -24
  50. data/ext/ffi_c/libffi/src/sparc/ffi64.c +7 -1
  51. data/ext/ffi_c/libffi/src/tramp.c +1 -1
  52. data/ext/ffi_c/libffi/src/types.c +4 -6
  53. data/ext/ffi_c/libffi/src/wasm32/ffi.c +13 -0
  54. data/ext/ffi_c/libffi/src/x86/ffiw64.c +1 -1
  55. data/ext/ffi_c/libffi/testsuite/Makefile.am +79 -127
  56. data/ext/ffi_c/libffi/testsuite/Makefile.in +79 -127
  57. data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +6 -0
  58. data/ext/ffi_c/libffi/testsuite/libffi.call/callback.c +99 -0
  59. data/ext/ffi_c/libffi/testsuite/libffi.call/callback2.c +108 -0
  60. data/ext/ffi_c/libffi/testsuite/libffi.call/callback3.c +114 -0
  61. data/ext/ffi_c/libffi/testsuite/libffi.call/callback4.c +119 -0
  62. data/ext/ffi_c/libffi.darwin.mk +2 -2
  63. data/lib/ffi/autopointer.rb +1 -9
  64. data/lib/ffi/dynamic_library.rb +34 -5
  65. data/lib/ffi/enum.rb +0 -1
  66. data/lib/ffi/ffi.rb +59 -0
  67. data/lib/ffi/function.rb +1 -1
  68. data/lib/ffi/io.rb +2 -2
  69. data/lib/ffi/library.rb +23 -23
  70. data/lib/ffi/platform/aarch64-linux/types.conf +74 -3
  71. data/lib/ffi/pointer.rb +6 -6
  72. data/lib/ffi/struct.rb +4 -4
  73. data/lib/ffi/struct_layout.rb +2 -2
  74. data/lib/ffi/struct_layout_builder.rb +8 -8
  75. data/lib/ffi/types.rb +51 -49
  76. data/lib/ffi/version.rb +1 -1
  77. data/sig/ffi/abstract_memory.rbs +165 -0
  78. data/sig/ffi/auto_pointer.rbs +26 -0
  79. data/sig/ffi/buffer.rbs +18 -0
  80. data/sig/ffi/data_converter.rbs +10 -0
  81. data/sig/ffi/dynamic_library.rbs +9 -0
  82. data/sig/ffi/enum.rbs +38 -0
  83. data/sig/ffi/function.rbs +39 -0
  84. data/sig/ffi/library.rbs +42 -0
  85. data/sig/ffi/native_type.rbs +86 -0
  86. data/sig/ffi/pointer.rbs +42 -0
  87. data/sig/ffi/struct.rbs +76 -0
  88. data/sig/ffi/struct_by_reference.rbs +11 -0
  89. data/sig/ffi/struct_by_value.rbs +7 -0
  90. data/sig/ffi/struct_layout.rbs +9 -0
  91. data/sig/ffi/struct_layout_builder.rbs +5 -0
  92. data/sig/ffi/type.rbs +39 -0
  93. data/sig/ffi.rbs +26 -0
  94. data.tar.gz.sig +0 -0
  95. metadata +37 -18
  96. 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
- unless defined?(self.custom_typedefs)
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
- # @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 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
- elsif (tm=custom_typedefs).has_key?(name)
84
- tm[name]
66
+ private def __typedef(old, add)
67
+ TypeDefs[add] = find_type(old, TypeDefs)
68
+ end
85
69
 
86
- elsif TypeDefs.has_key?(name)
87
- TypeDefs[name]
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
- elsif name.is_a?(DataConverter)
90
- tm = (type_map || custom_typedefs)
91
- tm[name] = Type::Mapped.new(name)
92
- else
93
- raise TypeError, "unable to resolve type '#{name}'"
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
@@ -1,3 +1,3 @@
1
1
  module FFI
2
- VERSION = '1.16.3'
2
+ VERSION = '1.17.1'
3
3
  end
@@ -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
@@ -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
@@ -0,0 +1,9 @@
1
+ module FFI
2
+ class DynamicLibrary
3
+ # TODO
4
+
5
+ class Symbol < Pointer
6
+ # TODO
7
+ end
8
+ end
9
+ 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
@@ -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
@@ -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