ffi 1.11.2-x86-mingw32 → 1.13.0-x86-mingw32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cfa7c385ccc6c5abf2899b1789fbb5a8ce8a6f593cd9ccd2f61074e0c02c4957
4
- data.tar.gz: c1102134ce8a3e449dc2adf9188ec13dd84cbe4733bf2f6b0b2467da20547db3
3
+ metadata.gz: 528831f939fb8aa38dff1df5a8e94848a8bebca16e42b3dacdb230167c2c773e
4
+ data.tar.gz: 6eabe31b9debbbc85c1859042a67938b163374000a37295887f49ead8950b44f
5
5
  SHA512:
6
- metadata.gz: 7e81476f665bdf167eea930b0a45be75433a546aa1a92d6fa907c595e056ae2d99accd91dd9ee41126a61dece9cf40ccf95082b6a3b22ad02aed17e5b50a0dc7
7
- data.tar.gz: 640e062508eb5d73743ad3f05617d904dfa0cb71b015cb256c4d07cfd92bc223c14d3c2114b8407e1eb7cdf03efca1b0cb26fde04e44db266049c7777c58a61f
6
+ metadata.gz: fd8082e5b17e7549656b04770de7190aa5bc11766a2d14f8d2c665d1aa3a1c3e9dc12b190fe0ca4da62f5e6bd9ec5bf23258b6ce43dce9101a494ce4f7e21f5f
7
+ data.tar.gz: 8874f723bebf884cdb30d4e43bf1a952ec5ca9b73ce3360e13f522be5a6f4f23e4fa3617fdf818cc06b81e7ade79d234aa5b3849581a158e0be3deef751db55d
@@ -10,11 +10,14 @@ install:
10
10
  - gem --version
11
11
  - gem install bundler --quiet --no-document
12
12
  - bundle install
13
+ # Update to libffi-3.3 since Appveyor version fails on LongDouble specs
14
+ - ridk exec pacman --sync --refresh --needed --noconfirm mingw-w64-x86_64-libffi mingw-w64-i686-libffi
13
15
  build: off
14
16
  build_script:
15
17
  - bundle exec rake libffi compile -- %EXTCONFOPTS% || bundle exec rake compile -- %EXTCONFOPTS%
16
18
  test_script:
17
19
  - bundle exec rake test
20
+ - bundle exec rake types_conf && git --no-pager diff
18
21
  environment:
19
22
  matrix:
20
23
  - RUBYVER: "head-x64"
@@ -0,0 +1,64 @@
1
+ name: CI
2
+ on: [push, pull_request]
3
+ jobs:
4
+ system-libffi:
5
+ # Run on latest MRI with explicit selection of system or builtin libffi
6
+ strategy:
7
+ fail-fast: false
8
+ matrix:
9
+ os: [ ubuntu, macos, windows ]
10
+ extconfopts: [ --disable-system-libffi, --enable-system-libffi ]
11
+ runs-on: ${{ matrix.os }}-latest
12
+ steps:
13
+ - uses: actions/checkout@v2
14
+ - uses: ruby/setup-ruby@v1
15
+ with:
16
+ ruby-version: 2.7
17
+
18
+ - run: brew install automake libffi pkg-config
19
+ if: matrix.os == 'macos'
20
+ - run: ridk exec pacman --sync --refresh --needed --noconfirm mingw-w64-x86_64-libffi
21
+ if: matrix.os == 'windows' && matrix.extconfopts == '--enable-system-libffi'
22
+
23
+ - run: bundle install
24
+ - run: bundle exec rake libffi
25
+ - run: bundle exec rake compile -- ${{ matrix.extconfopts }}
26
+ env:
27
+ # work around misconfiguration of libffi on MacOS with homebrew
28
+ PKG_CONFIG_PATH: ${{ env.PKG_CONFIG_PATH }}:/usr/local/opt/libffi/lib/pkgconfig
29
+ - run: bundle exec rake test
30
+ - run: bundle exec rake types_conf && git --no-pager diff
31
+
32
+ specs:
33
+ # Run all specs on all ruby implementations
34
+ # Use automatic libffi selection on MRI
35
+ strategy:
36
+ fail-fast: false
37
+ matrix:
38
+ os: [ ubuntu, macos, windows ]
39
+ ruby: [ 2.3, 2.4, 2.5, 2.6, 2.7, ruby-head, truffleruby-head ]
40
+ exclude:
41
+ - os: windows
42
+ ruby: truffleruby-head
43
+ - os: windows
44
+ ruby: 2.3 # compilation fails
45
+ runs-on: ${{ matrix.os }}-latest
46
+ steps:
47
+ - uses: actions/checkout@v2
48
+ - uses: ruby/setup-ruby@v1
49
+ with:
50
+ ruby-version: ${{ matrix.ruby }}
51
+
52
+ - run: brew install automake
53
+ if: matrix.os == 'macos'
54
+
55
+ - run: bundle install
56
+ - run: bundle exec rake libffi
57
+ - run: bundle exec rake compile
58
+
59
+ - run: bundle exec rake test
60
+
61
+ - run: bundle exec rake bench:all
62
+ if: matrix.ruby != 'truffleruby-head'
63
+ env:
64
+ ITER: 10
@@ -1,20 +1,29 @@
1
1
  dist: trusty
