ffi 1.16.3 → 1.17.0.rc1

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 (91) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +28 -0
  4. data/Gemfile +9 -2
  5. data/README.md +1 -1
  6. data/Rakefile +17 -5
  7. data/ext/ffi_c/AbstractMemory.c +38 -38
  8. data/ext/ffi_c/ArrayType.c +2 -2
  9. data/ext/ffi_c/Buffer.c +4 -4
  10. data/ext/ffi_c/Call.c +12 -6
  11. data/ext/ffi_c/Call.h +3 -2
  12. data/ext/ffi_c/DynamicLibrary.c +2 -2
  13. data/ext/ffi_c/LastError.c +4 -4
  14. data/ext/ffi_c/MemoryPointer.c +2 -2
  15. data/ext/ffi_c/Pointer.c +14 -11
  16. data/ext/ffi_c/Struct.c +11 -4
  17. data/ext/ffi_c/StructLayout.c +6 -6
  18. data/ext/ffi_c/Type.c +17 -16
  19. data/ext/ffi_c/Types.c +7 -1
  20. data/ext/ffi_c/Types.h +0 -1
  21. data/ext/ffi_c/Variadic.c +5 -2
  22. data/ext/ffi_c/libffi/.allow-ai-service +0 -0
  23. data/ext/ffi_c/libffi/.github/workflows/build.yml +34 -15
  24. data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +2 -1
  25. data/ext/ffi_c/libffi/LICENSE +1 -1
  26. data/ext/ffi_c/libffi/README.md +10 -5
  27. data/ext/ffi_c/libffi/configure +15 -15
  28. data/ext/ffi_c/libffi/configure.ac +2 -2
  29. data/ext/ffi_c/libffi/configure.host +1 -1
  30. data/ext/ffi_c/libffi/doc/libffi.texi +1 -1
  31. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  32. data/ext/ffi_c/libffi/include/ffi.h.in +2 -11
  33. data/ext/ffi_c/libffi/include/ffi_common.h +4 -2
  34. data/ext/ffi_c/libffi/libffi.map.in +5 -0
  35. data/ext/ffi_c/libffi/libtool-version +1 -1
  36. data/ext/ffi_c/libffi/ltmain.sh +8 -20
  37. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +1 -1
  38. data/ext/ffi_c/libffi/src/aarch64/ffi.c +26 -13
  39. data/ext/ffi_c/libffi/src/aarch64/sysv.S +198 -46
  40. data/ext/ffi_c/libffi/src/closures.c +3 -3
  41. data/ext/ffi_c/libffi/src/debug.c +2 -2
  42. data/ext/ffi_c/libffi/src/dlmalloc.c +1 -1
  43. data/ext/ffi_c/libffi/src/loongarch64/ffi.c +3 -0
  44. data/ext/ffi_c/libffi/src/mips/ffi.c +12 -4
  45. data/ext/ffi_c/libffi/src/mips/n32.S +65 -14
  46. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +36 -24
  47. data/ext/ffi_c/libffi/src/sparc/ffi64.c +7 -1
  48. data/ext/ffi_c/libffi/src/tramp.c +1 -1
  49. data/ext/ffi_c/libffi/src/types.c +4 -6
  50. data/ext/ffi_c/libffi/src/wasm32/ffi.c +13 -0
  51. data/ext/ffi_c/libffi/src/x86/ffiw64.c +1 -1
  52. data/ext/ffi_c/libffi/testsuite/Makefile.am +79 -127
  53. data/ext/ffi_c/libffi/testsuite/Makefile.in +79 -127
  54. data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +6 -0
  55. data/ext/ffi_c/libffi/testsuite/libffi.call/callback.c +99 -0
  56. data/ext/ffi_c/libffi/testsuite/libffi.call/callback2.c +108 -0
  57. data/ext/ffi_c/libffi/testsuite/libffi.call/callback3.c +114 -0
  58. data/ext/ffi_c/libffi/testsuite/libffi.call/callback4.c +119 -0
  59. data/ext/ffi_c/libffi.darwin.mk +2 -2
  60. data/lib/ffi/dynamic_library.rb +34 -5
  61. data/lib/ffi/enum.rb +0 -1
  62. data/lib/ffi/function.rb +1 -1
  63. data/lib/ffi/io.rb +2 -2
  64. data/lib/ffi/library.rb +23 -23
  65. data/lib/ffi/platform/aarch64-linux/types.conf +74 -3
  66. data/lib/ffi/pointer.rb +6 -6
  67. data/lib/ffi/struct.rb +4 -4
  68. data/lib/ffi/struct_layout.rb +2 -2
  69. data/lib/ffi/struct_layout_builder.rb +8 -8
  70. data/lib/ffi/types.rb +51 -49
  71. data/lib/ffi/version.rb +1 -1
  72. data/sig/ffi/abstract_memory.rbs +164 -0
  73. data/sig/ffi/auto_pointer.rbs +27 -0
  74. data/sig/ffi/buffer.rbs +18 -0
  75. data/sig/ffi/data_converter.rbs +10 -0
  76. data/sig/ffi/dynamic_library.rbs +9 -0
  77. data/sig/ffi/enum.rbs +38 -0
  78. data/sig/ffi/function.rbs +39 -0
  79. data/sig/ffi/library.rbs +42 -0
  80. data/sig/ffi/native_type.rbs +86 -0
  81. data/sig/ffi/pointer.rbs +42 -0
  82. data/sig/ffi/struct.rbs +76 -0
  83. data/sig/ffi/struct_by_reference.rbs +11 -0
  84. data/sig/ffi/struct_by_value.rbs +7 -0
  85. data/sig/ffi/struct_layout.rbs +9 -0
  86. data/sig/ffi/struct_layout_builder.rbs +5 -0
  87. data/sig/ffi/type.rbs +39 -0
  88. data/sig/ffi.rbs +26 -0
  89. data.tar.gz.sig +0 -0
  90. metadata +37 -15
  91. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5920bab18c2bfca946febdf9d31aae894569dd1a293d816631a077696f7db8fa
