ffi 1.17.0.rc1-x86_64-linux-musl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (134) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +442 -0
  3. data/COPYING +49 -0
  4. data/Gemfile +21 -0
  5. data/LICENSE +24 -0
  6. data/LICENSE.SPECS +22 -0
  7. data/README.md +137 -0
  8. data/Rakefile +206 -0
  9. data/ffi.gemspec +42 -0
  10. data/lib/2.5/ffi_c.so +0 -0
  11. data/lib/2.6/ffi_c.so +0 -0
  12. data/lib/2.7/ffi_c.so +0 -0
  13. data/lib/3.0/ffi_c.so +0 -0
  14. data/lib/3.1/ffi_c.so +0 -0
  15. data/lib/3.2/ffi_c.so +0 -0
  16. data/lib/3.3/ffi_c.so +0 -0
  17. data/lib/ffi/abstract_memory.rb +44 -0
  18. data/lib/ffi/autopointer.rb +188 -0
  19. data/lib/ffi/buffer.rb +4 -0
  20. data/lib/ffi/callback.rb +4 -0
  21. data/lib/ffi/compat.rb +43 -0
  22. data/lib/ffi/data_converter.rb +67 -0
  23. data/lib/ffi/dynamic_library.rb +118 -0
  24. data/lib/ffi/enum.rb +302 -0
  25. data/lib/ffi/errno.rb +43 -0
  26. data/lib/ffi/ffi.rb +50 -0
  27. data/lib/ffi/function.rb +71 -0
  28. data/lib/ffi/io.rb +62 -0
  29. data/lib/ffi/library.rb +576 -0
  30. data/lib/ffi/library_path.rb +109 -0
  31. data/lib/ffi/managedstruct.rb +84 -0
  32. data/lib/ffi/memorypointer.rb +1 -0
  33. data/lib/ffi/platform/aarch64-darwin/types.conf +130 -0
  34. data/lib/ffi/platform/aarch64-freebsd/types.conf +128 -0
  35. data/lib/ffi/platform/aarch64-freebsd12/types.conf +181 -0
  36. data/lib/ffi/platform/aarch64-linux/types.conf +175 -0
  37. data/lib/ffi/platform/aarch64-openbsd/types.conf +134 -0
  38. data/lib/ffi/platform/aarch64-windows/types.conf +52 -0
  39. data/lib/ffi/platform/arm-freebsd/types.conf +152 -0
  40. data/lib/ffi/platform/arm-freebsd12/types.conf +152 -0
  41. data/lib/ffi/platform/arm-linux/types.conf +132 -0
  42. data/lib/ffi/platform/hppa1.1-linux/types.conf +178 -0
  43. data/lib/ffi/platform/hppa2.0-linux/types.conf +178 -0
  44. data/lib/ffi/platform/i386-cygwin/types.conf +3 -0
  45. data/lib/ffi/platform/i386-darwin/types.conf +100 -0
  46. data/lib/ffi/platform/i386-freebsd/types.conf +152 -0
  47. data/lib/ffi/platform/i386-freebsd12/types.conf +152 -0
  48. data/lib/ffi/platform/i386-gnu/types.conf +107 -0
  49. data/lib/ffi/platform/i386-linux/types.conf +103 -0
  50. data/lib/ffi/platform/i386-netbsd/types.conf +126 -0
  51. data/lib/ffi/platform/i386-openbsd/types.conf +128 -0
  52. data/lib/ffi/platform/i386-solaris/types.conf +122 -0
  53. data/lib/ffi/platform/i386-windows/types.conf +52 -0
  54. data/lib/ffi/platform/ia64-linux/types.conf +104 -0
  55. data/lib/ffi/platform/loongarch64-linux/types.conf +141 -0
  56. data/lib/ffi/platform/mips-linux/types.conf +102 -0
  57. data/lib/ffi/platform/mips64-linux/types.conf +104 -0
  58. data/lib/ffi/platform/mips64el-linux/types.conf +104 -0
  59. data/lib/ffi/platform/mipsel-linux/types.conf +102 -0
  60. data/lib/ffi/platform/mipsisa32r6-linux/types.conf +102 -0
  61. data/lib/ffi/platform/mipsisa32r6el-linux/types.conf +102 -0
  62. data/lib/ffi/platform/mipsisa64r6-linux/types.conf +104 -0
  63. data/lib/ffi/platform/mipsisa64r6el-linux/types.conf +104 -0
  64. data/lib/ffi/platform/powerpc-aix/types.conf +180 -0
  65. data/lib/ffi/platform/powerpc-darwin/types.conf +100 -0
  66. data/lib/ffi/platform/powerpc-linux/types.conf +130 -0
  67. data/lib/ffi/platform/powerpc-openbsd/types.conf +156 -0
  68. data/lib/ffi/platform/powerpc64-linux/types.conf +104 -0
  69. data/lib/ffi/platform/powerpc64le-linux/types.conf +100 -0
  70. data/lib/ffi/platform/riscv64-linux/types.conf +104 -0
  71. data/lib/ffi/platform/s390-linux/types.conf +102 -0
  72. data/lib/ffi/platform/s390x-linux/types.conf +102 -0
  73. data/lib/ffi/platform/sparc-linux/types.conf +102 -0
  74. data/lib/ffi/platform/sparc-solaris/types.conf +128 -0
  75. data/lib/ffi/platform/sparcv9-linux/types.conf +102 -0
  76. data/lib/ffi/platform/sparcv9-openbsd/types.conf +156 -0
  77. data/lib/ffi/platform/sparcv9-solaris/types.conf +128 -0
  78. data/lib/ffi/platform/sw_64-linux/types.conf +141 -0
  79. data/lib/ffi/platform/x86_64-cygwin/types.conf +3 -0
  80. data/lib/ffi/platform/x86_64-darwin/types.conf +130 -0
  81. data/lib/ffi/platform/x86_64-dragonflybsd/types.conf +130 -0
  82. data/lib/ffi/platform/x86_64-freebsd/types.conf +128 -0
  83. data/lib/ffi/platform/x86_64-freebsd12/types.conf +158 -0
  84. data/lib/ffi/platform/x86_64-haiku/types.conf +117 -0
  85. data/lib/ffi/platform/x86_64-linux/types.conf +132 -0
  86. data/lib/ffi/platform/x86_64-msys/types.conf +119 -0
  87. data/lib/ffi/platform/x86_64-netbsd/types.conf +128 -0
  88. data/lib/ffi/platform/x86_64-openbsd/types.conf +134 -0
  89. data/lib/ffi/platform/x86_64-solaris/types.conf +122 -0
  90. data/lib/ffi/platform/x86_64-windows/types.conf +52 -0
  91. data/lib/ffi/platform.rb +187 -0
  92. data/lib/ffi/pointer.rb +167 -0
  93. data/lib/ffi/struct.rb +317 -0
  94. data/lib/ffi/struct_by_reference.rb +72 -0
  95. data/lib/ffi/struct_layout.rb +96 -0
  96. data/lib/ffi/struct_layout_builder.rb +227 -0
  97. data/lib/ffi/tools/const_generator.rb +232 -0
  98. data/lib/ffi/tools/generator.rb +105 -0
  99. data/lib/ffi/tools/generator_task.rb +32 -0
  100. data/lib/ffi/tools/struct_generator.rb +195 -0
  101. data/lib/ffi/tools/types_generator.rb +137 -0
  102. data/lib/ffi/types.rb +222 -0
  103. data/lib/ffi/union.rb +43 -0
  104. data/lib/ffi/variadic.rb +80 -0
  105. data/lib/ffi/version.rb +3 -0
  106. data/lib/ffi.rb +27 -0
  107. data/rakelib/ffi_gem_helper.rb +65 -0
  108. data/samples/getlogin.rb +8 -0
  109. data/samples/getpid.rb +8 -0
  110. data/samples/gettimeofday.rb +18 -0
  111. data/samples/hello.rb +8 -0
  112. data/samples/hello_ractor.rb +11 -0
  113. data/samples/inotify.rb +60 -0
  114. data/samples/pty.rb +75 -0
  115. data/samples/qsort.rb +20 -0
  116. data/samples/qsort_ractor.rb +28 -0
  117. data/sig/ffi/abstract_memory.rbs +164 -0
  118. data/sig/ffi/auto_pointer.rbs +27 -0
  119. data/sig/ffi/buffer.rbs +18 -0
  120. data/sig/ffi/data_converter.rbs +10 -0
  121. data/sig/ffi/dynamic_library.rbs +9 -0
  122. data/sig/ffi/enum.rbs +38 -0
  123. data/sig/ffi/function.rbs +39 -0
  124. data/sig/ffi/library.rbs +42 -0
  125. data/sig/ffi/native_type.rbs +86 -0
  126. data/sig/ffi/pointer.rbs +42 -0
  127. data/sig/ffi/struct.rbs +76 -0
  128. data/sig/ffi/struct_by_reference.rbs +11 -0
  129. data/sig/ffi/struct_by_value.rbs +7 -0
  130. data/sig/ffi/struct_layout.rbs +9 -0
  131. data/sig/ffi/struct_layout_builder.rbs +5 -0
  132. data/sig/ffi/type.rbs +39 -0
  133. data/sig/ffi.rbs +26 -0
  134. metadata +244 -0
