ffi 1.12.2-x64-mingw32 → 1.14.2-x64-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.
Files changed (52) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +82 -0
  3. data/Gemfile +4 -2
  4. data/README.md +10 -2
  5. data/Rakefile +31 -43
  6. data/ffi.gemspec +2 -2
  7. data/lib/2.3/ffi_c.so +0 -0
  8. data/lib/2.4/ffi_c.so +0 -0
  9. data/lib/2.5/ffi_c.so +0 -0
  10. data/lib/2.6/ffi_c.so +0 -0
  11. data/lib/2.7/ffi_c.so +0 -0
  12. data/lib/3.0/ffi_c.so +0 -0
  13. data/lib/ffi.rb +10 -2
  14. data/lib/ffi/abstract_memory.rb +44 -0
  15. data/lib/ffi/autopointer.rb +1 -1
  16. data/lib/ffi/ffi.rb +1 -0
  17. data/lib/ffi/io.rb +3 -3
  18. data/lib/ffi/library.rb +6 -2
  19. data/lib/ffi/managedstruct.rb +2 -2
  20. data/lib/ffi/platform.rb +21 -8
  21. data/lib/ffi/platform/aarch64-darwin/types.conf +130 -0
  22. data/lib/ffi/platform/aarch64-openbsd/types.conf +134 -0
  23. data/lib/ffi/platform/arm-linux/types.conf +32 -4
  24. data/lib/ffi/platform/i386-windows/types.conf +26 -79
  25. data/lib/ffi/platform/powerpc-linux/types.conf +32 -2
  26. data/lib/ffi/platform/powerpc-openbsd/types.conf +156 -0
  27. data/lib/ffi/platform/sparcv9-openbsd/types.conf +156 -0
  28. data/lib/ffi/platform/x86_64-darwin/types.conf +4 -0
  29. data/lib/ffi/platform/x86_64-dragonflybsd/types.conf +4 -22
  30. data/lib/ffi/platform/x86_64-haiku/types.conf +117 -0
  31. data/lib/ffi/platform/x86_64-linux/types.conf +21 -0
  32. data/lib/ffi/platform/x86_64-msys/types.conf +119 -0
  33. data/lib/ffi/platform/x86_64-windows/types.conf +10 -78
  34. data/lib/ffi/pointer.rb +21 -14
  35. data/lib/ffi/struct.rb +8 -2
  36. data/lib/ffi/tools/types_generator.rb +2 -0
  37. data/lib/ffi/variadic.rb +1 -1
  38. data/lib/ffi/version.rb +1 -1
  39. data/samples/getlogin.rb +1 -1
  40. data/samples/getpid.rb +1 -1
  41. data/samples/gettimeofday.rb +8 -8
  42. data/samples/hello.rb +2 -1
  43. data/samples/inotify.rb +1 -1
  44. data/samples/pty.rb +1 -2
  45. data/samples/qsort.rb +0 -1
  46. metadata +13 -12
  47. data/.appveyor.yml +0 -27
  48. data/.gitignore +0 -25
  49. data/.gitmodules +0 -4
  50. data/.travis.yml +0 -44
  51. data/.yardopts +0 -5
  52. data/samples/sample_helper.rb +0 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6fe929f714bffd7ae2692dcfe1ce4b3b58d6279e857db53186515484cee8f441
4
- data.tar.gz: 0f14cf5580c753abed78b6522a481ef4b5ba93af584eda2dcd3837c02c6c612f
3
+ metadata.gz: 236cd3020d1353d3095641347f2051d41616189c82ad9d55dba6842f449bc7a4
4
+ data.tar.gz: e0c84aa3a13297b586a9a3a0b7d2b4a437f0bafd1c7cf9bc0b7c1d6e82d271b6
5
5
  SHA512:
6
- metadata.gz: fbba6d1e42858d437fced00e16e57c8b9940d1bfdb2638e0e18007f19e4d73072d45ba6b39db765a6c0e65b74b880dcf74335f349c87ca0998fcdb5f5b6dd9c9
7
- data.tar.gz: 83689909e9b90540f569e8d3634193e068de2cc216e2d7c04b77609b54f0750166e6dc6d487c5876d07c9f4c70465efd8cd4817340a31c7fab41d4db43237dac
6
+ metadata.gz: 2e43f7de46c434dfd5d75094c27f31b999c8a97cdb64189acfa07f91f850ad882da31baf5b7a644909a6ca3c82f7bd954b8113cd35dd3209d3a95cfed630f697
7
+ data.tar.gz: dec0acbc945121691158a6c580dc85c5ebb6607f8c3f7be79fc0f9ab1ff5c03b01e9cbdd303049bbed863bc75ccfdbdc6930f98cb128e58e4f60862129fb2fd3
@@ -1,3 +1,85 @@
1
+ 1.14.2 / 2020-12-21
2
+ -------------------
3
+
4
+ Fixed:
5
+ * Fix builtin libffi on newer Ubuntu caused by an outdated Makefile.in . #863
6
+
7
+
8
+ 1.14.1 / 2020-12-19
9
+ -------------------
10
+
11
+ Changed:
12
+ * Revert changes to FFI::Pointer#write_string made in ffi-1.14.0.
13
+ It breaks compatibilty in a way that can cause hard to find errors. #857
14
+
15
+
16
+ 1.14.0 / 2020-12-18
17
+ -------------------
18
+
19
+ Added:
20
+ * Add types.conf for x86_64-msys, x86_64-haiku, aarch64-openbsd and aarch64-darwin (alias arm64-darwin)
21
+ * Add method AbstractMemory#size_limit? . #829
22
+ * Add new extconf option --enable-libffi-alloc which is enabled per default on Apple M1 (arm64-darwin).
23
+
24
+ Changed:
25
+ * Do NULL pointer check only when array length > 0 . #305
26
+ * Raise an error on an unknown order argument. #830
27
+ * Change FFI::Pointer#write_string to terminate with a NUL byte like other string methods. #805
28
+ * Update bundled libffi to latest master.
29
+
30
+ Removed:
31
+ * Remove win32/stdint.h and stdbool.h because of copyright issue. #693
32
+
33
+ Fixed:
34
+ * Fix possible UTF-8 load error in loader script interpretation. #792
35
+ * Fix segfault on non-array argument to #write_array_of_*
36
+ * Fix memory leak in MethodHandle . #815
37
+ * Fix possible segfault in combination with fiddle or other libffi using gems . #835
38
+ * Fix possibility to use ffi ruby gem with JRuby-9.3 . #763
39
+ * Fix a GC issue, when a callback Proc is used on more than 2 callback signatures. #820
40
+
41
+
42
+ 1.13.1 / 2020-06-09
43
+ -------------------
44
+
45
+ Changed:
46
+ * Revert use of `ucrtbase.dll` as default C library on Windows-MINGW.
47
+ `ucrtbase.dll` is still used on MSWIN target. #790
48
+ * Test for `ffi_prep_closure_loc()` to make sure we can use this function.
49
+ This fixes incorrect use of system libffi on MacOS Mojave (10.14). #787
50
+ * Update types.conf on x86_64-dragonflybsd
51
+
52
+
53
+ 1.13.0 / 2020-06-01
54
+ -------------------
55
+
56
+ Added:
57
+ * Add TruffleRuby support. Almost all specs are running on TruffleRuby and succeed. #768
58
+ * 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
59
+ * Add FFI::Platform::LONG_DOUBLE_SIZE
60
+ * Add bounds checks for writing to an inline char[] . #756
61
+ * Add long double as callback return value. #771
62
+ * 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
63
+ * Add new type definitions for powerpc-openbsd and sparcv9-openbsd. #775, #778
64
+
65
+ Changed:
66
+ * Raise required ruby version to >= 2.3.
67
+ * Lots of cleanups and improvements in library, specs and benchmarks.
68
+ * Fix a lot of compiler warnings at the C-extension
69
+ * Fix several install issues on MacOS:
70
+ * Look for libffi in SDK paths, since recent versions of macOS removed it from `/usr/include` . #757
71
+ * Fix error `ld: library not found for -lgcc_s.10.4`
72
+ * Don't built for i386 architecture as it is deprecated
73
+ * Several fixes for MSVC build on Windows. #779
74
+ * Use `ucrtbase.dll` as default C library on Windows instead of old `msvcrt.dll`. #779
75
+ * Update builtin libffi to fix a Powerpc issue with parameters of type long
76
+ * Allow unmodified sourcing of (the ruby code of) this gem in JRuby and TruffleRuby as a default gem. #747
77
+ * Improve check to detect if a module has a #find_type method suitable for FFI. This fixes compatibility with stdlib `mkmf` . #776
78
+
79
+ Removed:
80
+ * Reject callback with `:string` return type at definition, because it didn't work so far and is not save to use. #751, #782
81
+
82
+
1
83
  1.12.2 / 2020-02-01