4
- data.tar.gz: 7aa17dd90399d15bd149573ab4b9857907028beae4f84409f76f50e9508aaba2
3
+ metadata.gz: 5ea15fd47a8241bb9bab7086d46ac6bc6ac752c383dc748c616d298f742ed0d0
4
+ data.tar.gz: 5253f331c7fea5590f4499133cac83dbeba5d833825339f4fc45cb57f0c94bcd
5
5
  SHA512:
6
- metadata.gz: dd42730736988cac47f45485f4a8b200c26759066fe156a89ef7736cd6ac80f404e8aaced28a8f10f9b22b43436ed3e248cb191f1c457ccabc19299b91b49174
7
- data.tar.gz: '0252969e7a324d530c1d704e2d408f1bd7283f320de90b4c98f20bb49f9d32733ac45609d78a40f821cd5335e102e80576fd446cd5de863babea041d0eb3c780'
6
+ metadata.gz: e42a6fc177d1302b64a07b6b93a20bf9e0ad4e692a7ab2c16f1f5fbf65ce795fe044187befdcc5859ecb8f3870acac3ca3b687e5e96773f448d0b16e6a1d7710
7
+ data.tar.gz: 2efdb5b63defea13f90d5ec7a7f8c7fb85e3cab24fc84320c8e061017946687f0238a68a57375a4ce76aa67f041b6b65966170d4d98d5ed4cac4d1dbd3dc71df
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -1,3 +1,31 @@
1
+ 1.17.0.rc1 / 2024-04-07
2
+ -------------------
3
+
4
+ Fixed:
5
+ * Fix type definitions on `aarch64-linux`. #1067, #1066
6
+ * Use RB_TEST for `Pointer.autorelease=` . #1065
7
+ So that `false` and `nil` are treated as falsey and anything else as truthy.
8
+ * Replace Fixnum by Integer. #1064
9
+ Fixnum is no longer present in the ruby language.
10
+ * Update `FFI::NativeType` doc. #1061
11
+ * Store FFI::Type::Mapped of FFI::StrPtrConverter in global instead of custom type map
12
+ * Various documentation fixes. #1042
13
+ * Update `FFI::Pointer#==` to return `false` if a pointer is compared to a non-pointer object, which is the expected behavior. #1083
14
+ * Avoid warning about undefined wariable `@ffi_functions` #1085
15
+ * Fix a very unlikely GC bug when using a callback block. # 1089
16
+
17
+ Added:
18
+ * Provide binary gems for many platforms. #990
19
+ * Add Windows fat binary gem for Ruby-3.3
20
+ * Add RBS type definitions for many user facing parts of the FFI API. #1042
21
+ * Improve fallback search path logic. #1088
22
+ Respect LD_LIBRARY_PATH and DYLD_LIBRARY_PATH on Macos.
23
+ * Update libffi to current git master branch.
24
+
25
+ Removed:
26
+ * Remove `enum CHAR_ARRAY` which is no longer used. #1063
27
+
28
+
1
29
  1.16.3 / 2023-10-04
2
30
  -------------------
3
31
 
data/Gemfile CHANGED
@@ -1,14 +1,21 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  group :development do
4
+ gem 'bigdecimal' unless RUBY_VERSION =~ /^2\.[4567]|^3\.[012]\./ # necessary on ruby-3.3+
5
+ gem 'bundler', '>= 1.16', '< 3'
4
6
  gem 'rake', '~> 13.0'
5
7
  gem 'rake-compiler', '~> 1.1'