@@ -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
@@ -0,0 +1,76 @@
1
+ module FFI
2
+ class Struct[out P < AbstractMemory, unchecked out E]
3
+ type layout = Library::ffi_lib_type | singleton(StructLayout::Field) | [layout, Integer]
4
+
5
+ type ptr = Type::Mapped[
6
+ StructByReference[Struct[AbstractMemory, untyped], AbstractMemory],
7
+ AbstractMemory, instance, untyped
8
+ ]
9
+ def self.ptr: (?untyped flags) -> ptr # https://github.com/ffi/ffi/issues/1073
10
+ alias self.by_ref self.ptr
11
+ def self.in: () -> ptr
12
+ def self.out: () -> ptr
13
+ def self.val: () -> StructByValue[singleton(Struct)]
14
+ alias self.by_value self.val
15
+
16
+ alias self.alloc_inout self.new
17
+ alias self.alloc_in self.new
18
+ alias self.alloc_out self.new
19
+ alias self.new_inout self.new
20
+ alias self.new_in self.new
21
+ alias self.new_out self.new
22
+
23
+ def self.auto_ptr: () -> Type::Mapped[
24
+ ManagedStructConverter[ManagedStruct[AutoPointer, untyped], AutoPointer],
25
+ Pointer, instance, untyped
26
+ ]
27
+ def self.layout: (*layout | Integer) -> StructLayout
28
+ | (Hash[Symbol, layout]) -> StructLayout
29
+ def self.size=: (Integer size) -> Integer
30
+
31
+ def self?.alignment: () -> Integer
32
+ def self?.members: () -> Array[Symbol]
33
+ def self?.offset_of: (Symbol name) -> Integer
34
+ def self?.offsets: () -> Array[[Symbol, Integer]]
35
+ def self?.size: -> Integer
36
+
37
+ def initialize: (?P pointer, *layout args) -> void
38
+ def []: (Symbol field_name) -> E
39
+ def []=: (Symbol field_name, E value) -> E
40
+ alias align alignment
41
+ def clear: () -> self
42
+ def layout: () -> StructLayout
43
+ def null?: () -> bool
44
+ def order: (AbstractMemory::order_in order) -> Struct[P, E]
45
+ | () -> AbstractMemory::order_out
46
+ def pointer: () -> P
47
+ alias to_ptr pointer
48
+ def values: () -> Array[E]
49
+
50
+ class InlineArray[out P < AbstractMemory, unchecked out E]
51
+ include Enumerable[E]
52
+ include AbstractMemory::_Size
53
+
54
+ def initialize: (P memory, StructLayout::Field field) -> self
55
+ def []: (Integer index) -> E
56
+ def []=: (Integer index, E value) -> E
57
+ def each: () { (E) -> void } -> self
58
+ def to_a: () -> Array[E]
59
+ def to_ptr: () -> P
60
+ end
61
+
62
+ class ManagedStructConverter[S < ManagedStruct[P, untyped], P < AutoPointer] < StructByReference[S, P]
63
+ def initialize: ...
64
+ def from_native: (Pointer ptr, untyped ctx) -> S
65
+ end
66
+ end
67
+
68
+ class ManagedStruct[out P < AutoPointer, unchecked out E] < Struct[P, E]
69
+ def self.release: (AbstractMemory ptr) -> void
70
+ def initialize: (Pointer pointer) -> self
71
+ end
72
+
73
+ class Union[out P < AbstractMemory, unchecked out E] < Struct[P, E]
74
+ def self.builder: () -> StructLayoutBuilder
75
+ end
76
+ end
@@ -0,0 +1,11 @@
1
+ module FFI
2
+ class StructByReference[S < Struct[P, untyped], P < AbstractMemory]
3
+ include DataConverter[P, S, untyped]
4
+ attr_reader struct_class: Struct[P, untyped]
5
+
6
+ def initialize: (S struct_class) -> void
7
+ def from_native: (P value, untyped ctx) -> S
8
+ def native_type: () -> Type::Builtin
9
+ def to_native: (S? value, untyped ctx) -> P
10
+ end
11
+ end
@@ -0,0 +1,7 @@
1
+ module FFI
2
+ class StructByValue[C < singleton(Struct)] < Type
3
+ def initialize: (C) -> self
4
+ def layout: () -> StructLayout
5
+ def struct_class: () -> C
6
+ end
7
+ end
@@ -0,0 +1,9 @@
1
+ module FFI
2
+ class StructLayout
3
+ #TODO
4
+
5
+ class Field
6
+ #TODO
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,5 @@
1
+ module FFI
2
+ class StructLayoutBuilder
3
+ #TODO
4
+ end
5
+ end
data/sig/ffi/type.rbs ADDED
@@ -0,0 +1,39 @@
1
+ module FFI
2
+ class Type
3
+ class Array = ArrayType
4
+ class Function = FunctionType
5
+ class Struct = StructByValue
6
+
7
+ include AbstractMemory::_Size
8
+ def initialize: (Integer | Type value) -> self
9
+ def alignment: () -> Integer
10
+ def inspect: ...
11
+
12
+ class Builtin < Type
13
+ def inspect: ...
14
+ end
15
+
16
+ class Mapped[X < _DataConverter[N, R, C], N, R, C]
17
+ include _DataConverter[N, R, C]
18
+
19
+ def initialize: (X converter) -> self
20
+ def converter: () -> X
21
+ end
22
+ end
23
+
24
+ class ArrayType
25
+ def initialize: (Type component_type, Integer length) -> self
26
+ def element_type: -> Type
27
+ def length: -> Integer
28
+ end
29
+
30
+ class FunctionType < Type
31
+ def initialize:
32
+ (
33
+ ffi_type return_type, Array[ffi_type] param_types,
34
+ ?blocking: boolish, ?convention: Library::convention, ?enums: Enums
35
+ ) -> self
36
+ def param_types: () -> Array[Type]
37
+ def return_type: () -> Type
38
+ end
39
+ end
data/sig/ffi.rbs ADDED
@@ -0,0 +1,26 @@
1
+ module FFI
2
+ type ffi_type = Type | Symbol
3
+ type ffi_auto_type = ffi_type | DataConverter[untyped, untyped, untyped]
4
+ type type_map = Hash[Symbol | DataConverter[untyped, untyped, untyped], Type]
5
+
6
+ class CallbackInfo = FunctionType
7
+ class FunctionInfo = FunctionType
8
+ class NativeLibrary = DynamicLibrary
9
+
10
+ VERSION: String
11
+ TypeDefs: type_map
12
+
13
+ type current_process = Object
14
+ CURRENT_PROCESS: current_process
15
+ USE_THIS_PROCESS_AS_LIBRARY: current_process
16
+
17
+ private def self.custom_typedefs: () -> type_map
18
+ def self.errno: () -> Integer
19
+ def self.errno=: (Integer) -> nil
20
+ def self.find_type: (ffi_auto_type name, ?type_map? type_map) -> Type
21
+ def self.make_shareable: [T] (T obj) -> T
22
+ def self.map_library_name: (_ToS lib) -> String
23
+ def self.type_size: (ffi_auto_type type) -> Integer
24
+ def self.typedef: (ffi_auto_type old, Symbol add) -> Type
25
+ alias self.add_typedef self.typedef
26
+ end