ffi 1.16.2 → 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 (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
  }