6
- gem 'rake-compiler-dock', '~> 1.0'
8
+ gem 'rake-compiler-dock', '~> 1.0.pre'
7
9
  gem 'rspec', '~> 3.0'
8
- gem 'bundler', '>= 1.16', '< 3'
9
10
  end
10
11
 
11
12
  group :doc do
12
13
  gem 'kramdown'
13
14
  gem 'yard', '~> 0.9'
14
15
  end
16
+
17
+ group :type_check do
18
+ if RUBY_VERSION >= "2.6" && %w[ ruby truffleruby ].include?(RUBY_ENGINE)
19
+ gem 'rbs', '~> 3.0'
20
+ end
21
+ end
data/README.md CHANGED
@@ -114,7 +114,7 @@ The following people have submitted code, bug reports, or otherwise contributed
114
114
  * Jurij Smakov <jurij@wooyd.org>
115
115
  * KISHIMOTO, Makoto <ksmakoto@dd.iij4u.or.jp>
116
116
  * Kim Burgestrand <kim@burgestrand.se>
117
- * Lars Kanis <kanis@comcard.de>
117
+ * Lars Kanis <lars@greiz-reinsdorf.de>
118
118
  * Luc Heinrich <luc@honk-honk.com>
119
119
  * Luis Lavena <luislavena@gmail.com>
120
120
  * Matijs van Zuijlen <matijs@matijs.net>
data/Rakefile CHANGED
@@ -13,7 +13,7 @@ BUILD_EXT_DIR = File.join(BUILD_DIR, "#{RbConfig::CONFIG['arch']}", 'ffi_c', RUB
13
13
 
14
14
  gem_spec = Bundler.load_gemspec('ffi.gemspec')
15
15
 
16
- RSpec::Core::RakeTask.new(:spec => :compile) do |config|
16
+ RSpec::Core::RakeTask.new(:spec) do |config|
17
17
  config.rspec_opts = YAML.load_file 'spec/spec.opts'
18
18
  end
19
19
 
@@ -84,10 +84,22 @@ end
84
84
  task 'gem:java' => 'java:gem'
85
85
 
86
86
  FfiGemHelper.install_tasks
87
- # Register windows gems to be pushed to rubygems.org
88
- Bundler::GemHelper.instance.cross_platforms = %w[x86-mingw32 x64-mingw-ucrt x64-mingw32]
89
- # These platforms are not yet enabled, since there are issues on musl-based distors (alpine-linux):
90
- # + %w[x86-linux x86_64-linux arm-linux aarch64-linux x86_64-darwin arm64-darwin]
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
+ x86_64-darwin
101
+ arm64-darwin
102
+ ]
91
103
 
92
104
  if RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx'
93
105
  require 'rake/extensiontask'
@@ -324,7 +324,7 @@ memory_clear(VALUE self)
324
324
  /*
325
325
  * call-seq: memory.size
326
326
  * Return memory size in bytes (alias: #total)
327
- * @return [Numeric]
327
+ * @return [Integer]
328
328
  */
329
329
  static VALUE
330
330
  memory_size(VALUE self)
@@ -340,7 +340,7 @@ memory_size(VALUE self)
340
340
  * call-seq: memory.get(type, offset)
341
341
  * Return data of given type contained in memory.
342
342
  * @param [Symbol, Type] type_name type of data to get
343
- * @param [Numeric] offset point in buffer to start from
343
+ * @param [Integer] offset point in buffer to start from
344
344
  * @return [Object]
345
345
  * @raise {ArgumentError} if type is not supported
346
346
  */