2
2
  group: beta
3
3
  language: ruby
4
+ git:
5
+ submodules: false
4
6
 
5
7
  script:
6
- - bundle exec rake compile || bundle exec rake compile
8
+ - bundle exec rake libffi
9
+ - bundle exec rake compile
7
10
  - bundle exec rake test
8
- - ITER=10 bundle exec rake bench:all
11
+ - |
12
+ if [[ $(ruby -v) != *truffleruby* ]]; then
13
+ ITER=10 bundle exec rake bench:all
14
+ fi
15
+ - bundle exec rake types_conf && git --no-pager diff
9
16
  os:
10
17
  - linux
11
18
  - osx
12
19
  rvm:
13
20
  - 2.3.8
14
- - 2.4.5
15
- - 2.5.3
16
- - 2.6.0
21
+ - 2.4.6
22
+ - 2.5.5
23
+ - 2.6.5
24
+ - 2.7.0
17
25
  - ruby-head
26
+ - truffleruby-head
18
27
 
19
28
  env:
20
29
  - CC=gcc
@@ -23,6 +32,10 @@ matrix:
23
32
  allow_failures:
24
33
  - os: osx
25
34
  rvm: ruby-head
35
+ - os: osx
36
+ rvm: 2.3.8
37
+ - os: linux
38
+ rvm: ruby-head
26
39
  include:
27
40
  - name: powerpc
28
41
  language: generic
@@ -38,5 +51,8 @@ matrix:
38
51
  docker build --rm -t ffi-armhf -f spec/env/Dockerfile.armhf .
39
52
  script: |
40
53
  docker run --rm -t -v `pwd`:/ffi ffi-armhf
54
+ exclude:
55
+ - os: osx
56
+ rvm: truffleruby-head
41
57
  after_failure:
42
58
  - "find build -name mkmf.log | xargs cat"
@@ -1,3 +1,67 @@
1
+ 1.13.0 / 2020-06-01
2
+ -------------------
3
+
4
+ Added:
5
+ * Add TruffleRuby support. Almost all specs are running on TruffleRuby and succeed. #768
6
+ * Add ruby source files to the java gem. This allows to ship the Ruby library code per platform java gem and add it as a default gem to JRuby. #763
7
+ * Add FFI::Platform::LONG_DOUBLE_SIZE
8
+ * Add bounds checks for writing to an inline char[] . #756
9
+ * Add long double as callback return value. #771
10
+ * Update type definitions and add types from stdint.h and stddef.h on i386-windows, x86_64-windows, x86_64-darwin, x86_64-linux, arm-linux, powerpc-linux. #749
11
+ * Add new type definitions for powerpc-openbsd and sparcv9-openbsd. #775, #778
12
+
13
+ Changed:
14
+ * Raise required ruby version to >= 2.3.
15
+ * Lots of cleanups and improvements in library, specs and benchmarks.
16
+ * Fix a lot of compiler warnings at the C-extension
17
+ * Fix several install issues on MacOS:
18
+ * Look for libffi in SDK paths, since recent versions of macOS removed it from `/usr/include` . #757
19
+ * Fix error `ld: library not found for -lgcc_s.10.4`
20
+ * Don't built for i386 architecture as it is deprecated
21
+ * Several fixes for MSVC build on Windows. #779
22
+ * Use `ucrtbase.dll` as default C library on Windows instead of old `msvcrt.dll`. #779
23
+ * Update builtin libffi to fix a Powerpc issue with parameters of type long
24
+ * Allow unmodified sourcing of (the ruby code of) this gem in JRuby and TruffleRuby as a default gem. #747
25
+ * Improve check to detect if a module has a #find_type method suitable for FFI. This fixes compatibility with stdlib `mkmf` . #776
26
+
27
+ Removed:
28
+ * Reject callback with `:string` return type at definition, because it didn't work so far and is not save to use. #751, #782
29
+
30
+
31
+ 1.12.2 / 2020-02-01
32
+ -------------------
33
+
34
+ * Fix possible segfault at FFI::Struct#[] and []= after GC.compact . #742
35
+
36
+
37
+ 1.12.1 / 2020-01-14
38
+ -------------------
39
+
40
+ Added:
41
+ * Add binary gem support for ruby-2.7 on Windows
42
+
43
+
44
+ 1.12.0 / 2020-01-14
45
+ -------------------
46
+
47
+ Added:
48
+ * FFI::VERSION is defined as part of `require 'ffi'` now.
49
+ It is no longer necessary to `require 'ffi/version'` .
50
+
51
+ Changed:
52
+ * Update libffi to latest master.
53
+
54
+ Deprecated:
55
+ * Overwriting struct layouts is now warned and will be disallowed in ffi-2.0. #734, #735
56
+
57
+
58
+ 1.11.3 / 2019-11-25
59
+ -------------------
60
+
61
+ Removed:
62
+ * Remove support for tainted objects which cause deprecation warnings in ruby-2.7. #730
63
+
64
+
1
65
  1.11.2 / 2019-11-11
