ffi 1.13.1 → 1.15.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (121) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +91 -0
  3. data/Gemfile +1 -4
  4. data/README.md +14 -2
  5. data/Rakefile +23 -23
  6. data/ext/ffi_c/AbstractMemory.c +24 -25
  7. data/ext/ffi_c/Buffer.c +2 -7
  8. data/ext/ffi_c/Call.c +2 -8
  9. data/ext/ffi_c/ClosurePool.c +64 -11
  10. data/ext/ffi_c/ClosurePool.h +3 -1
  11. data/ext/ffi_c/DynamicLibrary.c +1 -6
  12. data/ext/ffi_c/Function.c +31 -16
  13. data/ext/ffi_c/Function.h +0 -4
  14. data/ext/ffi_c/FunctionInfo.c +2 -6
  15. data/ext/ffi_c/LastError.c +2 -6
  16. data/ext/ffi_c/MemoryPointer.c +2 -7
  17. data/ext/ffi_c/MemoryPointer.h +0 -4
  18. data/ext/ffi_c/MethodHandle.c +4 -8
  19. data/ext/ffi_c/Platform.c +2 -7
  20. data/ext/ffi_c/Pointer.c +24 -25
  21. data/ext/ffi_c/Pointer.h +0 -4
  22. data/ext/ffi_c/Struct.c +3 -6
  23. data/ext/ffi_c/StructByValue.c +2 -7
  24. data/ext/ffi_c/StructLayout.c +2 -6
  25. data/ext/ffi_c/Thread.c +0 -5
  26. data/ext/ffi_c/Thread.h +1 -6
  27. data/ext/ffi_c/Type.c +1 -1
  28. data/ext/ffi_c/Types.c +6 -7
  29. data/ext/ffi_c/Types.h +3 -4
  30. data/ext/ffi_c/Variadic.c +14 -9
  31. data/ext/ffi_c/extconf.rb +20 -4
  32. data/ext/ffi_c/libffi/.travis/bfin-sim.exp +1 -1
  33. data/ext/ffi_c/libffi/.travis/m32r-sim.exp +1 -1
  34. data/ext/ffi_c/libffi/.travis/moxie-sim.exp +1 -1
  35. data/ext/ffi_c/libffi/.travis/or1k-sim.exp +1 -1
  36. data/ext/ffi_c/libffi/.travis/powerpc-eabisim.exp +1 -1
  37. data/ext/ffi_c/libffi/.travis/wine-sim.exp +1 -1
  38. data/ext/ffi_c/libffi/Makefile.am +48 -58
  39. data/ext/ffi_c/libffi/Makefile.in +420 -156
  40. data/ext/ffi_c/libffi/README.md +4 -0
  41. data/ext/ffi_c/libffi/config.guess +552 -331
  42. data/ext/ffi_c/libffi/config.sub +1321 -1306
  43. data/ext/ffi_c/libffi/configure +158 -96
  44. data/ext/ffi_c/libffi/configure.ac +6 -1
  45. data/ext/ffi_c/libffi/configure.host +32 -20
  46. data/ext/ffi_c/libffi/doc/Makefile.in +8 -5
  47. data/ext/ffi_c/libffi/fficonfig.h.in +6 -0
  48. data/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +1 -1
  49. data/ext/ffi_c/libffi/include/Makefile.in +8 -5
  50. data/ext/ffi_c/libffi/install-sh +23 -13
  51. data/ext/ffi_c/libffi/ltmain.sh +156 -61
  52. data/ext/ffi_c/libffi/man/Makefile.in +8 -5
  53. data/ext/ffi_c/libffi/missing +8 -8
  54. data/ext/ffi_c/libffi/msvcc.sh +11 -11
  55. data/ext/ffi_c/libffi/src/aarch64/ffi.c +45 -35
  56. data/ext/ffi_c/libffi/src/aarch64/ffitarget.h +10 -5
  57. data/ext/ffi_c/libffi/src/aarch64/internal.h +1 -0
  58. data/ext/ffi_c/libffi/src/aarch64/sysv.S +1 -1
  59. data/ext/ffi_c/libffi/src/aarch64/win64_armasm.S +1 -1
  60. data/ext/ffi_c/libffi/src/arm/ffi.c +22 -0
  61. data/ext/ffi_c/libffi/src/arm/sysv.S +4 -4
  62. data/ext/ffi_c/libffi/src/closures.c +23 -6
  63. data/ext/ffi_c/libffi/src/csky/ffi.c +395 -0
  64. data/ext/ffi_c/libffi/src/csky/ffitarget.h +63 -0
  65. data/ext/ffi_c/libffi/src/csky/sysv.S +371 -0
  66. data/ext/ffi_c/libffi/src/dlmalloc.c +1 -1
  67. data/ext/ffi_c/libffi/src/kvx/asm.h +5 -0
  68. data/ext/ffi_c/libffi/src/kvx/ffi.c +273 -0
  69. data/ext/ffi_c/libffi/src/kvx/ffitarget.h +75 -0
  70. data/ext/ffi_c/libffi/src/kvx/sysv.S +127 -0
  71. data/ext/ffi_c/libffi/src/mips/ffi.c +5 -1
  72. data/ext/ffi_c/libffi/src/mips/ffitarget.h +1 -1
  73. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +13 -1
  74. data/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +1 -1
  75. data/ext/ffi_c/libffi/src/powerpc/linux64.S +8 -0
  76. data/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +13 -1
  77. data/ext/ffi_c/libffi/src/prep_cif.c +1 -1
  78. data/ext/ffi_c/libffi/src/x86/ffi.c +8 -2
  79. data/ext/ffi_c/libffi/src/x86/ffi64.c +7 -0
  80. data/ext/ffi_c/libffi/src/x86/ffiw64.c +5 -0
  81. data/ext/ffi_c/libffi/src/x86/sysv.S +2 -2
  82. data/ext/ffi_c/libffi/src/x86/unix64.S +1 -2
  83. data/ext/ffi_c/libffi/src/x86/win64.S +3 -2
  84. data/ext/ffi_c/libffi/src/x86/win64_intel.S +3 -2
  85. data/ext/ffi_c/libffi/testsuite/Makefile.in +9 -6
  86. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +22 -2
  87. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +4 -4
  88. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +2 -2
  89. data/ext/ffi_c/libffi/testsuite/libffi.closures/huge_struct.c +2 -0
  90. data/ffi.gemspec +1 -1
  91. data/lib/ffi.rb +3 -4
  92. data/lib/ffi/abstract_memory.rb +44 -0
  93. data/lib/ffi/autopointer.rb +1 -1
  94. data/lib/ffi/ffi.rb +1 -0
  95. data/lib/ffi/io.rb +3 -3
  96. data/lib/ffi/library.rb +2 -2
  97. data/lib/ffi/managedstruct.rb +2 -2
  98. data/lib/ffi/platform.rb +17 -11
  99. data/lib/ffi/platform/aarch64-darwin/types.conf +130 -0
  100. data/lib/ffi/platform/aarch64-freebsd/types.conf +2 -2
  101. data/lib/ffi/platform/aarch64-freebsd12/types.conf +113 -60
  102. data/lib/ffi/platform/aarch64-openbsd/types.conf +134 -0
  103. data/lib/ffi/platform/powerpc64le-linux/types.conf +100 -0
  104. data/lib/ffi/platform/riscv64-linux/types.conf +104 -0
  105. data/lib/ffi/platform/x86_64-haiku/types.conf +117 -0
  106. data/lib/ffi/platform/x86_64-msys/types.conf +119 -0
  107. data/lib/ffi/pointer.rb +2 -2
  108. data/lib/ffi/tools/const_generator.rb +2 -1
  109. data/lib/ffi/tools/struct_generator.rb +2 -1
  110. data/lib/ffi/variadic.rb +1 -10
  111. data/lib/ffi/version.rb +1 -1
  112. data/rakelib/ffi_gem_helper.rb +65 -0
  113. metadata +18 -11
  114. data/.appveyor.yml +0 -30
  115. data/.github/workflows/ci.yml +0 -64
  116. data/.gitignore +0 -25
  117. data/.gitmodules +0 -4
  118. data/.travis.yml +0 -58
  119. data/.yardopts +0 -5
  120. data/ext/ffi_c/win32/stdbool.h +0 -8
  121. data/ext/ffi_c/win32/stdint.h +0 -201