@@ -373,7 +373,7 @@ undefined_type: {
373
373
  /*
374
374
  * call-seq: memory.put(type, offset, value)
375
375
  * @param [Symbol, Type] type_name type of data to put
376
- * @param [Numeric] offset point in buffer to start from
376
+ * @param [Integer] offset point in buffer to start from
377
377
  * @return [nil]
378
378
  * @raise {ArgumentError} if type is not supported
379
379
  */
@@ -407,8 +407,8 @@ undefined_type: {
407
407
  /*
408
408
  * call-seq: memory.get_string(offset, length=nil)
409
409
  * Return string contained in memory.
410
- * @param [Numeric] offset point in buffer to start from
411
- * @param [Numeric] length string's length in bytes. If nil, a (memory size - offset) length string is returned).
410
+ * @param [Integer] offset point in buffer to start from
411
+ * @param [Integer] length string's length in bytes. If nil, a (memory size - offset) length string is returned).
412
412
  * @return [String]
413
413
  * @raise {IndexError} if +length+ is too great
414
414
  * @raise {NullPointerError} if memory not initialized
@@ -435,8 +435,8 @@ memory_get_string(int argc, VALUE* argv, VALUE self)
435
435
  /*
436
436
  * call-seq: memory.get_array_of_string(offset, count=nil)
437
437
  * Return an array of strings contained in memory.
438
- * @param [Numeric] offset point in memory to start from
439
- * @param [Numeric] count number of strings to get. If nil, return all strings
438
+ * @param [Integer] offset point in memory to start from
439
+ * @param [Integer] count number of strings to get. If nil, return all strings
440
440
  * @return [Array<String>]
441
441
  * @raise {IndexError} if +offset+ is too great
442
442
  * @raise {NullPointerError} if memory not initialized
@@ -485,7 +485,7 @@ memory_get_array_of_string(int argc, VALUE* argv, VALUE self)
485
485
  * call-seq: memory.read_array_of_string(count=nil)
486
486
  * Return an array of strings contained in memory. Same as:
487
487
  * memory.get_array_of_string(0, count)
488
- * @param [Numeric] count number of strings to get. If nil, return all strings
488
+ * @param [Integer] count number of strings to get. If nil, return all strings
489
489
  * @return [Array<String>]
490
490
  */
491
491
  static VALUE
@@ -505,7 +505,7 @@ memory_read_array_of_string(int argc, VALUE* argv, VALUE self)
505
505
 
506
506
  /*
507
507
  * call-seq: memory.put_string(offset, str)
508
- * @param [Numeric] offset
508
+ * @param [Integer] offset
509
509
  * @param [String] str
510
510
  * @return [self]
511
511
  * @raise {SecurityError} when writing unsafe string to memory
@@ -535,8 +535,8 @@ memory_put_string(VALUE self, VALUE offset, VALUE str)
535
535
  /*
536
536
  * call-seq: memory.get_bytes(offset, length)
537
537
  * Return string contained in memory.
538
- * @param [Numeric] offset point in buffer to start from
539
- * @param [Numeric] length string's length in bytes.
538
+ * @param [Integer] offset point in buffer to start from
539
+ * @param [Integer] length string's length in bytes.
540
540
  * @return [String]
541
541
  * @raise {IndexError} if +length+ is too great
542
542
  * @raise {NullPointerError} if memory not initialized
@@ -559,10 +559,10 @@ memory_get_bytes(VALUE self, VALUE offset, VALUE length)
559
559
  /*
560
560
  * call-seq: memory.put_bytes(offset, str, index=0, length=nil)
561
561
  * Put a string in memory.
562
- * @param [Numeric] offset point in buffer to start from
562
+ * @param [Integer] offset point in buffer to start from
563
563
  * @param [String] str string to put to memory
564
- * @param [Numeric] index
565
- * @param [Numeric] length string's length in bytes. If nil, a (memory size - offset) length string is returned).
564
+ * @param [Integer] index
565
+ * @param [Integer] length string's length in bytes. If nil, a (memory size - offset) length string is returned).
566
566
  * @return [self]
567
567
  * @raise {IndexError} if +length+ is too great
568
568
  * @raise {NullPointerError} if memory not initialized
@@ -601,7 +601,7 @@ memory_put_bytes(int argc, VALUE* argv, VALUE self)
601
601
 
602
602
  /*
603
603
  * call-seq: memory.read_bytes(length)
604
- * @param [Numeric] length of string to return
604
+ * @param [Integer] length of string to return
605
605
  * @return [String]
606
606
  * equivalent to :
607
607
  * memory.get_bytes(0, length)
@@ -615,8 +615,8 @@ memory_read_bytes(VALUE self, VALUE length)
615
615
  /*
616
616
  * call-seq: memory.write_bytes(str, index=0, length=nil)
617
617
  * @param [String] str string to put to memory
618
- * @param [Numeric] index
619
- * @param [Numeric] length string's length in bytes. If nil, a (memory size - offset) length string is returned).
618
+ * @param [Integer] index
619
+ * @param [Integer] length string's length in bytes. If nil, a (memory size - offset) length string is returned).
620
620
  * @return [self]
621
621
  * equivalent to :
622
622
  * memory.put_bytes(0, str, index, length)
@@ -637,7 +637,7 @@ memory_write_bytes(int argc, VALUE* argv, VALUE self)
637
637
 
638
638
  /*
639
639
  * call-seq: memory.type_size
640
- * @return [Numeric] type size in bytes
640
+ * @return [Integer] type size in bytes
641
641
  * Get the memory's type size.
642
642
  */
643
643
  static VALUE
@@ -653,7 +653,7 @@ memory_type_size(VALUE self)
653
653
  /*
654
654
  * Document-method: []
655
655
  * call-seq: memory[idx]
656
- * @param [Numeric] idx index to access in memory
656
+ * @param [Integer] idx index to access in memory
657
657
  * @return
658
658
  * Memory read accessor.
659
659
  */
@@ -861,8 +861,8 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
861
861
 
862
862
  /*
863
863
  * Document-method: put_float32
864
- * call-seq: memory.put_float32offset, value)
865
- * @param [Numeric] offset
864
+ * call-seq: memory.put_float32(offset, value)
865
+ * @param [Integer] offset
866
866
  * @param [Numeric] value
867
867
  * @return [self]
868
868
  * Put +value+ as a 32-bit float in memory at offset +offset+ (alias: #put_float).
@@ -871,7 +871,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
871
871
  /*
872
872
  * Document-method: get_float32
873
873
  * call-seq: memory.get_float32(offset)
874
- * @param [Numeric] offset
874
+ * @param [Integer] offset
875
875
  * @return [Float]
876
876
  * Get a 32-bit float from memory at offset +offset+ (alias: #get_float).
877
877
  */
@@ -902,7 +902,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
902
902
  /*
903
903
  * Document-method: put_array_of_float32
904
904
  * call-seq: memory.put_array_of_float32(offset, ary)
905
- * @param [Numeric] offset
905
+ * @param [Integer] offset
906
906
  * @param [Array<Numeric>] ary
907
907
  * @return [self]
908
908
  * Put values from +ary+ as 32-bit floats in memory from offset +offset+ (alias: #put_array_of_float).
@@ -911,8 +911,8 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
911
911
  /*
912
912
  * Document-method: get_array_of_float32
913
913
  * call-seq: memory.get_array_of_float32(offset, length)
914
- * @param [Numeric] offset
915
- * @param [Numeric] length number of Float to get
914
+ * @param [Integer] offset
915
+ * @param [Integer] length number of Float to get
916
916
  * @return [Array<Float>]
917
917
  * Get 32-bit floats in memory from offset +offset+ (alias: #get_array_of_float).
918
918
  */
@@ -931,7 +931,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
931
931
  /*
932
932
  * Document-method: read_array_of_float
933
933
  * call-seq: memory.read_array_of_float(length)
934
- * @param [Numeric] length number of Float to read
934
+ * @param [Integer] length number of Float to read
935
935
  * @return [Array<Float>]
936
936
  * Read 32-bit floats from memory.
937
937
  *
@@ -944,7 +944,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
944
944
  /*
945
945
  * Document-method: put_float64
946
946
  * call-seq: memory.put_float64(offset, value)
947
- * @param [Numeric] offset
947
+ * @param [Integer] offset
948
948
  * @param [Numeric] value
949
949
  * @return [self]
950
950
  * Put +value+ as a 64-bit float (double) in memory at offset +offset+ (alias: #put_double).
@@ -953,7 +953,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
953
953
  /*
954
954
  * Document-method: get_float64
955
955
  * call-seq: memory.get_float64(offset)
956
- * @param [Numeric] offset
956
+ * @param [Integer] offset
957
957
  * @return [Float]
958
958
  * Get a 64-bit float (double) from memory at offset +offset+ (alias: #get_double).
959
959
  */
@@ -984,7 +984,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
984
984
  /*
985
985
  * Document-method: put_array_of_float64
986
986
  * call-seq: memory.put_array_of_float64(offset, ary)
987
- * @param [Numeric] offset
987
+ * @param [Integer] offset
988
988
  * @param [Array<Numeric>] ary
989
989
  * @return [self]
990
990
  * Put values from +ary+ as 64-bit floats (doubles) in memory from offset +offset+ (alias: #put_array_of_double).
@@ -993,8 +993,8 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
993
993
  /*
994
994
  * Document-method: get_array_of_float64
995
995
  * call-seq: memory.get_array_of_float64(offset, length)
996
- * @param [Numeric] offset
997
- * @param [Numeric] length number of Float to get
996
+ * @param [Integer] offset
997
+ * @param [Integer] length number of Float to get
998
998
  * @return [Array<Float>]
999
999
  * Get 64-bit floats (doubles) in memory from offset +offset+ (alias: #get_array_of_double).
1000
1000
  */
@@ -1013,7 +1013,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
1013
1013
  /*
1014
1014
  * Document-method: read_array_of_double
1015
1015
  * call-seq: memory.read_array_of_double(length)
1016
- * @param [Numeric] length number of Float to read
1016
+ * @param [Integer] length number of Float to read
1017
1017
  * @return [Array<Float>]
1018
1018
  * Read 64-bit floats (doubles) from memory.
1019
1019
  *
@@ -1026,7 +1026,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
1026
1026
  /*
1027
1027
  * Document-method: put_pointer
1028
1028
  * call-seq: memory.put_pointer(offset, value)
1029
- * @param [Numeric] offset
1029
+ * @param [Integer] offset
1030
1030
  * @param [nil,Pointer, Integer, #to_ptr] value
1031
1031
  * @return [self]
1032
1032
  * Put +value+ in memory from +offset+..
@@ -1035,7 +1035,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
1035
1035
  /*
1036
1036
  * Document-method: get_pointer
1037
1037
  * call-seq: memory.get_pointer(offset)
1038
- * @param [Numeric] offset
1038
+ * @param [Integer] offset
1039
1039
  * @return [Pointer]
1040
1040
  * Get a {Pointer} to the memory from +offset+.
1041
1041
  */
@@ -1064,7 +1064,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
1064
1064
  /*
1065
1065
  * Document-method: put_array_of_pointer
1066
1066
  * call-seq: memory.put_array_of_pointer(offset, ary)
1067
- * @param [Numeric] offset
1067
+ * @param [Integer] offset
1068
1068
  * @param [Array<#to_ptr>] ary
1069
1069
  * @return [self]
1070
1070
  * Put an array of {Pointer} into memory from +offset+.
@@ -1073,8 +1073,8 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
1073
1073
  /*
1074
1074
  * Document-method: get_array_of_pointer
1075
1075
  * call-seq: memory.get_array_of_pointer(offset, length)
1076
- * @param [Numeric] offset
1077
- * @param [Numeric] length
1076
+ * @param [Integer] offset
1077
+ * @param [Integer] length
1078
1078
  * @return [Array<Pointer>]
1079
1079
  * Get an array of {Pointer} of length +length+ from +offset+.
1080
1080
  */
@@ -1093,7 +1093,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
1093
1093
  /*
1094
1094
  * Document-method: read_array_of_pointer
1095
1095
  * call-seq: memory.read_array_of_pointer(length)
1096
- * @param [Numeric] length
1096
+ * @param [Integer] length
1097
1097
  * @return [Array<Pointer>]
1098
1098
  * Read an array of {Pointer} of length +length+.
1099
1099
  *
@@ -110,7 +110,7 @@ array_type_memsize(const void *data)
110
110
  /*
111
111
  * call-seq: initialize(component_type, length)
112
112
  * @param [Type] component_type
113
- * @param [Numeric] length
113
+ * @param [Integer] length
114
114
  * @return [self]
115
115
  * A new instance of ArrayType.
116
116
  */
@@ -140,7 +140,7 @@ array_type_initialize(VALUE self, VALUE rbComponentType, VALUE rbLength)
140
140
 
141
141
  /*
142
142
  * call-seq: length
143
- * @return [Numeric]
143
+ * @return [Integer]
144
144
  * Get array's length
145
145
  */
146
146
  static VALUE
data/ext/ffi_c/Buffer.c CHANGED
@@ -114,7 +114,7 @@ buffer_release(void *data)
114
114
  /*
115
115
  * call-seq: initialize(size, count=1, clear=false)
116
116
  * @param [Integer, Symbol, #size] Type or size in bytes of a buffer cell
117
- * @param [Fixnum] count number of cell in the Buffer
117
+ * @param [Integer] count number of cell in the Buffer
118
118
  * @param [Boolean] clear if true, set the buffer to all-zero
119
119
  * @return [self]
120
120
  * @raise {NoMemoryError} if failed to allocate memory for Buffer
@@ -219,7 +219,7 @@ slice(VALUE self, long offset, long len)
219
219
 
220
220
  /*
221
221
  * call-seq: + offset
222
- * @param [Numeric] offset
222
+ * @param [Integer] offset
223
223
  * @return [Buffer] a new instance of Buffer pointing from offset until end of previous buffer.
224
224
  * Add a Buffer with an offset
225
225
  */
@@ -236,8 +236,8 @@ buffer_plus(VALUE self, VALUE rbOffset)
236
236
 
237
237
  /*
238
238
  * call-seq: slice(offset, length)
239
- * @param [Numeric] offset
240
- * @param [Numeric] length
239
+ * @param [Integer] offset
240
+ * @param [Integer] length
241
241
  * @return [Buffer] a new instance of Buffer
242
242
  * Slice an existing Buffer.
243
243
  */
data/ext/ffi_c/Call.c CHANGED
@@ -86,10 +86,11 @@ static inline void* getPointer(VALUE value, int type);
86
86
 
87
87
  static ID id_to_ptr, id_map_symbol, id_to_native;
88
88
 
89
- void
89
+ VALUE
90
90
  rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes,
91
91
  FFIStorage* paramStorage, void** ffiValues,
92
- VALUE* callbackParameters, int callbackCount, VALUE enums)
92
+ VALUE* callbackParameters, int callbackCount,
93
+ VALUE enums)
93
94
  {
94
95
  VALUE callbackProc = Qnil;
95
96
  FFIStorage* param = &paramStorage[0];
@@ -327,6 +328,7 @@ rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes,
327
328
  rb_raise(rb_eArgError, "Invalid parameter type: %d", paramType->nativeType);
328
329
  }
