ffi 1.16.2 → 1.17.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +36 -0
  4. data/Gemfile +9 -2
  5. data/README.md +2 -2
  6. data/Rakefile +17 -5
  7. data/ext/ffi_c/AbstractMemory.c +42 -40
  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 +18 -9
  11. data/ext/ffi_c/Call.h +3 -2
  12. data/ext/ffi_c/DynamicLibrary.c +2 -2
  13. data/ext/ffi_c/Function.c +4 -2
  14. data/ext/ffi_c/FunctionInfo.c +4 -2
  15. data/ext/ffi_c/LastError.c +4 -4
  16. data/ext/ffi_c/MemoryPointer.c +2 -2
  17. data/ext/ffi_c/Pointer.c +14 -11
  18. data/ext/ffi_c/Struct.c +18 -7
  19. data/ext/ffi_c/StructLayout.c +6 -6
  20. data/ext/ffi_c/Type.c +17 -16
  21. data/ext/ffi_c/Types.c +7 -1
  22. data/ext/ffi_c/Types.h +0 -1
  23. data/ext/ffi_c/Variadic.c +5 -2
  24. data/ext/ffi_c/libffi/.allow-ai-service +0 -0
  25. data/ext/ffi_c/libffi/.github/workflows/build.yml +34 -15
  26. data/ext/ffi_c/libffi/.github/workflows/emscripten.yml +2 -1
  27. data/ext/ffi_c/libffi/LICENSE +1 -1
  28. data/ext/ffi_c/libffi/README.md +10 -5
  29. data/ext/ffi_c/libffi/compile +9 -8
  30. data/ext/ffi_c/libffi/configure +15 -15
  31. data/ext/ffi_c/libffi/configure.ac +2 -2
  32. data/ext/ffi_c/libffi/configure.host +1 -1
  33. data/ext/ffi_c/libffi/doc/libffi.texi +1 -1
  34. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  35. data/ext/ffi_c/libffi/include/ffi.h.in +2 -11
  36. data/ext/ffi_c/libffi/include/ffi_common.h +4 -2
  37. data/ext/ffi_c/libffi/libffi.map.in +5 -0
  38. data/ext/ffi_c/libffi/libtool-version +1 -1
  39. data/ext/ffi_c/libffi/ltmain.sh +8 -20
  40. data/ext/ffi_c/libffi/msvc_build/aarch64/aarch64_include/ffi.h +1 -1
  41. data/ext/ffi_c/libffi/src/aarch64/ffi.c +26 -13
  42. data/ext/ffi_c/libffi/src/aarch64/sysv.S +198 -46
  43. data/ext/ffi_c/libffi/src/closures.c +3 -3
  44. data/ext/ffi_c/libffi/src/debug.c +2 -2
  45. data/ext/ffi_c/libffi/src/dlmalloc.c +1 -1
  46. data/ext/ffi_c/libffi/src/loongarch64/ffi.c +3 -0
  47. data/ext/ffi_c/libffi/src/mips/ffi.c +12 -4
  48. data/ext/ffi_c/libffi/src/mips/n32.S +65 -14
  49. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +36 -24
  50. data/ext/ffi_c/libffi/src/sparc/ffi64.c +7 -1
  51. data/ext/ffi_c/libffi/src/tramp.c +1 -1
  52. data/ext/ffi_c/libffi/src/types.c +4 -6
  53. data/ext/ffi_c/libffi/src/wasm32/ffi.c +13 -0
  54. data/ext/ffi_c/libffi/src/x86/ffiw64.c +1 -1
  55. data/ext/ffi_c/libffi/testsuite/Makefile.am +79 -127
  56. data/ext/ffi_c/libffi/testsuite/Makefile.in +79 -127
  57. data/ext/ffi_c/libffi/testsuite/emscripten/conftest.py +6 -0
  58. data/ext/ffi_c/libffi/testsuite/libffi.call/callback.c +99 -0
  59. data/ext/ffi_c/libffi/testsuite/libffi.call/callback2.c +108 -0
  60. data/ext/ffi_c/libffi/testsuite/libffi.call/callback3.c +114 -0
  61. data/ext/ffi_c/libffi/testsuite/libffi.call/callback4.c +119 -0
  62. data/ext/ffi_c/libffi.darwin.mk +2 -2
  63. data/lib/ffi/dynamic_library.rb +34 -5
  64. data/lib/ffi/enum.rb +0 -1
  65. data/lib/ffi/function.rb +1 -1
  66. data/lib/ffi/io.rb +2 -2
  67. data/lib/ffi/library.rb +23 -23
  68. data/lib/ffi/platform/aarch64-linux/types.conf +74 -3
  69. data/lib/ffi/pointer.rb +6 -6
  70. data/lib/ffi/struct.rb +4 -4
  71. data/lib/ffi/struct_layout.rb +2 -2
  72. data/lib/ffi/struct_layout_builder.rb +8 -8
  73. data/lib/ffi/types.rb +51 -48
  74. data/lib/ffi/version.rb +1 -1
  75. data/samples/hello_ractor.rb +11 -0
  76. data/samples/qsort_ractor.rb +28 -0
  77. data/sig/ffi/abstract_memory.rbs +164 -0
  78. data/sig/ffi/auto_pointer.rbs +27 -0
  79. data/sig/ffi/buffer.rbs +18 -0
  80. data/sig/ffi/data_converter.rbs +10 -0
  81. data/sig/ffi/dynamic_library.rbs +9 -0
  82. data/sig/ffi/enum.rbs +38 -0
  83. data/sig/ffi/function.rbs +39 -0
  84. data/sig/ffi/library.rbs +42 -0
  85. data/sig/ffi/native_type.rbs +86 -0
  86. data/sig/ffi/pointer.rbs +42 -0
  87. data/sig/ffi/struct.rbs +76 -0
  88. data/sig/ffi/struct_by_reference.rbs +11 -0
  89. data/sig/ffi/struct_by_value.rbs +7 -0
  90. data/sig/ffi/struct_layout.rbs +9 -0
  91. data/sig/ffi/struct_layout_builder.rbs +5 -0
  92. data/sig/ffi/type.rbs +39 -0
  93. data/sig/ffi.rbs +26 -0
  94. data.tar.gz.sig +0 -0
  95. metadata +39 -15
  96. metadata.gz.sig +0 -0
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 219fb8a79026817360b4dc5b79840d000a9272beed3df581e7bac83c6fff5f4e
4
- data.tar.gz: 128fb48ada0bfc52d6806e0a5520b4d07127121d6c9353403fdf8f29606f7578
3
+ metadata.gz: 5ea15fd47a8241bb9bab7086d46ac6bc6ac752c383dc748c616d298f742ed0d0
4
+ data.tar.gz: 5253f331c7fea5590f4499133cac83dbeba5d833825339f4fc45cb57f0c94bcd
5
5
  SHA512:
