ffi 1.17.3-aarch64-mingw-ucrt

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 (130) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +498 -0
  3. data/COPYING +49 -0
  4. data/Gemfile +26 -0
  5. data/LICENSE +24 -0
  6. data/LICENSE.SPECS +22 -0
  7. data/README.md +138 -0
  8. data/Rakefile +209 -0
  9. data/Steepfile +8 -0
  10. data/ffi.gemspec +41 -0
  11. data/lib/3.4/ffi_c.so +0 -0
  12. data/lib/4.0/ffi_c.so +0 -0
  13. data/lib/ffi/abstract_memory.rb +44 -0
  14. data/lib/ffi/autopointer.rb +186 -0
  15. data/lib/ffi/buffer.rb +4 -0
  16. data/lib/ffi/callback.rb +4 -0
  17. data/lib/ffi/compat.rb +54 -0
  18. data/lib/ffi/data_converter.rb +67 -0
  19. data/lib/ffi/dynamic_library.rb +118 -0
  20. data/lib/ffi/enum.rb +302 -0
  21. data/lib/ffi/errno.rb +43 -0
  22. data/lib/ffi/ffi.rb +109 -0
  23. data/lib/ffi/function.rb +94 -0
  24. data/lib/ffi/io.rb +62 -0
  25. data/lib/ffi/library.rb +592 -0
  26. data/lib/ffi/library_path.rb +109 -0
  27. data/lib/ffi/managedstruct.rb +84 -0
  28. data/lib/ffi/memorypointer.rb +1 -0
  29. data/lib/ffi/platform/aarch64-darwin/types.conf +130 -0
  30. data/lib/ffi/platform/aarch64-freebsd/types.conf +128 -0
  31. data/lib/ffi/platform/aarch64-freebsd12/types.conf +181 -0
  32. data/lib/ffi/platform/aarch64-linux/types.conf +175 -0
  33. data/lib/ffi/platform/aarch64-openbsd/types.conf +134 -0
  34. data/lib/ffi/platform/aarch64-windows/types.conf +52 -0
  35. data/lib/ffi/platform/arm-freebsd/types.conf +152 -0
  36. data/lib/ffi/platform/arm-freebsd12/types.conf +152 -0
  37. data/lib/ffi/platform/arm-linux/types.conf +132 -0
  38. data/lib/ffi/platform/hppa1.1-linux/types.conf +178 -0
  39. data/lib/ffi/platform/hppa2.0-linux/types.conf +178 -0
  40. data/lib/ffi/platform/i386-cygwin/types.conf +3 -0
  41. data/lib/ffi/platform/i386-darwin/types.conf +100 -0
  42. data/lib/ffi/platform/i386-freebsd/types.conf +152 -0
  43. data/lib/ffi/platform/i386-freebsd12/types.conf +152 -0
  44. data/lib/ffi/platform/i386-gnu/types.conf +107 -0
  45. data/lib/ffi/platform/i386-linux/types.conf +103 -0
  46. data/lib/ffi/platform/i386-netbsd/types.conf +126 -0
  47. data/lib/ffi/platform/i386-openbsd/types.conf +128 -0
  48. data/lib/ffi/platform/i386-solaris/types.conf +122 -0
  49. data/lib/ffi/platform/i386-windows/types.conf +52 -0
  50. data/lib/ffi/platform/ia64-linux/types.conf +104 -0
  51. data/lib/ffi/platform/loongarch64-linux/types.conf +141 -0
  52. data/lib/ffi/platform/mips-linux/types.conf +102 -0
  53. data/lib/ffi/platform/mips64-linux/types.conf +104 -0
  54. data/lib/ffi/platform/mips64el-linux/types.conf +104 -0
  55. data/lib/ffi/platform/mipsel-linux/types.conf +102 -0
  56. data/lib/ffi/platform/mipsisa32r6-linux/types.conf +102 -0
  57. data/lib/ffi/platform/mipsisa32r6el-linux/types.conf +102 -0
  58. data/lib/ffi/platform/mipsisa64r6-linux/types.conf +104 -0
  59. data/lib/ffi/platform/mipsisa64r6el-linux/types.conf +104 -0
  60. data/lib/ffi/platform/powerpc-aix/types.conf +180 -0
  61. data/lib/ffi/platform/powerpc-darwin/types.conf +100 -0
  62. data/lib/ffi/platform/powerpc-linux/types.conf +130 -0
  63. data/lib/ffi/platform/powerpc-openbsd/types.conf +156 -0
  64. data/lib/ffi/platform/powerpc64-linux/types.conf +104 -0
  65. data/lib/ffi/platform/powerpc64le-linux/types.conf +100 -0
  66. data/lib/ffi/platform/riscv64-linux/types.conf +104 -0
  67. data/lib/ffi/platform/s390-linux/types.conf +102 -0
  68. data/lib/ffi/platform/s390x-linux/types.conf +102 -0
  69. data/lib/ffi/platform/sparc-linux/types.conf +102 -0
  70. data/lib/ffi/platform/sparc-solaris/types.conf +128 -0
  71. data/lib/ffi/platform/sparcv9-linux/types.conf +102 -0
  72. data/lib/ffi/platform/sparcv9-openbsd/types.conf +156 -0
  73. data/lib/ffi/platform/sparcv9-solaris/types.conf +128 -0
  74. data/lib/ffi/platform/sw_64-linux/types.conf +141 -0
  75. data/lib/ffi/platform/x86_64-cygwin/types.conf +3 -0
  76. data/lib/ffi/platform/x86_64-darwin/types.conf +130 -0
  77. data/lib/ffi/platform/x86_64-dragonflybsd/types.conf +130 -0
  78. data/lib/ffi/platform/x86_64-freebsd/types.conf +128 -0
  79. data/lib/ffi/platform/x86_64-freebsd12/types.conf +158 -0
  80. data/lib/ffi/platform/x86_64-haiku/types.conf +117 -0
  81. data/lib/ffi/platform/x86_64-linux/types.conf +132 -0
  82. data/lib/ffi/platform/x86_64-msys/types.conf +119 -0
  83. data/lib/ffi/platform/x86_64-netbsd/types.conf +128 -0
  84. data/lib/ffi/platform/x86_64-openbsd/types.conf +134 -0
  85. data/lib/ffi/platform/x86_64-solaris/types.conf +122 -0
  86. data/lib/ffi/platform/x86_64-windows/types.conf +52 -0
  87. data/lib/ffi/platform.rb +187 -0
  88. data/lib/ffi/pointer.rb +167 -0
  89. data/lib/ffi/struct.rb +317 -0
  90. data/lib/ffi/struct_by_reference.rb +72 -0
  91. data/lib/ffi/struct_layout.rb +96 -0
  92. data/lib/ffi/struct_layout_builder.rb +227 -0
  93. data/lib/ffi/tools/const_generator.rb +232 -0
  94. data/lib/ffi/tools/generator.rb +105 -0
  95. data/lib/ffi/tools/generator_task.rb +32 -0
  96. data/lib/ffi/tools/struct_generator.rb +195 -0
  97. data/lib/ffi/types.rb +222 -0
  98. data/lib/ffi/union.rb +43 -0
  99. data/lib/ffi/variadic.rb +80 -0
  100. data/lib/ffi/version.rb +3 -0
  101. data/lib/ffi.rb +27 -0
  102. data/samples/getlogin.rb +8 -0
  103. data/samples/getpid.rb +8 -0
  104. data/samples/gettimeofday.rb +18 -0
  105. data/samples/hello.rb +8 -0
  106. data/samples/hello_ractor.rb +19 -0
  107. data/samples/inotify.rb +60 -0
  108. data/samples/pty.rb +75 -0
  109. data/samples/qsort.rb +20 -0
  110. data/samples/qsort_ractor.rb +36 -0
  111. data/sig/ffi/abstract_memory.rbs +165 -0
  112. data/sig/ffi/auto_pointer.rbs +26 -0
  113. data/sig/ffi/buffer.rbs +18 -0
  114. data/sig/ffi/data_converter.rbs +10 -0
  115. data/sig/ffi/dynamic_library.rbs +9 -0
  116. data/sig/ffi/enum.rbs +38 -0
  117. data/sig/ffi/errno.rbs +8 -0
  118. data/sig/ffi/function.rbs +39 -0
  119. data/sig/ffi/library.rbs +42 -0
  120. data/sig/ffi/native_type.rbs +86 -0
  121. data/sig/ffi/platform.rbs +49 -0
  122. data/sig/ffi/pointer.rbs +42 -0
  123. data/sig/ffi/struct.rbs +76 -0
  124. data/sig/ffi/struct_by_reference.rbs +11 -0
  125. data/sig/ffi/struct_by_value.rbs +7 -0
  126. data/sig/ffi/struct_layout.rbs +9 -0
  127. data/sig/ffi/struct_layout_builder.rbs +5 -0
  128. data/sig/ffi/type.rbs +39 -0
  129. data/sig/ffi.rbs +29 -0
  130. metadata +179 -0