329
330
  }
331
+ return callbackProc;
330
332
  }
331
333
 
332
334
  static void *
@@ -362,6 +364,7 @@ rbffi_CallFunction(int argc, VALUE* argv, void* function, FunctionType* fnInfo)
362
364
  FFIStorage* params;
363
365
  VALUE rbReturnValue;
364
366
  rbffi_frame_t frame = { 0 };
367
+ VALUE callbackProc;
365
368
 
366
369
  retval = alloca(MAX(fnInfo->ffi_cif.rtype->size, FFI_SIZEOF_ARG));
367
370
 
@@ -379,9 +382,10 @@ rbffi_CallFunction(int argc, VALUE* argv, void* function, FunctionType* fnInfo)
379
382
  bc->params = params;
380
383
  bc->frame = &frame;
381
384
 
382
- rbffi_SetupCallParams(argc, argv,
385
+ callbackProc = rbffi_SetupCallParams(argc, argv,
383
386
  fnInfo->parameterCount, fnInfo->parameterTypes, params, ffiValues,
384
- fnInfo->callbackParameters, fnInfo->callbackCount, fnInfo->rbEnums);
387
+ fnInfo->callbackParameters, fnInfo->callbackCount,
388
+ fnInfo->rbEnums);
385
389
 
386
390
  rbffi_frame_push(&frame);