@@ -688,6 +688,8 @@ ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
688
688
  ffi_call_int (cif, fn, rvalue, avalue, NULL);
689
689
  }
690
690
 
691
+ #ifdef FFI_GO_CLOSURES
692
+
691
693
  #ifndef __ILP32__
692
694
  extern void
693
695
  ffi_call_go_efi64(ffi_cif *cif, void (*fn)(void), void *rvalue,
@@ -708,6 +710,7 @@ ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue,
708
710
  ffi_call_int (cif, fn, rvalue, avalue, closure);
709
711
  }
710
712
 
713
+ #endif /* FFI_GO_CLOSURES */
711
714
 
712
715
  extern void ffi_closure_unix64(void) FFI_HIDDEN;
713
716
  extern void ffi_closure_unix64_sse(void) FFI_HIDDEN;
@@ -856,6 +859,8 @@ ffi_closure_unix64_inner(ffi_cif *cif,
856
859
  return flags;
857
860
  }
858
861
 
862
+ #ifdef FFI_GO_CLOSURES
863
+
859
864
  extern void ffi_go_closure_unix64(void) FFI_HIDDEN;
860
865
  extern void ffi_go_closure_unix64_sse(void) FFI_HIDDEN;
861
866
 
@@ -885,4 +890,6 @@ ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif,
885
890
  return FFI_OK;