data/README.md ADDED
@@ -0,0 +1,138 @@
1
+ # Ruby-FFI https://github.com/ffi/ffi/wiki
2
+
3
+ ## Description
4
+
5
+ Ruby-FFI is a gem for programmatically loading dynamically-linked native
6
+ libraries, binding functions within them, and calling those functions
7
+ from Ruby code. Moreover, a Ruby-FFI extension works without changes
8
+ on CRuby (MRI), JRuby, Rubinius and TruffleRuby. [Discover why you should write your next extension
9
+ using Ruby-FFI](https://github.com/ffi/ffi/wiki/why-use-ffi).
10
+
11
+ ## Features
12
+
13
+ * Intuitive DSL
14
+ * Supports all C native types
15
+ * C structs (also nested), enums and global variables
16
+ * Callbacks from C to Ruby
17
+ * Automatic garbage collection of native memory
18
+ * Usable in Ractor: [How-to-use-FFI-in-Ruby-Ractors](https://github.com/ffi/ffi/wiki/Ractors)
19
+
20
+ ## Synopsis
21
+
22
+ ```ruby
23
+ require 'ffi'
24
+
25
+ module MyLib
26
+ extend FFI::Library
27
+ ffi_lib 'c'
28
+ attach_function :puts, [ :string ], :int
29
+ end
30
+
31
+ MyLib.puts 'Hello, World using libc!'
32
+ ```
33
+
34
+ For less minimalistic and more examples you may look at:
35
+
36
+ * The [documentation](https://www.rubydoc.info/gems/ffi)
37
+ * the `samples/` folder
38
+ * the examples on the [wiki](https://github.com/ffi/ffi/wiki)
39
+ * the projects using FFI listed on the wiki: https://github.com/ffi/ffi/wiki/projects-using-ffi
40
+
41
+ ## Requirements
42
+
43
+ When installing the gem on CRuby (MRI), you will need:
44
+ * A C compiler (e.g., Xcode on macOS, `gcc` or `clang` on everything else)
45
+ Optionally (speeds up installation):
46
+ * The `libffi` library and development headers - this is commonly in the `libffi-dev` or `libffi-devel` packages
47
+
48
+ The ffi gem comes with a builtin libffi version, which is used, when the system libffi library is not available or too old.
49
+ Use of the system libffi can be enforced by:
50
+ ```
51
+ gem install ffi -- --enable-system-libffi # to install the gem manually
52
+ bundle config build.ffi --enable-system-libffi # for bundle install
53
+ ```
54
+ or prevented by `--disable-system-libffi`.
55
+
56
+ On Linux systems running with [PaX](https://en.wikipedia.org/wiki/PaX) (Gentoo, Alpine, etc.), FFI may trigger `mprotect` errors. You may need to disable [mprotect](https://en.wikibooks.org/wiki/Grsecurity/Appendix/Grsecurity_and_PaX_Configuration_Options#Restrict_mprotect.28.29) for ruby (`paxctl -m [/path/to/ruby]`) for the time being until a solution is found.
57
+
58
+ On FreeBSD systems pkgconf must be installed for the gem to be able to compile using clang. Install either via packages `pkg install pkgconf` or from ports via `devel/pkgconf`.
59
+
60
+ On JRuby and TruffleRuby, there are no requirements to install the FFI gem, and `require 'ffi'` works even without installing the gem (i.e., the gem is preinstalled on these implementations).
61
+
62
+ ## Installation
63
+
64
+ From rubygems:
65
+
66
+ [sudo] gem install ffi
67
+
68
+ From a Gemfile using git or GitHub
69
+
70
+ gem 'ffi', github: 'ffi/ffi', submodules: true
71
+
72
+ or from the git repository on github:
73
+
74
+ git clone git://github.com/ffi/ffi.git
75
+ cd ffi
76
+ git submodule update --init --recursive
77
+ bundle install
78
+ rake install
79
+
80
+ ### Install options:
81
+
82
+ * `--enable-system-libffi` : Force usage of system libffi
83
+ * `--disable-system-libffi` : Force usage of builtin libffi
84
+ * `--enable-libffi-alloc` : Force closure allocation by libffi
85
+ * `--disable-libffi-alloc` : Force closure allocation by builtin method
86
+
87
+ ## License
88
+
89
+ The ffi library is covered by the BSD license, also see the LICENSE file.
90
+ The specs are covered by the same license as [ruby/spec](https://github.com/ruby/spec), the MIT license.
91
+
92
+ ## Credits
93
+
94
+ The following people have submitted code, bug reports, or otherwise contributed to the success of this project:
95
+
96
+ * Alban Peignier <alban.peignier@free.fr>
97
+ * Aman Gupta <aman@tmm1.net>
98
+ * Andrea Fazzi <andrea.fazzi@alcacoop.it>
99
+ * Andreas Niederl <rico32@gmx.net>
100
+ * Andrew Cholakian <andrew@andrewvc.com>
101
+ * Antonio Terceiro <terceiro@softwarelivre.org>
102
+ * Benoit Daloze <eregontp@gmail.com>
103
+ * Brian Candler <B.Candler@pobox.com>
104
+ * Brian D. Burns <burns180@gmail.com>
105
+ * Bryan Kearney <bkearney@redhat.com>
106
+ * Charlie Savage <cfis@zerista.com>
107
+ * Chikanaga Tomoyuki <nagachika00@gmail.com>
108
+ * Hongli Lai <hongli@phusion.nl>
109
+ * Ian MacLeod <ian@nevir.net>
110
+ * Jake Douglas <jake@shiftedlabs.com>
111
+ * Jean-Dominique Morani <jdmorani@mac.com>
112
+ * Jeremy Hinegardner <jeremy@hinegardner.org>
113
+ * Jesús García Sáez <blaxter@gmail.com>
114
+ * Joe Khoobyar <joe@ankhcraft.com>
115
+ * Jurij Smakov <jurij@wooyd.org>
116
+ * KISHIMOTO, Makoto <ksmakoto@dd.iij4u.or.jp>
117
+ * Kim Burgestrand <kim@burgestrand.se>
118
+ * Lars Kanis <lars@greiz-reinsdorf.de>
119
+ * Luc Heinrich <luc@honk-honk.com>
120
+ * Luis Lavena <luislavena@gmail.com>
121
+ * Matijs van Zuijlen <matijs@matijs.net>
122
+ * Matthew King <automatthew@gmail.com>
123
+ * Mike Dalessio <mike.dalessio@gmail.com>
124
+ * NARUSE, Yui <naruse@airemix.jp>
125
+ * Park Heesob <phasis@gmail.com>
126
+ * Shin Yee <shinyee@speedgocomputing.com>
127
+ * Stephen Bannasch <stephen.bannasch@gmail.com>
128
+ * Suraj N. Kurapati <sunaku@gmail.com>
129
+ * Sylvain Daubert <sylvain.daubert@laposte.net>
130
+ * Victor Costan
131
+ * beoran@gmail.com
132
+ * ctide <christide@christide.com>
133
+ * emboss <Martin.Bosslet@googlemail.com>
134
+ * hobophobe <unusualtears@gmail.com>
135
+ * meh <meh@paranoici.org>
136
+ * postmodern <postmodern.mod3@gmail.com>
137
+ * wycats@gmail.com <wycats@gmail.com>
138
+ * Wayne Meissner <wmeissner@gmail.com>
data/Rakefile ADDED
@@ -0,0 +1,209 @@
1
+ require 'rbconfig'
2
+ require 'date'
3
+ require 'fileutils'
4
+ require 'yaml'
5
+ require 'rspec/core/rake_task'
6
+ require 'rubygems/package_task'
7
+ require 'rake/extensiontask'
8
+ require_relative "lib/ffi/version"
9
+ require_relative "rakelib/ffi_gem_helper"
10
+
11
+ BUILD_DIR = "build"
12
+ BUILD_EXT_DIR = File.join(BUILD_DIR, "#{RbConfig::CONFIG['arch']}", 'ffi_c', RUBY_VERSION)
13
+
14
+ gem_spec = Bundler.load_gemspec('ffi.gemspec')
15
+
16
+ RSpec::Core::RakeTask.new(:spec) do |config|
17
+ config.rspec_opts = YAML.load_file 'spec/spec.opts'
18
+ end
19
+
20
+ desc "Build all packages"
21
+ task :package => %w[ gem:java gem:native ]
22
+
23
+ CLOBBER.include 'lib/ffi/types.conf'
24
+ CLOBBER.include 'pkg'
25
+ CLOBBER.include 'log'
26
+
27
+ CLEAN.include 'build'
28
+ CLEAN.include 'conftest.dSYM'
29
+ CLEAN.include 'spec/ffi/fixtures/libtest.{dylib,so,dll}'
30
+ CLEAN.include 'spec/ffi/fixtures/*.o'
31
+ CLEAN.include 'spec/ffi/embed-test/ext/*.{o,def}'
32
+ CLEAN.include 'spec/ffi/embed-test/ext/Makefile'
33
+ CLEAN.include "pkg/ffi-*-*/"
34
+ CLEAN.include 'lib/{2,3}.*'
35
+
36
+ # clean all shipped files, that are not in git
37
+ CLEAN.include(
38
+ gem_spec.files -
39
+ `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0").map { |f| File.join("ext/ffi_c/libffi", f) } -
40
+ `git ls-files -z`.split("\x0")
41
+ )
42
+
43
+ task :distclean => :clobber
44
+
45
+ desc "Test the extension"
46
+ task :test => [ :spec ]
47
+
48
+
49
+ namespace :bench do
50
+ ITER = ENV['ITER'] ? ENV['ITER'].to_i : 100000
51
+ bench_files = Dir["bench/bench_*.rb"].sort.reject { |f| f == "bench/bench_helper.rb" }
52
+ bench_files.each do |bench|
53
+ task File.basename(bench, ".rb")[6..-1] => :compile do
54
+ sh %{#{Gem.ruby} #{bench} #{ITER}}
55
+ end
56
+ end
57
+ task :all => :compile do
58
+ bench_files.each do |bench|
59
+ sh %{#{Gem.ruby} #{bench}}
60
+ end
61
+ end
62
+ end
63
+
64
+ task 'spec:run' => :compile
65
+ task 'spec:specdoc' => :compile
66
+
67
+ task :default => :spec
68
+
69
+ namespace 'java' do
70
+
71
+ java_gem_spec = gem_spec.dup.tap do |s|
72
+ s.files.reject! { |f| File.fnmatch?("ext/*", f) }
73
+ s.extensions = []
74
+ s.platform = 'java'
75
+ end
76
+
77
+ Gem::PackageTask.new(java_gem_spec) do |pkg|
78
+ pkg.need_zip = true
79
+ pkg.need_tar = true
80
+ pkg.package_dir = 'pkg'
81
+ end
82
+ end
83
+
84
+ task 'gem:java' => 'java:gem'
85
+
86
+ FfiGemHelper.install_tasks
87
+ # Register binary gems to be pushed to rubygems.org
88
+ Bundler::GemHelper.instance.cross_platforms = %w[
89
+ x86-mingw32
90
+ x64-mingw-ucrt
91
+ x64-mingw32
92
+ x86-linux-gnu
93
+ x86-linux-musl
94
+ x86_64-linux-gnu
95
+ x86_64-linux-musl
96
+ arm-linux-gnu
97
+ arm-linux-musl
98
+ aarch64-linux-gnu
99
+ aarch64-linux-musl
100
+ aarch64-mingw-ucrt
101
+ x86_64-darwin
102
+ arm64-darwin
103
+ ]
104
+
105
+ if RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx'
106
+ require 'rake/extensiontask'
107
+ Rake::ExtensionTask.new('ffi_c', gem_spec) do |ext|
108
+ ext.name = 'ffi_c' # indicate the name of the extension.
109
+ # ext.lib_dir = BUILD_DIR # put binaries into this folder.
110
+ ext.tmp_dir = BUILD_DIR # temporary folder used during compilation.
111
+ ext.cross_compile = true # enable cross compilation (requires cross compile toolchain)
112
+ ext.cross_platform = Bundler::GemHelper.instance.cross_platforms
113
+ ext.cross_compiling do |spec|
114
+ spec.files.reject! { |path| File.fnmatch?('ext/*', path) }
115
+ # Binary gems don't need libffi header+lib files
116
+ spec.metadata.delete("msys2_mingw_dependencies")
117
+ end
118
+ # Enable debug info for 'rake compile' but not for 'gem install'
119
+ ext.config_options << "--enable-debug"
120
+
121
+ end
122
+ else
123
+ task :compile do
124
+ STDERR.puts "Nothing to compile on #{RUBY_ENGINE}"
125
+ end
126
+ end
127
+
128
+
129
+ namespace "gem" do
130
+ task 'prepare' do
131
+ require 'rake_compiler_dock'
132
+ sh "bundle package"
133
+ end
134
+
135
+ Bundler::GemHelper.instance.cross_platforms.each do |plat|
136
+ desc "Build all native binary gems in parallel"
137
+ multitask 'native' => plat
138
+
139
+ desc "Build the native gem for #{plat}"
140
+ task plat => ['prepare', 'build'] do
141
+ RakeCompilerDock.sh <<-EOT, platform: plat
142
+ sudo apt-get update && sudo apt-get install -y libltdl-dev &&
143
+ bundle install --local &&
144
+ rake native:#{plat} pkg/#{gem_spec.full_name}-#{plat}.gem MAKE='nice make -j`nproc`' RUBY_CC_VERSION=#{RakeCompilerDock.ruby_cc_version("~>4.0", "~>3.0")}
145
+ EOT
146
+ end
147
+ end
148
+ end
149
+
150
+ directory "ext/ffi_c/libffi"
151
+ file "ext/ffi_c/libffi/autogen.sh" => "ext/ffi_c/libffi" do
152
+ warn "Downloading libffi ..."
153
+ sh "git submodule update --init --recursive"
154
+ end
155
+ task :libffi => "ext/ffi_c/libffi/autogen.sh"
156
+
157
+ LIBFFI_GIT_FILES = `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0")
158
+
159
+ # Generate files which are in the gemspec but not in libffi's git repo by running autogen.sh
160
+ gem_spec.files.select do |f|
161
+ f =~ /ext\/ffi_c\/libffi\/(.*)/ && !LIBFFI_GIT_FILES.include?($1)
162
+ end.each do |f|
163
+ file f => "ext/ffi_c/libffi/autogen.sh" do
164
+ chdir "ext/ffi_c/libffi" do
165
+ sh "sh ./autogen.sh"
166
+ end
167
+ touch f
168
+ if gem_spec.files != Gem::Specification.load('./ffi.gemspec').files
169
+ warn "gemspec files have changed -> Please restart rake!"
170
+ exit 1
171
+ end
172
+ end
173
+ end
174
+
175
+ # Make sure we have all gemspec files before packaging
176
+ task :build => gem_spec.files
177
+ task :gem => :build
178
+
179
+
180
+ require_relative "lib/ffi/platform"
181
+ types_conf = File.expand_path(File.join(FFI::Platform::CONF_DIR, 'types.conf'))
182
+ logfile = File.join(File.dirname(__FILE__), 'types_log')
183
+
184
+ task types_conf do |task|
185
+ require 'fileutils'
186
+ require_relative "rakelib/types_generator"
187
+ options = {}
188
+ FileUtils.mkdir_p(File.dirname(task.name), mode: 0755 )
189
+ File.open(task.name, File::CREAT|File::TRUNC|File::RDWR, 0644) do |f|
190
+ f.puts FFI::TypesGenerator.generate(options)
191
+ end
192
+ File.open(logfile, 'w') do |log|
193
+ log.puts(types_conf)
194
+ end
195
+ end
196
+
197
+ desc "Create or update type information for platform #{FFI::Platform::NAME}"
198
+ task :types_conf => types_conf
199
+
200
+ begin
201
+ require 'yard'
202
+
203
+ namespace :doc do
204
+ YARD::Rake::YardocTask.new do |yard|
205
+ end
206
+ end
207
+ rescue LoadError
208
+ warn "[warn] YARD unavailable"
209
+ end
data/Steepfile ADDED
@@ -0,0 +1,8 @@
1
+ target :lib do
2
+ signature "sig"
3
+
4
+ check "lib"
5
+
6
+ # ignore whole of lib, to just validate RBS in sig
7
+ ignore "lib"
8
+ end
data/ffi.gemspec ADDED
@@ -0,0 +1,41 @@
1
+ require File.expand_path("../lib/#{File.basename(__FILE__, '.gemspec')}/version", __FILE__)
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'ffi'
5
+ s.version = FFI::VERSION
6
+ s.author = 'Wayne Meissner'
7
+ s.email = 'wmeissner@gmail.com'
8
+ s.homepage = 'https://github.com/ffi/ffi/wiki'
9
+ s.summary = 'Ruby FFI'
10
+ s.description = 'Ruby FFI library'
11
+ if s.respond_to?(:metadata)
12
+ s.metadata['bug_tracker_uri'] = 'https://github.com/ffi/ffi/issues'
13
+ s.metadata['changelog_uri'] = 'https://github.com/ffi/ffi/blob/master/CHANGELOG.md'
14
+ s.metadata['documentation_uri'] = 'https://github.com/ffi/ffi/wiki'
15
+ s.metadata['wiki_uri'] = 'https://github.com/ffi/ffi/wiki'
16
+ s.metadata['source_code_uri'] = 'https://github.com/ffi/ffi/'
17
+ s.metadata['mailing_list_uri'] = 'http://groups.google.com/group/ruby-ffi'
18
+ s.metadata['rubygems_mfa_required'] = 'true'
19
+ end
20
+ s.files = `git ls-files -z`.split("\x0").reject do |f|
21
+ f =~ /^(\.|bench|gen|libtest|nbproject|spec|rakelib)/
22
+ end
23
+
24
+ # Add libffi git files
25
+ lfs = `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0")
26
+ # Add autoconf generated files of libffi
27
+ lfs += %w[ compile configure config.guess config.sub install-sh ltmain.sh missing fficonfig.h.in ]
28
+ # Add automake generated files of libffi
29
+ lfs += `git --git-dir ext/ffi_c/libffi/.git ls-files -z *.am */*.am`.gsub(".am\0", ".in\0").split("\x0")
30
+ s.files += lfs.map do |f|
31
+ File.join("ext/ffi_c/libffi", f)
32
+ end
33
+
34
+ s.extensions << 'ext/ffi_c/extconf.rb'
35
+ s.rdoc_options = %w[--exclude=ext/ffi_c/.*\.o$ --exclude=ffi_c\.(bundle|so)$]
36
+ s.license = 'BSD-3-Clause'
37
+ s.require_paths << 'ext/ffi_c'
38
+ s.required_ruby_version = '>= 2.5'
39
+
40
+ s.metadata['msys2_mingw_dependencies'] = 'libffi'
41
+ end
data/lib/3.4/ffi_c.so ADDED
Binary file
data/lib/4.0/ffi_c.so ADDED
Binary file
@@ -0,0 +1,44 @@
1
+ #
2
+ # Copyright (C) 2020 Lars Kanis
3
+ #
4
+ # This file is part of ruby-ffi.
5
+ #
6
+ # All rights reserved.
7
+ #
8
+ # Redistribution and use in source and binary forms, with or without
9
+ # modification, are permitted provided that the following conditions are met:
10
+ #
11
+ # * Redistributions of source code must retain the above copyright notice, this
12
+ # list of conditions and the following disclaimer.
13
+ # * Redistributions in binary form must reproduce the above copyright notice
14
+ # this list of conditions and the following disclaimer in the documentation
15
+ # and/or other materials provided with the distribution.
16
+ # * Neither the name of the Ruby FFI project nor the names of its contributors
17
+ # may be used to endorse or promote products derived from this software
18
+ # without specific prior written permission.
19
+ #
20
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
24
+ # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27
+ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28
+ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.#
30
+
31
+
32
+ module FFI
33
+ class AbstractMemory
34
+ LONG_MAX = FFI::Pointer.new(1).size
35
+ private_constant :LONG_MAX
36
+
37
+ # Return +true+ if +self+ has a size limit.
38
+ #
39
+ # @return [Boolean]
40
+ def size_limit?
41
+ size != LONG_MAX
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,186 @@
1
+ #
2
+ # Copyright (C) 2008-2010 Wayne Meissner
3
+ # Copyright (C) 2008 Mike Dalessio
4
+ #
5
+ # This file is part of ruby-ffi.
6
+ #
7
+ # All rights reserved.
8
+ #
9
+ # Redistribution and use in source and binary forms, with or without
10
+ # modification, are permitted provided that the following conditions are met:
11
+ #
12
+ # * Redistributions of source code must retain the above copyright notice, this
13
+ # list of conditions and the following disclaimer.
14
+ # * Redistributions in binary form must reproduce the above copyright notice
15
+ # this list of conditions and the following disclaimer in the documentation
16
+ # and/or other materials provided with the distribution.
17
+ # * Neither the name of the Ruby FFI project nor the names of its contributors
18
+ # may be used to endorse or promote products derived from this software
19
+ # without specific prior written permission.
20
+ #
21
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
24
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
25
+ # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
27
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
28
+ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29
+ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
30
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31
+
32
+ module FFI
33
+ class AutoPointer < Pointer
34
+ extend DataConverter
35
+
36
+ # @overload initialize(pointer, method)
37
+ # @param pointer [Pointer]
38
+ # @param method [Method]
39
+ # @return [self]
40
+ # The passed Method will be invoked at GC time.
41
+ # @overload initialize(pointer, proc)
42
+ # @param pointer [Pointer]
43
+ # @return [self]
44
+ # The passed Proc will be invoked at GC time (SEE WARNING BELOW!)
45
+ # @note WARNING: passing a proc _may_ cause your pointer to never be
46
+ # GC'd, unless you're careful to avoid trapping a reference to the
47
+ # pointer in the proc. See the test specs for examples.
48
+ # @overload initialize(pointer)
49
+ # @param pointer [Pointer]
50
+ # @return [self]
51
+ # The pointer's release() class method will be invoked at GC time.
52
+ #
53
+ # @note The safest, and therefore preferred, calling
54
+ # idiom is to pass a Method as the second parameter. Example usage:
55
+ #
56
+ # class PointerHelper
57
+ # def self.release(pointer)
58
+ # ...
59
+ # end
60
+ # end
61
+ #
62
+ # p = AutoPointer.new(other_pointer, PointerHelper.method(:release))
63
+ #
64
+ # The above code will cause PointerHelper#release to be invoked at GC time.
65
+ #
66
+ # @note
67
+ # The last calling idiom (only one parameter) is generally only
68
+ # going to be useful if you subclass {AutoPointer}, and override
69
+ # #release, which by default does nothing.
70
+ def initialize(ptr, proc=nil)
71
+ raise TypeError, "Invalid pointer" if ptr.nil? || !ptr.kind_of?(Pointer) ||
72
+ ptr.kind_of?(MemoryPointer) || ptr.kind_of?(AutoPointer)
73
+ super(ptr.type_size, ptr)
74
+
75
+ @releaser = if proc
76
+ if not proc.respond_to?(:call)
77
+ raise RuntimeError.new("proc must be callable")
78
+ end
79
+ Releaser.new(ptr, proc)
80
+
81
+ else
82
+ if not self.class.respond_to?(:release, true)
83
+ raise RuntimeError.new("no release method defined")
84
+ end
85
+ Releaser.new(ptr, self.class.method(:release))
86
+ end
87
+
88
+ ObjectSpace.define_finalizer(self, @releaser)
89
+ self
90
+ end
91
+
92
+ def dup
93
+ raise RuntimeError, "cannot duplicate FFI::AutoPointer"
94
+ end
95
+
96
+ alias clone dup
97
+
98
+ # @return [nil]
99
+ # Free the pointer.
100
+ def free
101
+ @releaser.free
102
+ end
103
+
104
+ # @param [Boolean] autorelease
105
+ # @return [Boolean] +autorelease+
106
+ # Set +autorelease+ property. See {Pointer Autorelease section at Pointer}.
107
+ def autorelease=(autorelease)
108
+ raise FrozenError.new("can't modify frozen #{self.class}") if frozen?
109
+ @releaser.autorelease=(autorelease)
110
+ end
111
+
112
+ # @return [Boolean] +autorelease+
113
+ # Get +autorelease+ property. See {Pointer Autorelease section at Pointer}.
114
+ def autorelease?
115
+ @releaser.autorelease
116
+ end
117
+
118
+ # @abstract Base class for {AutoPointer}'s releasers.
119
+ #
120
+ # All subclasses of Releaser should define a +#release(ptr)+ method.
121
+ # A releaser is an object in charge of release an {AutoPointer}.
122
+ class Releaser
123
+ attr_accessor :autorelease
124
+
125
+ # @param [Pointer] ptr
126
+ # @param [#call] proc
127
+ # @return [nil]
128
+ # A new instance of Releaser.
129
+ def initialize(ptr, proc)
130
+ @ptr = ptr
131
+ @proc = proc
132
+ @autorelease = true
133
+ end
134
+
135
+ # @return [nil]
136
+ # Free pointer.
137
+ def free
138
+ if @ptr
139
+ release(@ptr)
140
+ @autorelease = false
141
+ @ptr = nil
142
+ @proc = nil
143
+ end
144
+ end
145
+
146
+ # @param args
147
+ # Release pointer if +autorelease+ is set.
148
+ def call(*args)
149
+ release(@ptr) if @autorelease && @ptr
150
+ end
151
+
152
+ # Release +ptr+ by using Proc or Method defined at +ptr+
153
+ # {AutoPointer#initialize initialization}.
154
+ #
155
+ # @param [Pointer] ptr
156
+ # @return [nil]
157
+ def release(ptr)
158
+ @proc.call(ptr)
159
+ end
160
+ end
161
+
162
+ # Return native type of AutoPointer.
163
+ #
164
+ # Override {DataConverter#native_type}.
165
+ # @return [Type::POINTER]
166
+ # @raise {RuntimeError} if class does not implement a +#release+ method
167
+ def self.native_type
168
+ if not self.respond_to?(:release, true)
169
+ raise RuntimeError.new("no release method defined for #{self.inspect}")
170
+ end
171
+ Type::POINTER
172
+ end
173
+
174
+ # Create a new AutoPointer.
175
+ #
176
+ # Override {DataConverter#from_native}.
177
+ # @overload self.from_native(ptr, ctx)
178
+ # @param [Pointer] ptr
179
+ # @param ctx not used. Please set +nil+.
180
+ # @return [AutoPointer]
181
+ def self.from_native(val, ctx)
182
+ self.new(val)
183
+ end
184
+ end
185
+
186
+ end
data/lib/ffi/buffer.rb ADDED
@@ -0,0 +1,4 @@
1
+ #
2
+ # All the code from this file is now implemented in C. This file remains
3
+ # to satisfy any leftover require 'ffi/buffer' in user code
4
+ #
@@ -0,0 +1,4 @@
1
+ #
2
+ # All the code from this file is now implemented in C. This file remains
3
+ # to satisfy any leftover require 'ffi/callback' in user code
4
+ #