387
391
  rb_rescue2(rbffi_do_blocking_call, (VALUE) bc, rbffi_save_frame_exception, (VALUE) &frame, rb_eException, (VALUE) 0);
@@ -392,14 +396,16 @@ rbffi_CallFunction(int argc, VALUE* argv, void* function, FunctionType* fnInfo)
392
396
  ffiValues = ALLOCA_N(void *, fnInfo->parameterCount);
393
397
  params = ALLOCA_N(FFIStorage, fnInfo->parameterCount);
394
398
 
395
- rbffi_SetupCallParams(argc, argv,
399
+ callbackProc = rbffi_SetupCallParams(argc, argv,
396
400
  fnInfo->parameterCount, fnInfo->parameterTypes, params, ffiValues,
397
- fnInfo->callbackParameters, fnInfo->callbackCount, fnInfo->rbEnums);
401
+ fnInfo->callbackParameters, fnInfo->callbackCount,
402
+ fnInfo->rbEnums);
398
403
 
399
404
  rbffi_frame_push(&frame);
400
405
  ffi_call(&fnInfo->ffi_cif, FFI_FN(function), retval, ffiValues);
401
406
  rbffi_frame_pop(&frame);
402
407
  }
408
+ RB_GC_GUARD(callbackProc);
403
409
 