886
891
  }
887
892
 
893
+ #endif /* FFI_GO_CLOSURES */
894
+
888
895
  #endif /* __x86_64__ */
@@ -187,7 +187,10 @@ EFI64(ffi_call_go)(ffi_cif *cif, void (*fn)(void), void *rvalue,
187
187
 
188
188
 
189
189
  extern void ffi_closure_win64(void) FFI_HIDDEN;
190
+
191
+ #ifdef FFI_GO_CLOSURES
190
192
  extern void ffi_go_closure_win64(void) FFI_HIDDEN;
193
+ #endif
191
194
 
192
195
  ffi_status
193
196
  EFI64(ffi_prep_closure_loc)(ffi_closure* closure,
@@ -227,6 +230,7 @@ EFI64(ffi_prep_closure_loc)(ffi_closure* closure,
227
230
  return FFI_OK;
228
231
  }
229
232
 
233
+ #ifdef FFI_GO_CLOSURES
230
234
  ffi_status
231
235
  EFI64(ffi_prep_go_closure)(ffi_go_closure* closure, ffi_cif* cif,
232
236
  void (*fun)(ffi_cif*, void*, void**, void*))
@@ -246,6 +250,7 @@ EFI64(ffi_prep_go_closure)(ffi_go_closure* closure, ffi_cif* cif,
246
250
 
247
251
  return FFI_OK;
248
252
  }
253
+ #endif
249
254
 
250
255
  struct win64_closure_frame
251
256
  {
@@ -56,8 +56,8 @@
56
56
 
57
57
  /* Handle win32 fastcall name mangling. */
58
58
  #ifdef X86_WIN32
59
- # define ffi_call_i386 @ffi_call_i386@8
60
- # define ffi_closure_inner @ffi_closure_inner@8
59
+ # define ffi_call_i386 "@ffi_call_i386@8"
60
+ # define ffi_closure_inner "@ffi_closure_inner@8"
61
61
  #else
62
62
  # define ffi_call_i386 C(ffi_call_i386)
63
63
  # define ffi_closure_inner C(ffi_closure_inner)
@@ -84,7 +84,6 @@ L(UW1):
84
84
 
85
85
  movq %rdi, %r10 /* Save a copy of the register area. */
86
86
  movq %r8, %r11 /* Save a copy of the target fn. */
87
- movl %r9d, %eax /* Set number of SSE registers. */
88
87
 
89
88
  /* Load up all argument registers. */
90
89
  movq (%r10), %rdi
@@ -93,7 +92,7 @@ L(UW1):
93
92
  movq 0x18(%r10), %rcx
94
93
  movq 0x20(%r10), %r8
95
94
  movq 0x28(%r10), %r9
96
- movl 0xb0(%r10), %eax
95
+ movl 0xb0(%r10), %eax /* Set number of SSE registers. */
97
96
  testl %eax, %eax
98
97
  jnz L(load_sse)
99
98
  L(ret_from_load_sse):
@@ -30,7 +30,7 @@
30
30
  #if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__))
31
31
  # define E(BASE, X) .balign 8
32
32
  #else
33
- # define E(BASE, X) .balign 8; .org BASE + X * 8
33
+ # define E(BASE, X) .balign 8; .org BASE + (X) * 8
34
34
  #endif
35
35
 
36
36
  .text
@@ -108,7 +108,8 @@ E(0b, FFI_TYPE_FLOAT)
108
108
  E(0b, FFI_TYPE_DOUBLE)
109
109
  movsd %xmm0, (%r8)
110
110
  epilogue
111
- E(0b, FFI_TYPE_LONGDOUBLE)
111
+ // FFI_TYPE_LONGDOUBLE may be FFI_TYPE_DOUBLE but we need a different value here.
112
+ E(0b, FFI_TYPE_DOUBLE + 1)
112
113
  call PLT(C(abort))
113
114
  E(0b, FFI_TYPE_UINT8)
114
115
  movzbl %al, %eax
@@ -29,7 +29,7 @@
29
29
  #if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__))
30
30
  # define E(BASE, X) ALIGN 8
31
31
  #else
32
- # define E(BASE, X) ALIGN 8; ORG BASE + X * 8
32
+ # define E(BASE, X) ALIGN 8; ORG BASE + (X) * 8
33
33
  #endif
34
34
 
35
35
  .CODE
@@ -107,7 +107,8 @@ E(0b, FFI_TYPE_FLOAT)
107
107
  E(0b, FFI_TYPE_DOUBLE)
108
108
  movsd qword ptr[r8], xmm0; movsd %xmm0, (%r8)
109
109
  epilogue
110
- E(0b, FFI_TYPE_LONGDOUBLE)
110
+ // FFI_TYPE_LONGDOUBLE may be FFI_TYPE_DOUBLE but we need a different value here.
111
+ E(0b, FFI_TYPE_DOUBLE + 1)
111
112
  call PLT(C(abort))
112
113
  E(0b, FFI_TYPE_UINT8)
113
114
  movzx eax, al ;movzbl %al, %eax
@@ -1,7 +1,7 @@
1
- # Makefile.in generated by automake 1.15.1 from Makefile.am.
1
+ # Makefile.in generated by automake 1.16.1 from Makefile.am.
2
2
  # @configure_input@
3
3
 
4
- # Copyright (C) 1994-2017 Free Software Foundation, Inc.
4
+ # Copyright (C) 1994-2018 Free Software Foundation, Inc.
5
5
 
6
6
  # This Makefile.in is free software; the Free Software Foundation
7
7
  # gives unlimited permission to copy and/or distribute it,
@@ -421,8 +421,8 @@ Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
421
421
  *config.status*) \
422
422
  cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
423
423
  *) \
424
- echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
425
- cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
424
+ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \
425
+ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \
426
426
  esac;
427
427
 
428
428
  $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
@@ -451,7 +451,7 @@ check-DEJAGNU: site.exp
451
451
  EXPECT=$(EXPECT); export EXPECT; \
452
452
  if $(SHELL) -c "$(RUNTEST) --version" > /dev/null 2>&1; then \
453
453
  exit_status=0; l='$(DEJATOOL)'; for tool in $$l; do \
454
- if $(RUNTEST) $(AM_RUNTESTFLAGS) $(RUNTESTDEFAULTFLAGS) $(RUNTESTFLAGS); \
454
+ if $(RUNTEST) $(RUNTESTDEFAULTFLAGS) $(AM_RUNTESTFLAGS) $(RUNTESTFLAGS); \
455
455
  then :; else exit_status=1; fi; \
456
456
  done; \
457
457
  else echo "WARNING: could not find '$(RUNTEST)'" 1>&2; :;\
@@ -490,7 +490,10 @@ distclean-DEJAGNU:
490
490
  rm -f $$tool.sum $$tool.log; \
491
491
  done
492
492
 
493
- distdir: $(DISTFILES)
493
+ distdir: $(BUILT_SOURCES)
494
+ $(MAKE) $(AM_MAKEFLAGS) distdir-am
495
+
496
+ distdir-am: $(DISTFILES)
494
497
  @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
495
498
  topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
496
499
  list='$(DISTFILES)'; \
@@ -24,6 +24,11 @@ load_lib libgloss.exp
24
24
  load_gcc_lib target-libpath.exp
25
25
  load_gcc_lib wrapper.exp
26
26
 
27
+ proc check_effective_target_gccbug { } {
28
+ global has_gccbug
29
+ return $has_gccbug
30
+ }
31
+
27
32
  # Return 1 if the target matches the effective target 'arg', 0 otherwise.
28
33
  # This can be used with any check_* proc that takes no argument and
29
34
  # returns only 1 or 0. It could be used with check_* procs that take
@@ -477,6 +482,7 @@ proc libffi-dg-runtest { testcases default-extra-flags } {
477
482
 
478
483
  proc run-many-tests { testcases extra_flags } {
479
484
  global compiler_vendor
485
+ global has_gccbug
480
486
  global env
481
487
  switch $compiler_vendor {
482
488
  "clang" {
@@ -538,8 +544,22 @@ proc run-many-tests { testcases extra_flags } {
538
544
  foreach opt $optimizations {
539
545
  foreach abi $abis {
540
546
  set options [concat $common $opt $abi]
541
- verbose "Testing $testname, $options" 1
542
- dg-test $test $options ""
547
+ set has_gccbug false;
548
+ if { [string match $compiler_vendor "gnu"] \
549
+ && [string match "*MSABI*" $abi] \
550
+ && ( ( [string match "*DGTEST=57 *" $common] \
551
+ && [string match "*call.c*" $testname] ) \
552
+ || ( [string match "*DGTEST=54 *" $common] \
553
+ && [string match "*callback*" $testname] ) \
554
+ || [string match "*DGTEST=55 *" $common] \
555
+ || [string match "*DGTEST=56 *" $common] ) } then {
556
+ if [libffi_feature_test "#if (__GNUC__ < 9) || ((__GNUC__ == 9) && (__GNUC_MINOR__ < 3))"] {
557
+ set has_gccbug true;
558
+ }
559
+ }
560
+ verbose "Testing $testname, $options" 1
561
+ verbose "has_gccbug = $has_gccbug" 1
562
+ dg-test $test $options ""
543
563
  }
544
564
  }
545
565
  }
@@ -4,7 +4,7 @@
4
4
 
5
5
  This program is free software: you can redistribute it and/or modify
6
6
  it under the terms of the GNU General Public License as published by
7
- the Free Software Foundation; either version 2 of the License, or
7
+ the Free Software Foundation; either version 3 of the License, or
8
8
  (at your option) any later version.
9
9
 
10
10
  This program is distributed in the hope that it will be useful,
@@ -16,7 +16,7 @@
16
16
  along with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  **/
18
18
 
19
- /* { dg-do run } */
19
+ /* { dg-do run { xfail gccbug } } */
20
20
 
21
21
  #include <stdio.h>
22
22
  #include <stdlib.h>
@@ -1220,7 +1220,7 @@ void
1220
1220
  }
1221
1221
  fprintf(out,"->{%g}\n",Fr.x);
1222
1222
  fflush(out);
1223
- #endif
1223
+ #endif
1224
1224
  #if (!defined(DGTEST)) || DGTEST == 56
1225
1225
  Dr = D_fDd(f1,D2,d3);
1226
1226
  fprintf(out,"->{%g}\n",Dr.x);
@@ -1243,7 +1243,7 @@ void
1243
1243
  }
1244
1244
  fprintf(out,"->{%g}\n",Dr.x);
1245
1245
  fflush(out);
1246
- #endif
1246
+ #endif
1247
1247
  #if (!defined(DGTEST)) || DGTEST == 57
1248
1248
  Dr = D_Dfd(D1,f2,d3);
1249
1249
  fprintf(out,"->{%g}\n",Dr.x);
@@ -4,7 +4,7 @@
4
4
  *
5
5
  * This program is free software: you can redistribute it and/or modify
6
6
  * it under the terms of the GNU General Public License as published by
7
- * the Free Software Foundation; either version 2 of the License, or
7
+ * the Free Software Foundation; either version 3 of the License, or
8
8
  * (at your option) any later version.
9
9
  *
10
10
  * This program is distributed in the hope that it will be useful,
@@ -16,7 +16,7 @@
16
16
  * along with this program. If not, see <http://www.gnu.org/licenses/>.
17
17
  */
18
18
 
19
- /* { dg-do run } */
19
+ /* { dg-do run { xfail gccbug } } */
20
20
 
21
21
  #include <stdio.h>
22
22
  #include <stdlib.h>
@@ -9,6 +9,8 @@
9
9
  /* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */
10
10
  /* { dg-options -Wformat=0 { target moxie*-*-elf or1k-*-* } } */
11
11
 
12
+ #include <inttypes.h>
13
+
12
14
  #include "ffitest.h"
13
15
 
14
16
  typedef struct BigStruct{
data/ffi.gemspec CHANGED
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.metadata['mailing_list_uri'] = 'http://groups.google.com/group/ruby-ffi'
18
18
  end
19
19
  s.files = `git ls-files -z`.split("\x0").reject do |f|
20
- f =~ /^(bench|gen|libtest|nbproject|spec)/
20
+ f =~ /^(\.|bench|gen|libtest|nbproject|spec)/
21
21
  end
22
22
 
23
23
  # Add libffi git files
data/lib/ffi.rb CHANGED
@@ -1,5 +1,4 @@
1
- if RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx'
2
- Object.send(:remove_const, :FFI) if defined?(::FFI)
1
+ if RUBY_ENGINE == 'ruby'
3
2
  begin
4
3
  require RUBY_VERSION.split('.')[0, 2].join('.') + '/ffi_c'
5
4
  rescue Exception
@@ -8,11 +7,11 @@ if RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx'
8
7
 
9
8
  require 'ffi/ffi'
10
9
 
11
- elsif RUBY_ENGINE == 'jruby' && Gem::Version.new(RUBY_ENGINE_VERSION) >= Gem::Version.new("9.3.pre")
10
+ elsif RUBY_ENGINE == 'jruby' && (RUBY_ENGINE_VERSION.split('.').map(&:to_i) <=> [9, 3]) >= 0
12
11
  JRuby::Util.load_ext("org.jruby.ext.ffi.FFIService")
13
12
  require 'ffi/ffi'
14
13
 
15
- elsif RUBY_ENGINE == 'truffleruby' && Gem::Version.new(RUBY_ENGINE_VERSION) >= Gem::Version.new("20.1.0-dev-a")
14
+ elsif RUBY_ENGINE == 'truffleruby' && (RUBY_ENGINE_VERSION.split('.').map(&:to_i) <=> [20, 1, 0]) >= 0
16
15
  require 'truffleruby/ffi_backend'
17
16
  require 'ffi/ffi'
18
17
 
@@ -0,0 +1,44 @@
1
+ #
2
+ # Copyright (C) 2020 Lars Kanis
3
+ #
4
+ # This file is part of ruby-ffi.
5
+ #
6
+ # All rights reserved.
7
+ #
8
+ # Redistribution and use in source and binary forms, with or without
9
+ # modification, are permitted provided that the following conditions are met:
10
+ #
11
+ # * Redistributions of source code must retain the above copyright notice, this
12
+ # list of conditions and the following disclaimer.
13
+ # * Redistributions in binary form must reproduce the above copyright notice
14
+ # this list of conditions and the following disclaimer in the documentation
15
+ # and/or other materials provided with the distribution.
16
+ # * Neither the name of the Ruby FFI project nor the names of its contributors
17
+ # may be used to endorse or promote products derived from this software
18
+ # without specific prior written permission.
19
+ #
20
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
21
+ # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
+ # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
23
+ # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
24
+ # FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
+ # DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
26
+ # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
27
+ # CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28
+ # OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.#
30
+
31
+
32
+ module FFI
33
+ class AbstractMemory
34
+ LONG_MAX = FFI::Pointer.new(1).size
35
+ private_constant :LONG_MAX
36
+
37
+ # Return +true+ if +self+ has a size limit.
38
+ #
39
+ # @return [Boolean]
40
+ def size_limit?
41
+ size != LONG_MAX
42
+ end
43
+ end
44
+ end
@@ -117,7 +117,7 @@ module FFI
117
117
  end
118
118
 
119
119
  # @abstract Base class for {AutoPointer}'s releasers.
120
- #
120
+ #
121
121
  # All subclasses of Releaser should define a +#release(ptr)+ method.
122
122
  # A releaser is an object in charge of release an {AutoPointer}.
123
123
  class Releaser
data/lib/ffi/ffi.rb CHANGED
@@ -33,6 +33,7 @@ require 'ffi/data_converter'
33
33
  require 'ffi/types'
34
34
  require 'ffi/library'
35
35
  require 'ffi/errno'
36
+ require 'ffi/abstract_memory'
36
37
  require 'ffi/pointer'
37
38
  require 'ffi/memorypointer'
38
39
  require 'ffi/struct'
data/lib/ffi/io.rb CHANGED
@@ -29,7 +29,7 @@
29
29
  # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.#
30
30
 
31
31
  module FFI
32
-
32
+
33
33
  # This module implements a couple of class methods to play with IO.
34
34
  module IO
35
35
  # @param [Integer] fd file decriptor
@@ -42,12 +42,12 @@ module FFI
42
42
 
43
43
  # @param [#read] io io to read from
44
44
  # @param [AbstractMemory] buf destination for data read from +io+
45
- # @param [nil, Numeric] len maximul number of bytes to read from +io+. If +nil+,
45
+ # @param [nil, Numeric] len maximul number of bytes to read from +io+. If +nil+,
46
46
  # read until end of file.
47
47
  # @return [Numeric] length really read, in bytes
48
48
  #
49
49
  # A version of IO#read that reads data from an IO and put then into a native buffer.
50
- #
50
+ #
51
51
  # This will be optimized at some future time to eliminate the double copy.
52
52
  #
53
53
  def self.native_read(io, buf, len)
data/lib/ffi/library.rb CHANGED
@@ -115,7 +115,7 @@ module FFI
115
115
  rescue Exception => ex
116
116
  ldscript = false
117
117
  if ex.message =~ /(([^ \t()])+\.so([^ \t:()])*):([ \t])*(invalid ELF header|file too short|invalid file format)/
118
- if File.read($1) =~ /(?:GROUP|INPUT) *\( *([^ \)]+)/
118
+ if File.binread($1) =~ /(?:GROUP|INPUT) *\( *([^ \)]+)/
119
119
  libname = $1
120
120
  ldscript = true
121
121
  end
@@ -126,7 +126,7 @@ module FFI
126
126
  else
127
127
  # TODO better library lookup logic
128
128
  unless libname.start_with?("/") || FFI::Platform.windows?
129
- path = ['/usr/lib/','/usr/local/lib/','/opt/local/lib/'].find do |pth|
129
+ path = ['/usr/lib/','/usr/local/lib/','/opt/local/lib/', '/opt/homebrew/lib/'].find do |pth|
130
130
  File.exist?(pth + libname)
131
131
  end
132
132
  if path
@@ -44,7 +44,7 @@ module FFI
44
44
  # attach_function :new_dlist, [], :pointer
45
45
  # attach_function :destroy_dlist, [:pointer], :void
46
46
  # end
47
- #
47
+ #
48
48
  # class DoublyLinkedList < FFI::ManagedStruct
49
49
  # @@@
50
50
  # struct do |s|
@@ -71,7 +71,7 @@ module FFI
71
71
 
72
72
  # @overload initialize(pointer)
73
73
  # @param [Pointer] pointer
74
- # Create a new ManagedStruct which will invoke the class method #release on
74
+ # Create a new ManagedStruct which will invoke the class method #release on
75
75
  # @overload initialize
76
76
  # A new instance of FFI::ManagedStruct.
77
77
  def initialize(pointer=nil)
data/lib/ffi/platform.rb CHANGED
@@ -63,7 +63,7 @@ module FFI
63
63
  ARCH = case CPU.downcase
64
64
  when /amd64|x86_64|x64/
65
65
  "x86_64"
66
- when /i?86|x86|i86pc/
66
+ when /i\d86|x86|i86pc/
67
67
  "i386"
68
68
  when /ppc64|powerpc64/
69
69
  "powerpc64"
@@ -71,13 +71,16 @@ module FFI
71
71
  "powerpc"
72
72
  when /sparcv9|sparc64/
73
73
  "sparcv9"
74
- else
75
- case RbConfig::CONFIG['host_cpu']
76
- when /^arm/
77
- "arm"
74
+ when /arm64|aarch64/ # MacOS calls it "arm64", other operating systems "aarch64"
75
+ "aarch64"
76
+ when /^arm/
77
+ if OS == "darwin" # Ruby before 3.0 reports "arm" instead of "arm64" as host_cpu on darwin
78
+ "aarch64"
78
79
  else
79
- RbConfig::CONFIG['host_cpu']
80
+ "arm"
80
81
  end
82
+ else
83
+ RbConfig::CONFIG['host_cpu']
81
84
  end
82
85
 
83
86
  private
@@ -129,11 +132,8 @@ module FFI
129
132
  end
130
133
 
131
134
  LIBC = if IS_WINDOWS
132
- if RbConfig::CONFIG['host_os'] =~ /mingw/i
133
- RbConfig::CONFIG['RUBY_SO_NAME'].split('-')[-2] + '.dll'
134
- else
135
- "ucrtbase.dll"
136
- end
135
+ crtname = RbConfig::CONFIG["RUBY_SO_NAME"][/msvc\w+/] || 'ucrtbase'
136
+ "#{crtname}.dll"
137
137
  elsif IS_GNU
138
138
  GNU_LIBC
139
139
  elsif OS == 'cygwin'
@@ -145,6 +145,12 @@ module FFI
145
145
  "#{LIBPREFIX}c.#{LIBSUFFIX}"
146
146
  end
147
147
 
148
+ LITTLE_ENDIAN = 1234 unless defined?(LITTLE_ENDIAN)
149
+ BIG_ENDIAN = 4321 unless defined?(BIG_ENDIAN)
150
+ unless defined?(BYTE_ORDER)
151
+ BYTE_ORDER = [0x12345678].pack("I") == [0x12345678].pack("N") ? BIG_ENDIAN : LITTLE_ENDIAN
152
+ end
153
+
148
154
  # Test if current OS is a *BSD (include MAC)
149
155
  # @return [Boolean]
150
156
  def self.bsd?