2
84
  -------------------
3
85
 
data/Gemfile CHANGED
@@ -5,8 +5,10 @@ group :development do
5
5
  gem 'rake-compiler', '~> 1.0.3'
6
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
@@ -1,4 +1,4 @@
1
- # Ruby-FFI https://github.com/ffi/ffi/wiki [![Build Status](https://travis-ci.org/ffi/ffi.svg?branch=master)](https://travis-ci.org/ffi/ffi) [![Build status Windows](https://ci.appveyor.com/api/projects/status/r8wxn1sd4s794gg1/branch/master?svg=true)](https://ci.appveyor.com/project/larskanis/ffi-aofqa/branch/master)
1
+ # Ruby-FFI https://github.com/ffi/ffi/wiki [![Build Status](https://travis-ci.com/ffi/ffi.svg?branch=master)](https://travis-ci.com/ffi/ffi) [![Build status Windows](https://ci.appveyor.com/api/projects/status/r8wxn1sd4s794gg1/branch/master?svg=true)](https://ci.appveyor.com/project/larskanis/ffi-aofqa/branch/master)
2
2
 
3
3
  ## Description
4
4
 
@@ -66,10 +66,18 @@ From rubygems:
66
66
  or from the git repository on github:
67
67
 
68
68
  git clone git://github.com/ffi/ffi.git
69
- git submodule update --init --recursive
70
69
  cd ffi
70
+ git submodule update --init --recursive
71
+ bundle install
71
72
  rake install
72
73
 
74
+ ### Install options:
75
+
76
+ * `--enable-system-libffi` : Force usage of system libffi
77
+ * `--disable-system-libffi` : Force usage of builtin libffi
78
+ * `--enable-libffi-alloc` : Force closure allocation by libffi
79
+ * `--disable-libffi-alloc` : Force closure allocation by builtin method
80
+
73
81
  ## License
74
82
 
75
83
  The ffi library is covered by the BSD license, also see the LICENSE file.
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"
@@ -50,6 +37,13 @@ CLEAN.include "pkg/ffi-*-{mingw32,java}"
50
37
  CLEAN.include 'lib/1.*'
51
38
  CLEAN.include 'lib/2.*'
52
39
 