404
410
  if (unlikely(!fnInfo->ignoreErrno)) {
405
411
  rbffi_save_errno();
data/ext/ffi_c/Call.h CHANGED
@@ -73,9 +73,10 @@ typedef union {
73
73
 
74
74
  extern void rbffi_Call_Init(VALUE moduleFFI);
75
75
 
76
- extern void rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes,
76
+ extern VALUE rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes,
77
77
  FFIStorage* paramStorage, void** ffiValues,
78
- VALUE* callbackParameters, int callbackCount, VALUE enums);
78
+ VALUE* callbackParameters, int callbackCount,
79
+ VALUE enums);
79
80
 
80
81
  struct FunctionType_;
81
82
  extern VALUE rbffi_CallFunction(int argc, VALUE* argv, void* function, struct FunctionType_* fnInfo);
@@ -128,7 +128,7 @@ library_open(VALUE klass, VALUE libname, VALUE libflags)
128
128
  /*
129
129
  * call-seq: initialize(libname, libflags)
130
130
  * @param [String] libname name of library to open
131
- * @param [Fixnum] libflags flags for library to open
131
+ * @param [Integer] libflags flags for library to open
132
132
  * @return [FFI::DynamicLibrary]
133
133
  * @raise {LoadError} if +libname+ cannot be opened
134
134
  * A new DynamicLibrary instance.
@@ -232,7 +232,7 @@ dl_error(char* buf, int size)
232
232
 
233
233
  // Get the associated message
234
234
  LPSTR message = NULL;
235
- FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
235
+ FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
236
236
  NULL, error, 0, (LPSTR)&message, 0, NULL);
237
237
 
238
238
  // Update the passed in buffer
@@ -141,7 +141,7 @@ thread_data_get(void)
141
141
 
142
142
  /*
143
143
  * call-seq: error
144
- * @return [Numeric]
144
+ * @return [Integer]
145
145
  * Get +errno+ value.
146
146
  */
147
147
  static VALUE
@@ -153,7 +153,7 @@ get_last_error(VALUE self)
153
153
  #if defined(_WIN32) || defined(__CYGWIN__)