6
- metadata.gz: d6f1168f0979ad74551670c5db3b5ee3a0887c1e4154aa2998150d19fa2b6084c798735e3ba4a378123d6f3ae33f126d44c83220863b896fb433ee01b28e9b7a
7
- data.tar.gz: e0bb7f8c3d0a1f9fc1385bd74ba162f4b54c2e038484d1f61d3a9fe5ddc48c90b747fedd714fca58f6f41ed8e35a60003602aaf54029ae057be3e4c3b14edbe9
6
+ metadata.gz: e42a6fc177d1302b64a07b6b93a20bf9e0ad4e692a7ab2c16f1f5fbf65ce795fe044187befdcc5859ecb8f3870acac3ca3b687e5e96773f448d0b16e6a1d7710
7
+ data.tar.gz: 2efdb5b63defea13f90d5ec7a7f8c7fb85e3cab24fc84320c8e061017946687f0238a68a57375a4ce76aa67f041b6b65966170d4d98d5ed4cac4d1dbd3dc71df
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -1,3 +1,39 @@
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
+
29
+ 1.16.3 / 2023-10-04
30
+ -------------------
31
+
32
+ Fixed:
33
+ * Fix gcc error when building on CentOS 7. #1052
34
+ * Avoid trying to store new DataConverter type in frozen TypeDefs hash. #1057
35
+
36
+
1
37
  1.16.2 / 2023-09-25
2
38
  -------------------