2
66
  -------------------
3
67
 
data/Gemfile CHANGED
@@ -1,12 +1,14 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  group :development do
4
- gem 'rake', '~> 12.1'
4
+ gem 'rake', '~> 13.0'
5
5
  gem 'rake-compiler', '~> 1.0.3'
6
- gem 'rake-compiler-dock', '~> 0.7.0'
6
+ gem 'rake-compiler-dock', '~> 1.0'
7
7
  gem 'rspec', '~> 3.0'
8
- gem 'rubygems-tasks', '~> 0.2.4', :require => 'rubygems/tasks'
9
- gem "rubysl", "~> 2.0", :platforms => 'rbx'
8
+ # irb is a dependency of rubygems-tasks 0.2.5.
9
+ # irb versions > 1.1.1 depend on reline,
10
+ # which sometimes causes 'bundle install' to fail on Ruby <= 2.4: https://github.com/rubygems/rubygems/issues/3463
11
+ gem 'rubygems-tasks', '>= 0.2', '< 0.2.5', :require => 'rubygems/tasks'
10
12
  end
11
13
 
12
14
  group :doc do
data/README.md CHANGED
@@ -38,10 +38,19 @@ For less minimalistic and more examples you may look at:
38
38
 
39
39
  ## Requirements
40
40
 
41
- When installing the gem on CRuby (MRI) or Rubinius, you will need:
41
+ When installing the gem on CRuby (MRI), you will need:
42
42
  * A C compiler (e.g., Xcode on macOS, `gcc` or `clang` on everything else)
43
+ Optionally (speeds up installation):
43
44
  * The `libffi` library and development headers - this is commonly in the `libffi-dev` or `libffi-devel` packages
44
45
 
46
+ The ffi gem comes with a builtin libffi version, which is used, when the system libffi library is not available or too old.
47
+ Use of the system libffi can be enforced by:
48
+ ```
49
+ gem install ffi -- --enable-system-libffi # to install the gem manually
50
+ bundle config build.ffi --enable-system-libffi # for bundle install
51
+ ```
52
+ or prevented by `--disable-system-libffi`.
53
+
45
54
  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.
46
55
 