40
+ # clean all shipped files, that are not in git
41
+ CLEAN.include(
42
+ gem_spec.files -
43
+ `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0").map { |f| File.join("ext/ffi_c/libffi", f) } -
44
+ `git ls-files -z`.split("\x0")
45
+ )
46
+
53
47
  task :distclean => :clobber
54
48
 
55
49
  desc "Test the extension"
@@ -58,37 +52,29 @@ task :test => [ :spec ]
58
52
 
59
53
  namespace :bench do
60
54
  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" }
55
+ bench_files = Dir["bench/bench_*.rb"].sort.reject { |f| f == "bench/bench_helper.rb" }
63
56
  bench_files.each do |bench|
64
- task File.basename(bench, ".rb")[6..-1] => TEST_DEPS do
65
- sh %{#{Gem.ruby} #{bench_libs} #{bench} #{ITER}}
57
+ task File.basename(bench, ".rb")[6..-1] => :compile do
58
+ sh %{#{Gem.ruby} #{bench} #{ITER}}
66
59
  end
67
60
  end
68
- task :all => TEST_DEPS do
61
+ task :all => :compile do
69
62
  bench_files.each do |bench|
70
- sh %{#{Gem.ruby} #{bench_libs} #{bench}}
63
+ sh %{#{Gem.ruby} #{bench}}
71
64
  end
72
65
  end
73
66
  end
74
67
 
75
- task 'spec:run' => TEST_DEPS
76
- task 'spec:specdoc' => TEST_DEPS
68
+ task 'spec:run' => :compile
69
+ task 'spec:specdoc' => :compile
77
70
 
78
71
  task :default => :spec
79
72
 
80
73
  namespace 'java' do
81
74
 
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
75
+ java_gem_spec = gem_spec.dup.tap do |s|
76
+ s.files.reject! { |f| File.fnmatch?("ext/*", f) }
77
+ s.extensions = []
92
78
  s.platform = 'java'
93
79
  end
94
80
 
@@ -101,7 +87,7 @@ end
101
87
 
102
88
  task 'gem:java' => 'java:gem'
103
89
 
104
- unless java?
90
+ if RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx'
105
91
  require 'rake/extensiontask'
106
92
  Rake::ExtensionTask.new('ffi_c', gem_spec) do |ext|
107
93
  ext.name = 'ffi_c' # indicate the name of the extension.
@@ -124,13 +110,17 @@ unless java?
124
110
  sh "x86_64-w64-mingw32-strip -S build/x64-mingw32/stage/lib/#{ruby_version[/^\d+\.\d+/]}/ffi_c.so"
125
111
  end
126
112
  end
113
+ else
114
+ task :compile do
115
+ STDERR.puts "Nothing to compile on #{RUBY_ENGINE}"
116
+ end
127
117
  end
128
118
 
129
119
  desc "build a windows gem without all the ceremony"
130
120
  task "gem:windows" do
131
121
  require "rake_compiler_dock"
132
122
  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`'"
123
+ 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
124
  end
135
125
 
136
126
  directory "ext/ffi_c/libffi"
@@ -158,16 +148,15 @@ end.each do |f|
158
148
  end
159
149
  end
160
150
 
161
- $LOAD_PATH.unshift File.join(File.dirname(__FILE__), 'lib')
162
- require 'ffi/platform'
151
+ require_relative "lib/ffi/platform"
163
152
  types_conf = File.expand_path(File.join(FFI::Platform::CONF_DIR, 'types.conf'))
164
153
  logfile = File.join(File.dirname(__FILE__), 'types_log')
165
154
 
166
- file types_conf => File.join("lib", "ffi", "version.rb") do |task|
155
+ task types_conf do |task|
167
156
  require 'fileutils'
168
- require 'ffi/tools/types_generator'
157
+ require_relative "lib/ffi/tools/types_generator"
169
158
  options = {}
170
- FileUtils.mkdir_p(File.dirname(task.name), { :mode => 0755 })
159
+ FileUtils.mkdir_p(File.dirname(task.name), mode: 0755 )
171
160
  File.open(task.name, File::CREAT|File::TRUNC|File::RDWR, 0644) do |f|
172
161
  f.puts FFI::TypesGenerator.generate(options)
173
162
  end
@@ -177,8 +166,7 @@ file types_conf => File.join("lib", "ffi", "version.rb") do |task|
177
166
  end
178
167
 
179
168
  desc "Create or update type information for platform #{FFI::Platform::NAME}"
180
- task :types_conf => types_conf do
181
- end
169
+ task :types_conf => types_conf
182
170
 
183
171
  Gem::Tasks.new do |t|
184
172
  t.scm.tag.format = '%s'
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.metadata['mailing_list_uri'] = 'http://groups.google.com/group/ruby-ffi'
18
18
  end
19
19
  s.files = `git ls-files -z`.split("\x0").reject do |f|
20
- f =~ /^(bench|gen|libtest|nbproject|spec)/
20
+ f =~ /^(\.|bench|gen|libtest|nbproject|spec)/
21
21
  end
22
22
 
23
23
  # Add libffi git files
@@ -34,7 +34,7 @@ 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'
37
+ s.required_ruby_version = '>= 2.3'
38
38
  s.add_development_dependency 'rake', '~> 13.0'
39
39
  s.add_development_dependency 'rake-compiler', '~> 1.0'
40
40
  s.add_development_dependency 'rake-compiler-dock', '~> 1.0'
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
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' && (RUBY_ENGINE_VERSION.split('.').map(&:to_i) <=> [9, 3]) >= 0
12
+ JRuby::Util.load_ext("org.jruby.ext.ffi.FFIService")
13
+ require 'ffi/ffi'
14
+
15
+ elsif RUBY_ENGINE == 'truffleruby' && (RUBY_ENGINE_VERSION.split('.').map(&:to_i) <=> [20, 1, 0]) >= 0
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'))
@@ -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
@@ -117,7 +117,7 @@ module FFI
117
117
  end
118
118
 
119
119
  # @abstract Base class for {AutoPointer}'s releasers.
120
- #
120
+ #
121
121
  # All subclasses of Releaser should define a +#release(ptr)+ method.
122
122
  # A releaser is an object in charge of release an {AutoPointer}.
123
123
  class Releaser
@@ -33,6 +33,7 @@ require 'ffi/data_converter'
33
33
  require 'ffi/types'
34
34
  require 'ffi/library'
35
35
  require 'ffi/errno'
36
+ require 'ffi/abstract_memory'
36
37
  require 'ffi/pointer'
37
38
  require 'ffi/memorypointer'
38
39
  require 'ffi/struct'
@@ -29,7 +29,7 @@
29
29
  # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.#
30
30
 
31
31
  module FFI
32
-
32
+
33
33
  # This module implements a couple of class methods to play with IO.
34
34
  module IO
35
35
  # @param [Integer] fd file decriptor
@@ -42,12 +42,12 @@ module FFI
42
42
 
43
43
  # @param [#read] io io to read from
44
44
  # @param [AbstractMemory] buf destination for data read from +io+
45
- # @param [nil, Numeric] len maximul number of bytes to read from +io+. If +nil+,
45
+ # @param [nil, Numeric] len maximul number of bytes to read from +io+. If +nil+,
46
46
  # read until end of file.
47
47
  # @return [Numeric] length really read, in bytes
48
48
  #
49
49
  # A version of IO#read that reads data from an IO and put then into a native buffer.
50
- #
50
+ #
51
51
  # This will be optimized at some future time to eliminate the double copy.
52
52
  #
53
53
  def self.native_read(io, buf, len)
@@ -115,7 +115,7 @@ module FFI
115
115
  rescue Exception => ex
116
116
  ldscript = false
117
117
  if ex.message =~ /(([^ \t()])+\.so([^ \t:()])*):([ \t])*(invalid ELF header|file too short|invalid file format)/
118
- if File.read($1) =~ /(?:GROUP|INPUT) *\( *([^ \)]+)/
118
+ if File.binread($1) =~ /(?:GROUP|INPUT) *\( *([^ \)]+)/
119
119
  libname = $1
120
120
  ldscript = true
121
121
  end
@@ -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?