ffi 1.12.2-x64-mingw32 → 1.14.2-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.
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?