154
154
  /*
155
155
  * call-seq: winapi_error
156
- * @return [Numeric]
156
+ * @return [Integer]
157
157
  * Get +GetLastError()+ value. Only Windows or Cygwin.
158
158
  */
159
159
  static VALUE
@@ -166,7 +166,7 @@ get_last_winapi_error(VALUE self)
166
166
 
167
167
  /*
168
168
  * call-seq: error(error)
169
- * @param [Numeric] error
169
+ * @param [Integer] error
170
170
  * @return [nil]
171
171
  * Set +errno+ value.
172
172
  */
@@ -185,7 +185,7 @@ set_last_error(VALUE self, VALUE error)
185
185
  #if defined(_WIN32) || defined(__CYGWIN__)
186
186
  /*
187
187
  * call-seq: error(error)
188
- * @param [Numeric] error
188
+ * @param [Integer] error
189
189
  * @return [nil]
190
190
  * Set +GetLastError()+ value. Only on Windows and Cygwin.
191
191
  */
@@ -80,8 +80,8 @@ memptr_allocate(VALUE klass)
80
80
 
81
81
  /*
82
82
  * call-seq: initialize(size, count=1, clear=true)
83
- * @param [Fixnum, Bignum, Symbol, FFI::Type] size size of a memory cell (in bytes, or type whom size will be used)
84
- * @param [Numeric] count number of cells in memory
83
+ * @param [Integer, Symbol, FFI::Type] size size of a memory cell (in bytes, or type whom size will be used)
84
+ * @param [Integer] count number of cells in memory
85
85
  * @param [Boolean] clear set memory to all-zero if +true+
86
86
  * @return [self]
87
87
  * A new instance of FFI::MemoryPointer.
data/ext/ffi_c/Pointer.c CHANGED
@@ -95,12 +95,10 @@ ptr_allocate(VALUE klass)
95
95
  }
96
96
 
97
97
  /*
98
- * @overload initialize(pointer)
99
- * @param [Pointer] pointer another pointer to initialize from
100
- * Create a new pointer from another {Pointer}.
98
+ * @overload initialize(address)
101
99
  * @overload initialize(type, address)
102
- * @param [Type] type type for pointer
103
- * @param [Integer] address base address for pointer
100
+ * @param [Type] type Optional type for pointer (defaults to byte)
101
+ * @param [Pointer, Integer] address base address for pointer
104
102
  * Create a new pointer from a {Type} and a base address
105
103
  * @return [self]
106
104
  * A new instance of Pointer.
@@ -229,7 +227,7 @@ slice(VALUE self, long offset, long size)
229
227
  /*
230
228
  * Document-method: +
231
229
  * call-seq: ptr + offset
232
- * @param [Numeric] offset
230
+ * @param [Integer] offset
233
231
  * @return [Pointer]
234
232
  * Return a new {Pointer} from an existing pointer and an +offset+.
235
233
  */
@@ -246,8 +244,8 @@ ptr_plus(VALUE self, VALUE offset)
246
244
 
247
245
  /*
248
246
  * call-seq: ptr.slice(offset, length)
249
- * @param [Numeric] offset
250
- * @param [Numeric] length
247
+ * @param [Integer] offset
248
+ * @param [Integer] length
251
249
  * @return [Pointer]
252
250
  * Return a new {Pointer} from an existing one. This pointer points on same contents
253
251
  * from +offset+ for a length +length+.
@@ -314,12 +312,17 @@ ptr_equals(VALUE self, VALUE other)
314
312
  return ptr->memory.address == NULL ? Qtrue : Qfalse;
315
313
  }
316
314
 
317
- return ptr->memory.address == POINTER(other)->address ? Qtrue : Qfalse;
315
+ if (!rb_obj_is_kind_of(other, rbffi_PointerClass)) {
316
+ return Qfalse;
317
+ }
318
+ else {
319
+ return ptr->memory.address == POINTER(other)->address ? Qtrue : Qfalse;
320
+ }
318
321
  }
319
322
 
320
323
  /*
321
324
  * call-seq: ptr.address
322
- * @return [Numeric] pointer's base address
325
+ * @return [Integer] pointer's base address
323
326
  * Return +self+'s base address (alias: #to_i).
324
327
  */
325
328
  static VALUE
@@ -440,7 +443,7 @@ ptr_autorelease(VALUE self, VALUE autorelease)
440
443
 
441
444
  rb_check_frozen(self);
442
445
  TypedData_Get_Struct(self, Pointer, &rbffi_pointer_data_type, ptr);
443
- ptr->autorelease = autorelease == Qtrue;
446
+ ptr->autorelease = RB_TEST(autorelease);
444
447
 
445
448
  return autorelease;
446
449
  }