ffi 1.16.3 → 1.17.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +28 -0
  4. data/Gemfile +9 -2
  5. data/README.md +1 -1
  6. data/Rakefile +17 -5
  7. data/ext/ffi_c/AbstractMemory.c +38 -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/LastError.c +4 -4
  14. data/ext/ffi_c/MemoryPointer.c +2 -2
  15. data/ext/ffi_c/Pointer.c +14 -11
  16. data/ext/ffi_c/Struct.c +11 -4
  17. data/ext/ffi_c/StructLayout.c +6 -6
  18. data/ext/ffi_c/Type.c +17 -16
  19. data/ext/ffi_c/Types.c +7 -1
  20. data/ext/ffi_c/Types.h +0 -1
  21. data/ext/ffi_c/Variadic.c +5 -2
  22. data/ext/ffi_c/libffi/.allow-ai-service +0 -0
  23. data/ext/ffi_c/libffi/.github/workflows/build.yml +34 -15
  24. data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +2 -1
  25. data/ext/ffi_c/libffi/LICENSE +1 -1
  26. data/ext/ffi_c/libffi/README.md +10 -5
  27. data/ext/ffi_c/libffi/configure +15 -15
  28. data/ext/ffi_c/libffi/configure.ac +2 -2
  29. data/ext/ffi_c/libffi/configure.host +1 -1
  30. data/ext/ffi_c/libffi/doc/libffi.texi +1 -1
  31. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  32. data/ext/ffi_c/libffi/include/ffi.h.in +2 -11
  33. data/ext/ffi_c/libffi/include/ffi_common.h +4 -2
  34. data/ext/ffi_c/libffi/libffi.map.in +5 -0
  35. data/ext/ffi_c/libffi/libtool-version +1 -1
  36. data/ext/ffi_c/libffi/ltmain.sh +8 -20
  37. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +1 -1
  38. data/ext/ffi_c/libffi/src/aarch64/ffi.c +26 -13
  39. data/ext/ffi_c/libffi/src/aarch64/sysv.S +198 -46
  40. data/ext/ffi_c/libffi/src/closures.c +3 -3
  41. data/ext/ffi_c/libffi/src/debug.c +2 -2
  42. data/ext/ffi_c/libffi/src/dlmalloc.c +1 -1
  43. data/ext/ffi_c/libffi/src/loongarch64/ffi.c +3 -0
  44. data/ext/ffi_c/libffi/src/mips/ffi.c +12 -4
  45. data/ext/ffi_c/libffi/src/mips/n32.S +65 -14
  46. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +36 -24
  47. data/ext/ffi_c/libffi/src/sparc/ffi64.c +7 -1
  48. data/ext/ffi_c/libffi/src/tramp.c +1 -1
  49. data/ext/ffi_c/libffi/src/types.c +4 -6
  50. data/ext/ffi_c/libffi/src/wasm32/ffi.c +13 -0
  51. data/ext/ffi_c/libffi/src/x86/ffiw64.c +1 -1
  52. data/ext/ffi_c/libffi/testsuite/Makefile.am +79 -127
  53. data/ext/ffi_c/libffi/testsuite/Makefile.in +79 -127
  54. data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +6 -0
  55. data/ext/ffi_c/libffi/testsuite/libffi.call/callback.c +99 -0
  56. data/ext/ffi_c/libffi/testsuite/libffi.call/callback2.c +108 -0
  57. data/ext/ffi_c/libffi/testsuite/libffi.call/callback3.c +114 -0
  58. data/ext/ffi_c/libffi/testsuite/libffi.call/callback4.c +119 -0
  59. data/ext/ffi_c/libffi.darwin.mk +2 -2
  60. data/lib/ffi/dynamic_library.rb +34 -5
  61. data/lib/ffi/enum.rb +0 -1
  62. data/lib/ffi/function.rb +1 -1
  63. data/lib/ffi/io.rb +2 -2
  64. data/lib/ffi/library.rb +23 -23
  65. data/lib/ffi/platform/aarch64-linux/types.conf +74 -3
  66. data/lib/ffi/pointer.rb +6 -6
  67. data/lib/ffi/struct.rb +4 -4
  68. data/lib/ffi/struct_layout.rb +2 -2
  69. data/lib/ffi/struct_layout_builder.rb +8 -8
  70. data/lib/ffi/types.rb +51 -49
  71. data/lib/ffi/version.rb +1 -1
  72. data/sig/ffi/abstract_memory.rbs +164 -0
  73. data/sig/ffi/auto_pointer.rbs +27 -0
  74. data/sig/ffi/buffer.rbs +18 -0
  75. data/sig/ffi/data_converter.rbs +10 -0
  76. data/sig/ffi/dynamic_library.rbs +9 -0
  77. data/sig/ffi/enum.rbs +38 -0
  78. data/sig/ffi/function.rbs +39 -0
  79. data/sig/ffi/library.rbs +42 -0
  80. data/sig/ffi/native_type.rbs +86 -0
  81. data/sig/ffi/pointer.rbs +42 -0
  82. data/sig/ffi/struct.rbs +76 -0
  83. data/sig/ffi/struct_by_reference.rbs +11 -0
  84. data/sig/ffi/struct_by_value.rbs +7 -0
  85. data/sig/ffi/struct_layout.rbs +9 -0
  86. data/sig/ffi/struct_layout_builder.rbs +5 -0
  87. data/sig/ffi/type.rbs +39 -0
  88. data/sig/ffi.rbs +26 -0
  89. data.tar.gz.sig +0 -0
  90. metadata +37 -15
  91. 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.0.rc1'
3
3
  end
@@ -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
@@ -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] (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
@@ -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