47
56
  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`.
data/Rakefile CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'rubygems/tasks'
2
2
  require 'rbconfig'
3
3
  require 'rake/clean'
4
- require File.expand_path("./lib/ffi/version")
4
+ require_relative "lib/ffi/version"
5
5
 
6
6
  require 'date'
7
7
  require 'fileutils'
@@ -9,10 +9,6 @@ require 'rbconfig'
9
9
  require 'rspec/core/rake_task'
10
10
  require 'rubygems/package_task'
11
11
 
12
- def java?
13
- /java/ === RUBY_PLATFORM
14
- end
15
-
16
12
  BUILD_DIR = "build"
17
13
  BUILD_EXT_DIR = File.join(BUILD_DIR, "#{RbConfig::CONFIG['arch']}", 'ffi_c', RUBY_VERSION)
18
14
 
@@ -20,17 +16,8 @@ def gem_spec
20
16
  @gem_spec ||= Gem::Specification.load('ffi.gemspec')
21
17
  end
22
18
 
23
- TEST_DEPS = []
24
- if RUBY_PLATFORM == "java"
25
- RSpec::Core::RakeTask.new(:spec) do |config|
26
- config.rspec_opts = YAML.load_file 'spec/spec.opts'
27
- end
28
- else
29
- RSpec::Core::RakeTask.new(:spec => :compile) do |config|
30
- config.rspec_opts = YAML.load_file 'spec/spec.opts'
31
- end
32
-
33
- TEST_DEPS.unshift :compile
19
+ RSpec::Core::RakeTask.new(:spec => :compile) do |config|
20
+ config.rspec_opts = YAML.load_file 'spec/spec.opts'
34
21
  end
35
22
 
36
23
  desc "Build all packages"
@@ -58,37 +45,29 @@ task :test => [ :spec ]
58
45
 
59
46
  namespace :bench do
60
47
  ITER = ENV['ITER'] ? ENV['ITER'].to_i : 100000
61
- bench_libs = "-Ilib" unless RUBY_PLATFORM == "java"
62
- bench_files = Dir["bench/bench_*.rb"].reject { |f| f == "bench/bench_helper.rb" }
48
+ bench_files = Dir["bench/bench_*.rb"].sort.reject { |f| f == "bench/bench_helper.rb" }
63
49
  bench_files.each do |bench|
64
- task File.basename(bench, ".rb")[6..-1] => TEST_DEPS do
65
- sh %{#{Gem.ruby} #{bench_libs} #{bench} #{ITER}}
50
+ task File.basename(bench, ".rb")[6..-1] => :compile do
51
+ sh %{#{Gem.ruby} #{bench} #{ITER}}
66
52
  end
67
53
  end
68
- task :all => TEST_DEPS do
54
+ task :all => :compile do
69
55
  bench_files.each do |bench|
70
- sh %{#{Gem.ruby} #{bench_libs} #{bench}}
56
+ sh %{#{Gem.ruby} #{bench}}
71
57
  end
72
58
  end
73
59
  end
74
60
 
75
- task 'spec:run' => TEST_DEPS
76
- task 'spec:specdoc' => TEST_DEPS
61
+ task 'spec:run' => :compile
62
+ task 'spec:specdoc' => :compile
77
63
 
78
64
  task :default => :spec
79
65
 
80
66
  namespace 'java' do
81
67
 
82
- java_gem_spec = Gem::Specification.new do |s|
83
- s.name = gem_spec.name
84
- s.version = gem_spec.version
85
- s.author = gem_spec.author
86
- s.email = gem_spec.email
87
- s.homepage = gem_spec.homepage
88
- s.summary = gem_spec.summary
89
- s.description = gem_spec.description
90
- s.files = %w(LICENSE COPYING README.md CHANGELOG.md Rakefile)
91
- s.license = gem_spec.license
68
+ java_gem_spec = gem_spec.dup.tap do |s|
69
+ s.files.reject! { |f| File.fnmatch?("ext/*", f) }
70
+ s.extensions = []
92
71
  s.platform = 'java'
93
72
  end
94
73
 
@@ -101,7 +80,7 @@ end
101
80
 
102
81
  task 'gem:java' => 'java:gem'
103
82
 
104
- unless java?
83
+ if RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx'
105
84
  require 'rake/extensiontask'
106
85
  Rake::ExtensionTask.new('ffi_c', gem_spec) do |ext|
107
86
  ext.name = 'ffi_c' # indicate the name of the extension.
@@ -124,13 +103,17 @@ unless java?
124
103
  sh "x86_64-w64-mingw32-strip -S build/x64-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/ffi_c.so"
125
104
  end
126
105
  end
106
+ else
107
+ task :compile do
108
+ STDERR.puts "Nothing to compile on #{RUBY_ENGINE}"
109
+ end
127
110
  end
128
111
 
129
112
  desc "build a windows gem without all the ceremony"
130
113
  task "gem:windows" do
131
114
  require "rake_compiler_dock"
132
115
  sh "bundle package"
133
- RakeCompilerDock.sh "sudo apt-get update && sudo apt-get install -y libltdl-dev && bundle --local && rake cross native gem MAKE='nice make -j`nproc`'"
116
+ RakeCompilerDock.sh "sudo apt-get update && sudo apt-get install -y libltdl-dev && bundle --local && rake cross native gem MAKE='nice make -j`nproc`' RUBY_CC_VERSION=${RUBY_CC_VERSION/:2.2.2/}"
134
117
  end
135
118
 
136
119
  directory "ext/ffi_c/libffi"
@@ -158,16 +141,15 @@ end.each do |f|
158
141
  end
159
142
  end
160
143
 
161
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), 'lib')
162
- require 'ffi/platform'
144
+ require_relative "lib/ffi/platform"
163
145
  types_conf = File.expand_path(File.join(FFI::Platform::CONF_DIR, 'types.conf'))
164
146
  logfile = File.join(File.dirname(__FILE__), 'types_log')
165
147
 
166
- file types_conf => File.join("lib", "ffi", "version.rb") do |task|
148
+ task types_conf do |task|
167
149
  require 'fileutils'
168
- require 'ffi/tools/types_generator'
150
+ require_relative "lib/ffi/tools/types_generator"
169
151
  options = {}
170
- FileUtils.mkdir_p(File.dirname(task.name), { :mode => 0755 })
152
+ FileUtils.mkdir_p(File.dirname(task.name), mode: 0755 )
171
153
  File.open(task.name, File::CREAT|File::TRUNC|File::RDWR, 0644) do |f|
172
154
  f.puts FFI::TypesGenerator.generate(options)
173
155
  end
@@ -177,8 +159,7 @@ file types_conf => File.join("lib", "ffi", "version.rb") do |task|
177
159
  end
178
160
 
179
161
  desc "Create or update type information for platform #{FFI::Platform::NAME}"
180
- task :types_conf => types_conf do
181
- end
162
+ task :types_conf => types_conf
182
163
 
183
164
  Gem::Tasks.new do |t|
184
165
  t.scm.tag.format = '%s'
@@ -34,10 +34,10 @@ Gem::Specification.new do |s|
34
34
  s.rdoc_options = %w[--exclude=ext/ffi_c/.*\.o$ --exclude=ffi_c\.(bundle|so)$]
35
35
  s.license = 'BSD-3-Clause'
36
36
  s.require_paths << 'ext/ffi_c'
37
- s.required_ruby_version = '>= 2.0'
38
- s.add_development_dependency 'rake', '~> 12.1'
37
+ s.required_ruby_version = '>= 2.3'
38
+ s.add_development_dependency 'rake', '~> 13.0'
39
39
  s.add_development_dependency 'rake-compiler', '~> 1.0'
40
- s.add_development_dependency 'rake-compiler-dock', '~> 0.7.0'
40
+ s.add_development_dependency 'rake-compiler-dock', '~> 1.0'
41
41
  s.add_development_dependency 'rspec', '~> 2.14.1'
42
42
  s.add_development_dependency 'rubygems-tasks', "~> 0.2.4"
43
43
  end
data/lib/ffi.rb CHANGED
@@ -1,4 +1,4 @@
1
- if !defined?(RUBY_ENGINE) || RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx'
1
+ if RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx'
2
2
  Object.send(:remove_const, :FFI) if defined?(::FFI)
3
3
  begin
4
4
  require RUBY_VERSION.split('.')[0, 2].join('.') + '/ffi_c'
@@ -8,7 +8,15 @@ if !defined?(RUBY_ENGINE) || RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx'
8
8
 
9
9
  require 'ffi/ffi'
10
10
 
11
- elsif defined?(RUBY_ENGINE)
11
+ elsif RUBY_ENGINE == 'jruby' && Gem::Version.new(RUBY_ENGINE_VERSION) >= Gem::Version.new("9.3.pre")
12
+ JRuby::Util.load_ext("org.jruby.ext.ffi.FFIService")
13
+ require 'ffi/ffi'
14
+
15
+ elsif RUBY_ENGINE == 'truffleruby' && Gem::Version.new(RUBY_ENGINE_VERSION) >= Gem::Version.new("20.1.0-dev-a")
16
+ require 'truffleruby/ffi_backend'
17
+ require 'ffi/ffi'
18
+
19
+ else
12
20
  # Remove the ffi gem dir from the load path, then reload the internal ffi implementation
13
21
  $LOAD_PATH.delete(File.dirname(__FILE__))
14
22
  $LOAD_PATH.delete(File.join(File.dirname(__FILE__), 'ffi'))
@@ -43,3 +43,4 @@ require 'ffi/io'
43
43
  require 'ffi/autopointer'
44
44
  require 'ffi/variadic'
45
45
  require 'ffi/enum'
46
+ require 'ffi/version'
@@ -394,7 +394,11 @@ module FFI
394
394
  options = Hash.new
395
395
  options[:convention] = ffi_convention
396
396
  options[:enums] = @ffi_enums if defined?(@ffi_enums)
397
- cb = FFI::CallbackInfo.new(find_type(ret), native_params, options)
397
+ ret_type = find_type(ret)
398
+ if ret_type == Type::STRING
399
+ raise TypeError, ":string is not allowed as return type of callbacks"
400
+ end
401
+ cb = FFI::CallbackInfo.new(ret_type, native_params, options)
398
402
 
399
403
  # Add to the symbol -> type map (unless there was no name)
400
404
  unless name.nil?