3
39
 
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
@@ -15,7 +15,7 @@ using Ruby-FFI](https://github.com/ffi/ffi/wiki/why-use-ffi).
15
15
  * C structs (also nested), enums and global variables
16
16
  * Callbacks from C to Ruby
17
17
  * Automatic garbage collection of native memory
18
- * Usable in Ractor
18
+ * Usable in Ractor: [How-to-use-FFI-in-Ruby-Ractors](https://github.com/ffi/ffi/wiki/Ractors)
19
19
 
20
20
  ## Synopsis
21
21
 
@@ -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
  */
@@ -350,6 +350,7 @@ memory_get(VALUE self, VALUE type_name, VALUE offset)
350
350
  AbstractMemory* ptr;
351
351
  VALUE nType;
352
352
  Type *type;
353
+ MemoryOp *op;
353
354
 
354
355
  nType = rbffi_Type_Lookup(type_name);
355
356
  if(NIL_P(nType)) goto undefined_type;
@@ -357,7 +358,7 @@ memory_get(VALUE self, VALUE type_name, VALUE offset)
357
358
  TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
358
359
  TypedData_Get_Struct(nType, Type, &rbffi_type_data_type, type);
359
360
 
360
- MemoryOp *op = get_memory_op(type);
361
+ op = get_memory_op(type);
361
362
  if(op == NULL) goto undefined_type;
362
363
 
363
364
  return op->get(ptr, NUM2LONG(offset));
@@ -372,7 +373,7 @@ undefined_type: {
372
373
  /*
373
374
  * call-seq: memory.put(type, offset, value)
374
375
  * @param [Symbol, Type] type_name type of data to put
375
- * @param [Numeric] offset point in buffer to start from
376
+ * @param [Integer] offset point in buffer to start from
376
377
  * @return [nil]
377
378
  * @raise {ArgumentError} if type is not supported
378
379
  */
@@ -382,6 +383,7 @@ memory_put(VALUE self, VALUE type_name, VALUE offset, VALUE value)
382
383
  AbstractMemory* ptr;
383
384
  VALUE nType;
384
385
  Type *type;
386
+ MemoryOp *op;
385
387
 
386
388
  nType = rbffi_Type_Lookup(type_name);
387
389
  if(NIL_P(nType)) goto undefined_type;
@@ -389,7 +391,7 @@ memory_put(VALUE self, VALUE type_name, VALUE offset, VALUE value)
389
391
  TypedData_Get_Struct(self, AbstractMemory, &rbffi_abstract_memory_data_type, ptr);
390
392
  TypedData_Get_Struct(nType, Type, &rbffi_type_data_type, type);
391
393
 
392
- MemoryOp *op = get_memory_op(type);
394
+ op = get_memory_op(type);
393
395
  if(op == NULL) goto undefined_type;
394
396
 
395
397
  op->put(ptr, NUM2LONG(offset), value);
@@ -405,8 +407,8 @@ undefined_type: {
405
407
  /*
406
408
  * call-seq: memory.get_string(offset, length=nil)
407
409
  * Return string contained in memory.
408
- * @param [Numeric] offset point in buffer to start from
409
- * @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).
410
412
  * @return [String]
411
413
  * @raise {IndexError} if +length+ is too great
412
414
  * @raise {NullPointerError} if memory not initialized
@@ -433,8 +435,8 @@ memory_get_string(int argc, VALUE* argv, VALUE self)
433
435
  /*
434
436
  * call-seq: memory.get_array_of_string(offset, count=nil)
435
437
  * Return an array of strings contained in memory.
436
- * @param [Numeric] offset point in memory to start from
437
- * @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
438
440
  * @return [Array<String>]
439
441
  * @raise {IndexError} if +offset+ is too great
440
442
  * @raise {NullPointerError} if memory not initialized
@@ -483,7 +485,7 @@ memory_get_array_of_string(int argc, VALUE* argv, VALUE self)
483
485
  * call-seq: memory.read_array_of_string(count=nil)
484
486
  * Return an array of strings contained in memory. Same as:
485
487
  * memory.get_array_of_string(0, count)
486
- * @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
487
489
  * @return [Array<String>]
488
490
  */
489
491
  static VALUE
@@ -503,7 +505,7 @@ memory_read_array_of_string(int argc, VALUE* argv, VALUE self)
503
505
 
504
506
  /*
505
507
  * call-seq: memory.put_string(offset, str)
506
- * @param [Numeric] offset
508
+ * @param [Integer] offset
507
509
  * @param [String] str
508
510
  * @return [self]
509
511
  * @raise {SecurityError} when writing unsafe string to memory
@@ -533,8 +535,8 @@ memory_put_string(VALUE self, VALUE offset, VALUE str)
533
535
  /*
534
536
  * call-seq: memory.get_bytes(offset, length)
535
537
  * Return string contained in memory.
536
- * @param [Numeric] offset point in buffer to start from
537
- * @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.
538
540
  * @return [String]
539
541
  * @raise {IndexError} if +length+ is too great
540
542
  * @raise {NullPointerError} if memory not initialized
@@ -557,10 +559,10 @@ memory_get_bytes(VALUE self, VALUE offset, VALUE length)
557
559
  /*
558
560
  * call-seq: memory.put_bytes(offset, str, index=0, length=nil)
559
561
  * Put a string in memory.
560
- * @param [Numeric] offset point in buffer to start from
562
+ * @param [Integer] offset point in buffer to start from
561
563
  * @param [String] str string to put to memory
562
- * @param [Numeric] index
563
- * @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).
564
566
  * @return [self]
565
567
  * @raise {IndexError} if +length+ is too great
566
568
  * @raise {NullPointerError} if memory not initialized
@@ -599,7 +601,7 @@ memory_put_bytes(int argc, VALUE* argv, VALUE self)
599
601
 
600
602
  /*
601
603
  * call-seq: memory.read_bytes(length)
602
- * @param [Numeric] length of string to return
604
+ * @param [Integer] length of string to return
603
605
  * @return [String]
604
606
  * equivalent to :
605
607
  * memory.get_bytes(0, length)
@@ -613,8 +615,8 @@ memory_read_bytes(VALUE self, VALUE length)
613
615
  /*
614
616
  * call-seq: memory.write_bytes(str, index=0, length=nil)
615
617
  * @param [String] str string to put to memory
616
- * @param [Numeric] index
617
- * @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).
618
620
  * @return [self]
619
621
  * equivalent to :
620
622
  * memory.put_bytes(0, str, index, length)
@@ -635,7 +637,7 @@ memory_write_bytes(int argc, VALUE* argv, VALUE self)
635
637
 
636
638
  /*
637
639
  * call-seq: memory.type_size
638
- * @return [Numeric] type size in bytes
640
+ * @return [Integer] type size in bytes
639
641
  * Get the memory's type size.
640
642
  */
641
643
  static VALUE
@@ -651,7 +653,7 @@ memory_type_size(VALUE self)
651
653
  /*
652
654
  * Document-method: []
653
655
  * call-seq: memory[idx]
654
- * @param [Numeric] idx index to access in memory
656
+ * @param [Integer] idx index to access in memory
655
657
  * @return
656
658
  * Memory read accessor.
657
659
  */
@@ -859,8 +861,8 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
859
861
 
860
862
  /*
861
863
  * Document-method: put_float32
862
- * call-seq: memory.put_float32offset, value)
863
- * @param [Numeric] offset
864
+ * call-seq: memory.put_float32(offset, value)
865
+ * @param [Integer] offset
864
866
  * @param [Numeric] value
865
867
  * @return [self]
866
868
  * Put +value+ as a 32-bit float in memory at offset +offset+ (alias: #put_float).
@@ -869,7 +871,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
869
871
  /*
870
872
  * Document-method: get_float32
871
873
  * call-seq: memory.get_float32(offset)
872
- * @param [Numeric] offset
874
+ * @param [Integer] offset
873
875
  * @return [Float]
874
876
  * Get a 32-bit float from memory at offset +offset+ (alias: #get_float).
875
877
  */
@@ -900,7 +902,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
900
902
  /*
901
903
  * Document-method: put_array_of_float32
902
904
  * call-seq: memory.put_array_of_float32(offset, ary)
903
- * @param [Numeric] offset
905
+ * @param [Integer] offset
904
906
  * @param [Array<Numeric>] ary
905
907
  * @return [self]
906
908
  * Put values from +ary+ as 32-bit floats in memory from offset +offset+ (alias: #put_array_of_float).
@@ -909,8 +911,8 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
909
911
  /*
910
912
  * Document-method: get_array_of_float32
911
913
  * call-seq: memory.get_array_of_float32(offset, length)
912
- * @param [Numeric] offset
913
- * @param [Numeric] length number of Float to get
914
+ * @param [Integer] offset
915
+ * @param [Integer] length number of Float to get
914
916
  * @return [Array<Float>]
915
917
  * Get 32-bit floats in memory from offset +offset+ (alias: #get_array_of_float).
916
918
  */
@@ -929,7 +931,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
929
931
  /*
930
932
  * Document-method: read_array_of_float
931
933
  * call-seq: memory.read_array_of_float(length)
932
- * @param [Numeric] length number of Float to read
934
+ * @param [Integer] length number of Float to read
933
935
  * @return [Array<Float>]
934
936
  * Read 32-bit floats from memory.
935
937
  *
@@ -942,7 +944,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
942
944
  /*
943
945
  * Document-method: put_float64
944
946
  * call-seq: memory.put_float64(offset, value)
945
- * @param [Numeric] offset
947
+ * @param [Integer] offset
946
948
  * @param [Numeric] value
947
949
  * @return [self]
948
950
  * Put +value+ as a 64-bit float (double) in memory at offset +offset+ (alias: #put_double).
@@ -951,7 +953,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
951
953
  /*
952
954
  * Document-method: get_float64
953
955
  * call-seq: memory.get_float64(offset)
954
- * @param [Numeric] offset
956
+ * @param [Integer] offset
955
957
  * @return [Float]
956
958
  * Get a 64-bit float (double) from memory at offset +offset+ (alias: #get_double).
957
959
  */
@@ -982,7 +984,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
982
984
  /*
983
985
  * Document-method: put_array_of_float64
984
986
  * call-seq: memory.put_array_of_float64(offset, ary)
985
- * @param [Numeric] offset
987
+ * @param [Integer] offset
986
988
  * @param [Array<Numeric>] ary
987
989
  * @return [self]
988
990
  * Put values from +ary+ as 64-bit floats (doubles) in memory from offset +offset+ (alias: #put_array_of_double).
@@ -991,8 +993,8 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
991
993
  /*
992
994
  * Document-method: get_array_of_float64
993
995
  * call-seq: memory.get_array_of_float64(offset, length)
994
- * @param [Numeric] offset
995
- * @param [Numeric] length number of Float to get
996
+ * @param [Integer] offset
997
+ * @param [Integer] length number of Float to get
996
998
  * @return [Array<Float>]
997
999
  * Get 64-bit floats (doubles) in memory from offset +offset+ (alias: #get_array_of_double).
998
1000
  */
@@ -1011,7 +1013,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
1011
1013
  /*
1012
1014
  * Document-method: read_array_of_double
1013
1015
  * call-seq: memory.read_array_of_double(length)
1014
- * @param [Numeric] length number of Float to read
1016
+ * @param [Integer] length number of Float to read
1015
1017
  * @return [Array<Float>]
1016
1018
  * Read 64-bit floats (doubles) from memory.
1017
1019
  *
@@ -1024,7 +1026,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
1024
1026
  /*
1025
1027
  * Document-method: put_pointer
1026
1028
  * call-seq: memory.put_pointer(offset, value)
1027
- * @param [Numeric] offset
1029
+ * @param [Integer] offset
1028
1030
  * @param [nil,Pointer, Integer, #to_ptr] value
1029
1031
  * @return [self]
1030
1032
  * Put +value+ in memory from +offset+..
@@ -1033,7 +1035,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
1033
1035
  /*
1034
1036
  * Document-method: get_pointer
1035
1037
  * call-seq: memory.get_pointer(offset)
1036
- * @param [Numeric] offset
1038
+ * @param [Integer] offset
1037
1039
  * @return [Pointer]
1038
1040
  * Get a {Pointer} to the memory from +offset+.
1039
1041
  */
@@ -1062,7 +1064,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
1062
1064
  /*
1063
1065
  * Document-method: put_array_of_pointer
1064
1066
  * call-seq: memory.put_array_of_pointer(offset, ary)
1065
- * @param [Numeric] offset
1067
+ * @param [Integer] offset
1066
1068
  * @param [Array<#to_ptr>] ary
1067
1069
  * @return [self]
1068
1070
  * Put an array of {Pointer} into memory from +offset+.
@@ -1071,8 +1073,8 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
1071
1073
  /*
1072
1074
  * Document-method: get_array_of_pointer
1073
1075
  * call-seq: memory.get_array_of_pointer(offset, length)
1074
- * @param [Numeric] offset
1075
- * @param [Numeric] length
1076
+ * @param [Integer] offset
1077
+ * @param [Integer] length
1076
1078
  * @return [Array<Pointer>]
1077
1079
  * Get an array of {Pointer} of length +length+ from +offset+.
1078
1080
  */
@@ -1091,7 +1093,7 @@ rbffi_AbstractMemory_Init(VALUE moduleFFI)
1091
1093
  /*
1092
1094
  * Document-method: read_array_of_pointer
1093
1095
  * call-seq: memory.read_array_of_pointer(length)
1094
- * @param [Numeric] length
1096
+ * @param [Integer] length
1095
1097
  * @return [Array<Pointer>]
1096
1098
  * Read an array of {Pointer} of length +length+.
1097
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();
@@ -427,8 +433,10 @@ getPointer(VALUE value, int type)
427
433
  } else if (type == T_DATA && rb_obj_is_kind_of(value, rbffi_StructClass)) {
428
434
 
429
435
  Struct* s;
436
+ AbstractMemory* memory;
437
+
430
438
  TypedData_Get_Struct(value, Struct, &rbffi_struct_data_type, s);
431
- AbstractMemory* memory = s->pointer;
439
+ memory = s->pointer;
432
440
  return memory != NULL ? memory->address : NULL;
433
441
 
434
442
  } else if (type == T_STRING) {
@@ -464,7 +472,9 @@ rbffi_GetInvoker(FunctionType *fnInfo)
464
472
  static void*
465
473
  callback_param(VALUE proc, VALUE cbInfo)
466
474
  {
467
- VALUE callback ;
475
+ VALUE callback;
476
+ AbstractMemory *mem;
477
+
468
478
  if (unlikely(proc == Qnil)) {
469
479
  return NULL ;
470
480
  }
@@ -479,7 +489,6 @@ callback_param(VALUE proc, VALUE cbInfo)
479
489
  callback = rbffi_Function_ForProc(cbInfo, proc);
480
490
  RB_GC_GUARD(callback);
481
491
 
482
- AbstractMemory *mem;
483
492
  TypedData_Get_Struct(callback, AbstractMemory, &rbffi_abstract_memory_data_type, mem);
484
493
  return mem->address;
485
494
  }
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
data/ext/ffi_c/Function.c CHANGED
@@ -953,10 +953,10 @@ invoke_callback(VALUE data)
953
953
 
954
954
  } else if (rb_obj_is_kind_of(rbReturnValue, rb_cProc) || rb_respond_to(rbReturnValue, id_call)) {
955
955
  VALUE function;
956
+ AbstractMemory* memory;
956
957
 
957
958
  function = rbffi_Function_ForProc(rbReturnType, rbReturnValue);
958
959
 
959
- AbstractMemory* memory;
960
960
  TypedData_Get_Struct(function, AbstractMemory, &rbffi_abstract_memory_data_type, memory);
961
961
 
962
962
  *((void **) retval) = memory->address;
@@ -968,8 +968,10 @@ invoke_callback(VALUE data)
968
968
  case NATIVE_STRUCT:
969
969
  if (TYPE(rbReturnValue) == T_DATA && rb_obj_is_kind_of(rbReturnValue, rbffi_StructClass)) {
970
970
  Struct* s;
971
+ AbstractMemory* memory;
972
+
971
973
  TypedData_Get_Struct(rbReturnValue, Struct, &rbffi_struct_data_type, s);
972
- AbstractMemory* memory = s->pointer;
974
+ memory = s->pointer;
973
975
 
974
976
  if (memory->address != NULL) {
975
977
  memcpy(retval, memory->address, returnType->ffiType->size);
@@ -97,7 +97,8 @@ fntype_mark(void *data)
97
97
  rb_gc_mark_movable(fnInfo->rbParameterTypes);
98
98
  rb_gc_mark_movable(fnInfo->rbEnums);
99
99
  if (fnInfo->callbackCount > 0 && fnInfo->callbackParameters != NULL) {
100
- for (size_t index = 0; index < fnInfo->callbackCount; index++) {
100
+ size_t index;
101
+ for (index = 0; index < fnInfo->callbackCount; index++) {
101
102
  rb_gc_mark_movable(fnInfo->callbackParameters[index]);
102
103
  }
103
104
  }
@@ -111,7 +112,8 @@ fntype_compact(void *data)
111
112
  ffi_gc_location(fnInfo->rbParameterTypes);
112
113
  ffi_gc_location(fnInfo->rbEnums);
113
114
  if (fnInfo->callbackCount > 0 && fnInfo->callbackParameters != NULL) {
114
- for (size_t index = 0; index < fnInfo->callbackCount; index++) {
115
+ size_t index;
116
+ for (index = 0; index < fnInfo->callbackCount; index++) {
115
117
  ffi_gc_location(fnInfo->callbackParameters[index]);
116
118
  }
117
119
  }