ffi 1.0.11 → 1.0.12.pre

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of ffi might be problematic. Click here for more details.

Files changed (159) hide show
  1. data/Rakefile +1 -1
  2. data/ext/ffi_c/AbstractMemory.c +9 -0
  3. data/ext/ffi_c/AbstractMemory.h +4 -0
  4. data/ext/ffi_c/Buffer.c +8 -0
  5. data/ext/ffi_c/Call.c +8 -0
  6. data/ext/ffi_c/ClosurePool.c +12 -0
  7. data/ext/ffi_c/DynamicLibrary.c +7 -1
  8. data/ext/ffi_c/Function.c +11 -1
  9. data/ext/ffi_c/Function.h +6 -0
  10. data/ext/ffi_c/FunctionInfo.c +8 -0
  11. data/ext/ffi_c/LastError.c +8 -0
  12. data/ext/ffi_c/MemoryPointer.c +8 -0
  13. data/ext/ffi_c/MemoryPointer.h +6 -0
  14. data/ext/ffi_c/MethodHandle.c +8 -0
  15. data/ext/ffi_c/Platform.c +8 -0
  16. data/ext/ffi_c/Pointer.c +8 -0
  17. data/ext/ffi_c/Pointer.h +6 -0
  18. data/ext/ffi_c/Struct.c +6 -0
  19. data/ext/ffi_c/StructByReference.c +8 -0
  20. data/ext/ffi_c/StructByValue.c +8 -0
  21. data/ext/ffi_c/StructLayout.c +6 -0
  22. data/ext/ffi_c/Thread.c +7 -0
  23. data/ext/ffi_c/Thread.h +6 -0
  24. data/ext/ffi_c/Type.c +3 -0
  25. data/ext/ffi_c/Types.h +4 -0
  26. data/ext/ffi_c/Variadic.c +8 -0
  27. data/ext/ffi_c/endian.h +3 -0
  28. data/ext/ffi_c/extconf.rb +6 -1
  29. data/ext/ffi_c/libffi.vc.mk +26 -0
  30. data/ext/ffi_c/libffi.vc64.mk +26 -0
  31. data/ext/ffi_c/libffi/ChangeLog +541 -0
  32. data/ext/ffi_c/libffi/ChangeLog.libffi +13 -87
  33. data/ext/ffi_c/libffi/LICENSE +3 -3
  34. data/ext/ffi_c/libffi/Makefile.am +41 -32
  35. data/ext/ffi_c/libffi/Makefile.in +95 -66
  36. data/ext/ffi_c/libffi/Makefile.vc +141 -0
  37. data/ext/ffi_c/libffi/Makefile.vc64 +141 -0
  38. data/ext/ffi_c/libffi/README +40 -4
  39. data/ext/ffi_c/libffi/aclocal.m4 +729 -7854
  40. data/ext/ffi_c/libffi/build-ios.sh +67 -0
  41. data/ext/ffi_c/libffi/compile +11 -10
  42. data/ext/ffi_c/libffi/config.guess +4 -1
  43. data/ext/ffi_c/libffi/config.sub +6 -3
  44. data/ext/ffi_c/libffi/configure +6264 -6354
  45. data/ext/ffi_c/libffi/configure.ac +155 -63
  46. data/ext/ffi_c/libffi/depcomp +81 -35
  47. data/ext/ffi_c/libffi/doc/libffi.info +78 -18
  48. data/ext/ffi_c/libffi/doc/libffi.texi +64 -5
  49. data/ext/ffi_c/libffi/doc/stamp-vti +4 -4
  50. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  51. data/ext/ffi_c/libffi/fficonfig.h.in +18 -0
  52. data/ext/ffi_c/libffi/fficonfig.hw +57 -0
  53. data/ext/ffi_c/libffi/include/Makefile.in +21 -3
  54. data/ext/ffi_c/libffi/include/ffi.h.in +42 -14
  55. data/ext/ffi_c/libffi/include/ffi.h.vc +427 -0
  56. data/ext/ffi_c/libffi/include/ffi.h.vc64 +427 -0
  57. data/ext/ffi_c/libffi/include/ffi_common.h +9 -5
  58. data/ext/ffi_c/libffi/install-sh +364 -167
  59. data/ext/ffi_c/libffi/ltmain.sh +2599 -1369
  60. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +176 -0
  61. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +195 -0
  62. data/ext/ffi_c/libffi/m4/ax_check_compiler_flags.m4 +76 -0
  63. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +63 -0
  64. data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +70 -0
  65. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +300 -0
  66. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +215 -0
  67. data/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 +79 -0
  68. data/ext/ffi_c/libffi/m4/libtool.m4 +1239 -768
  69. data/ext/ffi_c/libffi/m4/ltoptions.m4 +7 -6
  70. data/ext/ffi_c/libffi/m4/ltversion.m4 +6 -6
  71. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +9 -3
  72. data/ext/ffi_c/libffi/man/Makefile.in +21 -3
  73. data/ext/ffi_c/libffi/mdate-sh +0 -0
  74. data/ext/ffi_c/libffi/missing +60 -44
  75. data/ext/ffi_c/libffi/msvcc.sh +197 -0
  76. data/ext/ffi_c/libffi/src/alpha/osf.S +39 -18
  77. data/ext/ffi_c/libffi/src/arm/ffi.c +443 -24
  78. data/ext/ffi_c/libffi/src/arm/ffitarget.h +17 -1
  79. data/ext/ffi_c/libffi/src/arm/gentramp.sh +118 -0
  80. data/ext/ffi_c/libffi/src/arm/sysv.S +206 -15
  81. data/ext/ffi_c/libffi/src/arm/trampoline.S +4450 -0
  82. data/ext/ffi_c/libffi/src/avr32/ffi.c +4 -2
  83. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +2 -2
  84. data/ext/ffi_c/libffi/src/closures.c +17 -35
  85. data/ext/ffi_c/libffi/src/cris/ffi.c +1 -1
  86. data/ext/ffi_c/libffi/src/cris/ffitarget.h +2 -2
  87. data/ext/ffi_c/libffi/src/dlmalloc.c +66 -4
  88. data/ext/ffi_c/libffi/src/frv/ffitarget.h +2 -6
  89. data/ext/ffi_c/libffi/src/ia64/ffi.c +7 -5
  90. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +2 -2
  91. data/ext/ffi_c/libffi/src/java_raw_api.c +1 -1
  92. data/ext/ffi_c/libffi/src/m32r/ffitarget.h +2 -2
  93. data/ext/ffi_c/libffi/src/m68k/ffi.c +10 -0
  94. data/ext/ffi_c/libffi/src/m68k/ffitarget.h +2 -2
  95. data/ext/ffi_c/libffi/src/m68k/sysv.S +36 -0
  96. data/ext/ffi_c/libffi/src/mips/ffi.c +12 -5
  97. data/ext/ffi_c/libffi/src/mips/ffitarget.h +18 -11
  98. data/ext/ffi_c/libffi/src/mips/n32.S +4 -4
  99. data/ext/ffi_c/libffi/src/moxie/eabi.S +128 -0
  100. data/ext/ffi_c/libffi/src/moxie/ffi.c +276 -0
  101. data/ext/ffi_c/libffi/src/pa/ffi.c +7 -4
  102. data/ext/ffi_c/libffi/src/pa/ffitarget.h +6 -5
  103. data/ext/ffi_c/libffi/src/powerpc/aix.S +5 -1
  104. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +2 -0
  105. data/ext/ffi_c/libffi/src/powerpc/asm.h +1 -1
  106. data/ext/ffi_c/libffi/src/powerpc/darwin.S +215 -77
  107. data/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +358 -100
  108. data/ext/ffi_c/libffi/src/powerpc/ffi.c +11 -5
  109. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +603 -172
  110. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +17 -4
  111. data/ext/ffi_c/libffi/src/prep_cif.c +16 -13
  112. data/ext/ffi_c/libffi/src/s390/ffitarget.h +4 -2
  113. data/ext/ffi_c/libffi/src/sh/ffitarget.h +2 -2
  114. data/ext/ffi_c/libffi/src/sh64/ffitarget.h +2 -2
  115. data/ext/ffi_c/libffi/src/sparc/ffi.c +55 -11
  116. data/ext/ffi_c/libffi/src/sparc/ffitarget.h +5 -3
  117. data/ext/ffi_c/libffi/src/x86/ffi.c +54 -92
  118. data/ext/ffi_c/libffi/src/x86/ffi64.c +17 -8
  119. data/ext/ffi_c/libffi/src/x86/ffitarget.h +15 -14
  120. data/ext/ffi_c/libffi/src/x86/sysv.S +40 -26
  121. data/ext/ffi_c/libffi/src/x86/unix64.S +4 -0
  122. data/ext/ffi_c/libffi/src/x86/win32.S +379 -191
  123. data/ext/ffi_c/libffi/src/x86/win64.S +15 -7
  124. data/ext/ffi_c/libffi/testsuite/Makefile.am +1 -1
  125. data/ext/ffi_c/libffi/testsuite/Makefile.in +22 -4
  126. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +350 -0
  127. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +1 -5
  128. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +1 -1
  129. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +1 -1
  130. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +1 -0
  131. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +1 -0
  132. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +3 -0
  133. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +2 -2
  134. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +3 -0
  135. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +1 -1
  136. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +1 -1
  137. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +1 -0
  138. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c +2 -3
  139. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +2 -1
  140. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +36 -0
  141. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +17 -17
  142. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +1 -0
  143. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +1 -0
  144. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +1 -1
  145. data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +1 -3
  146. data/ext/ffi_c/win32/stdint.h +199 -0
  147. data/gen/Rakefile +18 -2
  148. data/lib/ffi/platform/arm-linux/types.conf +102 -0
  149. data/lib/ffi/platform/i486-gnu/types.conf +107 -0
  150. data/lib/ffi/platform/ia64-linux/types.conf +102 -0
  151. data/lib/ffi/platform/mips-linux/types.conf +102 -0
  152. data/lib/ffi/platform/mipsel-linux/types.conf +102 -0
  153. data/lib/ffi/platform/powerpc-linux/types.conf +100 -0
  154. data/lib/ffi/platform/s390-linux/types.conf +102 -0
  155. data/lib/ffi/platform/s390x-linux/types.conf +102 -0
  156. data/lib/ffi/platform/sparc-linux/types.conf +102 -0
  157. data/lib/ffi/tools/types_generator.rb +8 -1
  158. data/lib/ffi_c.bundle +0 -0
  159. metadata +72 -42
@@ -1,16 +1,17 @@
1
1
  /* -----------------------------------------------------------------*-C-*-
2
- libffi @VERSION@ - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc.
2
+ libffi @VERSION@ - Copyright (c) 2011 Anthony Green
3
+ - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc.
3
4
 
4
- Permission is hereby granted, free of charge, to any person obtaining
5
- a copy of this software and associated documentation files (the
6
- ``Software''), to deal in the Software without restriction, including
7
- without limitation the rights to use, copy, modify, merge, publish,
8
- distribute, sublicense, and/or sell copies of the Software, and to
9
- permit persons to whom the Software is furnished to do so, subject to
10
- the following conditions:
5
+ Permission is hereby granted, free of charge, to any person
6
+ obtaining a copy of this software and associated documentation
7
+ files (the ``Software''), to deal in the Software without
8
+ restriction, including without limitation the rights to use, copy,
9
+ modify, merge, publish, distribute, sublicense, and/or sell copies
10
+ of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
11
12
 
12
- The above copyright notice and this permission notice shall be included
13
- in all copies or substantial portions of the Software.
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
14
15
 
15
16
  THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
16
17
  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
@@ -57,7 +58,9 @@ extern "C" {
57
58
  #endif
58
59
 
59
60
  /* Specify which architecture libffi is configured for. */
61
+ #ifndef @TARGET@
60
62
  #define @TARGET@
63
+ #endif
61
64
 
62
65
  /* ---- System configuration information --------------------------------- */
63
66
 
@@ -75,15 +78,31 @@ extern "C" {
75
78
  /* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example).
76
79
  But we can find it either under the correct ANSI name, or under GNU
77
80
  C's internal name. */
81
+
82
+ #define FFI_64_BIT_MAX 9223372036854775807
83
+
78
84
  #ifdef LONG_LONG_MAX
79
85
  # define FFI_LONG_LONG_MAX LONG_LONG_MAX
80
86
  #else
81
87
  # ifdef LLONG_MAX
82
88
  # define FFI_LONG_LONG_MAX LLONG_MAX
89
+ # ifdef _AIX52 /* or newer has C99 LLONG_MAX */
90
+ # undef FFI_64_BIT_MAX
91
+ # define FFI_64_BIT_MAX 9223372036854775807LL
92
+ # endif /* _AIX52 or newer */
83
93
  # else
84
94
  # ifdef __GNUC__
85
95
  # define FFI_LONG_LONG_MAX __LONG_LONG_MAX__
86
96
  # endif
97
+ # ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */
98
+ # ifndef __PPC64__
99
+ # if defined (__IBMC__) || defined (__IBMCPP__)
100
+ # define FFI_LONG_LONG_MAX LONGLONG_MAX
101
+ # endif
102
+ # endif /* __PPC64__ */
103
+ # undef FFI_64_BIT_MAX
104
+ # define FFI_64_BIT_MAX 9223372036854775807LL
105
+ # endif
87
106
  # endif
88
107
  #endif
89
108
 
@@ -130,17 +149,17 @@ typedef struct _ffi_type
130
149
  #endif
131
150
 
132
151
  #if LONG_MAX == 2147483647
133
- # if FFI_LONG_LONG_MAX != 9223372036854775807
152
+ # if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX
134
153
  #error "no 64-bit data type supported"
135
154
  # endif
136
- #elif LONG_MAX != 9223372036854775807
155
+ #elif LONG_MAX != FFI_64_BIT_MAX
137
156
  #error "long size not supported"
138
157
  #endif
139
158
 
140
159
  #if LONG_MAX == 2147483647
141
160
  # define ffi_type_ulong ffi_type_uint32
142
161
  # define ffi_type_slong ffi_type_sint32
143
- #elif LONG_MAX == 9223372036854775807
162
+ #elif LONG_MAX == FFI_64_BIT_MAX
144
163
  # define ffi_type_ulong ffi_type_uint64
145
164
  # define ffi_type_slong ffi_type_sint64
146
165
  #else
@@ -193,7 +212,7 @@ typedef struct {
193
212
  #ifndef FFI_SIZEOF_ARG
194
213
  # if LONG_MAX == 2147483647
195
214
  # define FFI_SIZEOF_ARG 4
196
- # elif LONG_MAX == 9223372036854775807
215
+ # elif LONG_MAX == FFI_64_BIT_MAX
197
216
  # define FFI_SIZEOF_ARG 8
198
217
  # endif
199
218
  #endif
@@ -251,6 +270,9 @@ size_t ffi_java_raw_size (ffi_cif *cif);
251
270
 
252
271
  #if FFI_CLOSURES
253
272
 
273
+ #ifdef _MSC_VER
274
+ __declspec(align(8))
275
+ #endif
254
276
  typedef struct {
255
277
  char tramp[FFI_TRAMPOLINE_SIZE];
256
278
  ffi_cif *cif;
@@ -260,6 +282,9 @@ typedef struct {
260
282
  } ffi_closure __attribute__((aligned (8)));
261
283
  #else
262
284
  } ffi_closure;
285
+ # ifdef __sgi
286
+ # pragma pack 0
287
+ # endif
263
288
  #endif
264
289
 
265
290
  void *ffi_closure_alloc (size_t size, void **code);
@@ -278,6 +303,9 @@ ffi_prep_closure_loc (ffi_closure*,
278
303
  void *user_data,
279
304
  void*codeloc);
280
305
 
306
+ #ifdef __sgi
307
+ # pragma pack 8
308
+ #endif
281
309
  typedef struct {
282
310
  char tramp[FFI_TRAMPOLINE_SIZE];
283
311
 
@@ -0,0 +1,427 @@
1
+ /* -----------------------------------------------------------------*-C-*-
2
+ libffi 3.0.10 - Copyright (c) 2011 Anthony Green
3
+ - Copyright (c) 1996-2003, 2007, 2008 Red Hat, Inc.
4
+
5
+ Permission is hereby granted, free of charge, to any person
6
+ obtaining a copy of this software and associated documentation
7
+ files (the ``Software''), to deal in the Software without
8
+ restriction, including without limitation the rights to use, copy,
9
+ modify, merge, publish, distribute, sublicense, and/or sell copies
10
+ of the Software, and to permit persons to whom the Software is
11
+ furnished to do so, subject to the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
20
+ HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
21
+ WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23
+ DEALINGS IN THE SOFTWARE.
24
+
25
+ ----------------------------------------------------------------------- */
26
+
27
+ /* -------------------------------------------------------------------
28
+ The basic API is described in the README file.
29
+
30
+ The raw API is designed to bypass some of the argument packing
31
+ and unpacking on architectures for which it can be avoided.
32
+
33
+ The closure API allows interpreted functions to be packaged up
34
+ inside a C function pointer, so that they can be called as C functions,
35
+ with no understanding on the client side that they are interpreted.
36
+ It can also be used in other cases in which it is necessary to package
37
+ up a user specified parameter and a function pointer as a single
38
+ function pointer.
39
+
40
+ The closure API must be implemented in order to get its functionality,
41
+ e.g. for use by gij. Routines are provided to emulate the raw API
42
+ if the underlying platform doesn't allow faster implementation.
43
+
44
+ More details on the raw and cloure API can be found in:
45
+
46
+ http://gcc.gnu.org/ml/java/1999-q3/msg00138.html
47
+
48
+ and
49
+
50
+ http://gcc.gnu.org/ml/java/1999-q3/msg00174.html
51
+ -------------------------------------------------------------------- */
52
+
53
+ #ifndef LIBFFI_H
54
+ #define LIBFFI_H
55
+
56
+ #ifdef __cplusplus
57
+ extern "C" {
58
+ #endif
59
+
60
+ /* Specify which architecture libffi is configured for. */
61
+ #ifndef X86_WIN32
62
+ #define X86_WIN32
63
+ #endif
64
+
65
+ /* ---- System configuration information --------------------------------- */
66
+
67
+ #include <ffitarget.h>
68
+
69
+ #ifndef LIBFFI_ASM
70
+
71
+ #ifdef _MSC_VER
72
+ #define __attribute__(X)
73
+ #endif
74
+
75
+ #include <stddef.h>
76
+ #include <limits.h>
77
+
78
+ /* LONG_LONG_MAX is not always defined (not if STRICT_ANSI, for example).
79
+ But we can find it either under the correct ANSI name, or under GNU
80
+ C's internal name. */
81
+
82
+ #define FFI_64_BIT_MAX 9223372036854775807
83
+
84
+ #ifdef LONG_LONG_MAX
85
+ # define FFI_LONG_LONG_MAX LONG_LONG_MAX
86
+ #else
87
+ # ifdef LLONG_MAX
88
+ # define FFI_LONG_LONG_MAX LLONG_MAX
89
+ # ifdef _AIX52 /* or newer has C99 LLONG_MAX */
90
+ # undef FFI_64_BIT_MAX
91
+ # define FFI_64_BIT_MAX 9223372036854775807LL
92
+ # endif /* _AIX52 or newer */
93
+ # else
94
+ # ifdef __GNUC__
95
+ # define FFI_LONG_LONG_MAX __LONG_LONG_MAX__
96
+ # endif
97
+ # ifdef _AIX /* AIX 5.1 and earlier have LONGLONG_MAX */
98
+ # ifndef __PPC64__
99
+ # if defined (__IBMC__) || defined (__IBMCPP__)
100
+ # define FFI_LONG_LONG_MAX LONGLONG_MAX
101
+ # endif
102
+ # endif /* __PPC64__ */
103
+ # undef FFI_64_BIT_MAX
104
+ # define FFI_64_BIT_MAX 9223372036854775807LL
105
+ # endif
106
+ # endif
107
+ #endif
108
+
109
+ /* The closure code assumes that this works on pointers, i.e. a size_t */
110
+ /* can hold a pointer. */
111
+
112
+ typedef struct _ffi_type
113
+ {
114
+ size_t size;
115
+ unsigned short alignment;
116
+ unsigned short type;
117
+ struct _ffi_type **elements;
118
+ } ffi_type;
119
+
120
+ #ifndef LIBFFI_HIDE_BASIC_TYPES
121
+ #if SCHAR_MAX == 127
122
+ # define ffi_type_uchar ffi_type_uint8
123
+ # define ffi_type_schar ffi_type_sint8
124
+ #else
125
+ #error "char size not supported"
126
+ #endif
127
+
128
+ #if SHRT_MAX == 32767
129
+ # define ffi_type_ushort ffi_type_uint16
130
+ # define ffi_type_sshort ffi_type_sint16
131
+ #elif SHRT_MAX == 2147483647
132
+ # define ffi_type_ushort ffi_type_uint32
133
+ # define ffi_type_sshort ffi_type_sint32
134
+ #else
135
+ #error "short size not supported"
136
+ #endif
137
+
138
+ #if INT_MAX == 32767
139
+ # define ffi_type_uint ffi_type_uint16
140
+ # define ffi_type_sint ffi_type_sint16
141
+ #elif INT_MAX == 2147483647
142
+ # define ffi_type_uint ffi_type_uint32
143
+ # define ffi_type_sint ffi_type_sint32
144
+ #elif INT_MAX == 9223372036854775807
145
+ # define ffi_type_uint ffi_type_uint64
146
+ # define ffi_type_sint ffi_type_sint64
147
+ #else
148
+ #error "int size not supported"
149
+ #endif
150
+
151
+ #if LONG_MAX == 2147483647
152
+ # if FFI_LONG_LONG_MAX != FFI_64_BIT_MAX
153
+ #error "no 64-bit data type supported"
154
+ # endif
155
+ #elif LONG_MAX != FFI_64_BIT_MAX
156
+ #error "long size not supported"
157
+ #endif
158
+
159
+ #if LONG_MAX == 2147483647
160
+ # define ffi_type_ulong ffi_type_uint32
161
+ # define ffi_type_slong ffi_type_sint32
162
+ #elif LONG_MAX == FFI_64_BIT_MAX
163
+ # define ffi_type_ulong ffi_type_uint64
164
+ # define ffi_type_slong ffi_type_sint64
165
+ #else
166
+ #error "long size not supported"
167
+ #endif
168
+
169
+ /* These are defined in types.c */
170
+ extern ffi_type ffi_type_void;
171
+ extern ffi_type ffi_type_uint8;
172
+ extern ffi_type ffi_type_sint8;
173
+ extern ffi_type ffi_type_uint16;
174
+ extern ffi_type ffi_type_sint16;
175
+ extern ffi_type ffi_type_uint32;
176
+ extern ffi_type ffi_type_sint32;
177
+ extern ffi_type ffi_type_uint64;
178
+ extern ffi_type ffi_type_sint64;
179
+ extern ffi_type ffi_type_float;
180
+ extern ffi_type ffi_type_double;
181
+ extern ffi_type ffi_type_pointer;
182
+
183
+ #if 0
184
+ extern ffi_type ffi_type_longdouble;
185
+ #else
186
+ #define ffi_type_longdouble ffi_type_double
187
+ #endif
188
+ #endif /* LIBFFI_HIDE_BASIC_TYPES */
189
+
190
+ typedef enum {
191
+ FFI_OK = 0,
192
+ FFI_BAD_TYPEDEF,
193
+ FFI_BAD_ABI
194
+ } ffi_status;
195
+
196
+ typedef unsigned FFI_TYPE;
197
+
198
+ typedef struct {
199
+ ffi_abi abi;
200
+ unsigned nargs;
201
+ ffi_type **arg_types;
202
+ ffi_type *rtype;
203
+ unsigned bytes;
204
+ unsigned flags;
205
+ #ifdef FFI_EXTRA_CIF_FIELDS
206
+ FFI_EXTRA_CIF_FIELDS;
207
+ #endif
208
+ } ffi_cif;
209
+
210
+ /* ---- Definitions for the raw API -------------------------------------- */
211
+
212
+ #ifndef FFI_SIZEOF_ARG
213
+ # if LONG_MAX == 2147483647
214
+ # define FFI_SIZEOF_ARG 4
215
+ # elif LONG_MAX == FFI_64_BIT_MAX
216
+ # define FFI_SIZEOF_ARG 8
217
+ # endif
218
+ #endif
219
+
220
+ #ifndef FFI_SIZEOF_JAVA_RAW
221
+ # define FFI_SIZEOF_JAVA_RAW FFI_SIZEOF_ARG
222
+ #endif
223
+
224
+ typedef union {
225
+ ffi_sarg sint;
226
+ ffi_arg uint;
227
+ float flt;
228
+ char data[FFI_SIZEOF_ARG];
229
+ void* ptr;
230
+ } ffi_raw;
231
+
232
+ #if FFI_SIZEOF_JAVA_RAW == 4 && FFI_SIZEOF_ARG == 8
233
+ /* This is a special case for mips64/n32 ABI (and perhaps others) where
234
+ sizeof(void *) is 4 and FFI_SIZEOF_ARG is 8. */
235
+ typedef union {
236
+ signed int sint;
237
+ unsigned int uint;
238
+ float flt;
239
+ char data[FFI_SIZEOF_JAVA_RAW];
240
+ void* ptr;
241
+ } ffi_java_raw;
242
+ #else
243
+ typedef ffi_raw ffi_java_raw;
244
+ #endif
245
+
246
+
247
+ void ffi_raw_call (ffi_cif *cif,
248
+ void (*fn)(void),
249
+ void *rvalue,
250
+ ffi_raw *avalue);
251
+
252
+ void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw);
253
+ void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args);
254
+ size_t ffi_raw_size (ffi_cif *cif);
255
+
256
+ /* This is analogous to the raw API, except it uses Java parameter */
257
+ /* packing, even on 64-bit machines. I.e. on 64-bit machines */
258
+ /* longs and doubles are followed by an empty 64-bit word. */
259
+
260
+ void ffi_java_raw_call (ffi_cif *cif,
261
+ void (*fn)(void),
262
+ void *rvalue,
263
+ ffi_java_raw *avalue);
264
+
265
+ void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw);
266
+ void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args);
267
+ size_t ffi_java_raw_size (ffi_cif *cif);
268
+
269
+ /* ---- Definitions for closures ----------------------------------------- */
270
+
271
+ #if FFI_CLOSURES
272
+
273
+ #ifdef _MSC_VER
274
+ __declspec(align(8))
275
+ #endif
276
+ typedef struct {
277
+ char tramp[FFI_TRAMPOLINE_SIZE];
278
+ ffi_cif *cif;
279
+ void (*fun)(ffi_cif*,void*,void**,void*);
280
+ void *user_data;
281
+ #ifdef __GNUC__
282
+ } ffi_closure __attribute__((aligned (8)));
283
+ #else
284
+ } ffi_closure;
285
+ # ifdef __sgi
286
+ # pragma pack 0
287
+ # endif
288
+ #endif
289
+
290
+ void *ffi_closure_alloc (size_t size, void **code);
291
+ void ffi_closure_free (void *);
292
+
293
+ ffi_status
294
+ ffi_prep_closure (ffi_closure*,
295
+ ffi_cif *,
296
+ void (*fun)(ffi_cif*,void*,void**,void*),
297
+ void *user_data);
298
+
299
+ ffi_status
300
+ ffi_prep_closure_loc (ffi_closure*,
301
+ ffi_cif *,
302
+ void (*fun)(ffi_cif*,void*,void**,void*),
303
+ void *user_data,
304
+ void*codeloc);
305
+
306
+ #ifdef __sgi
307
+ # pragma pack 8
308
+ #endif
309
+ typedef struct {
310
+ char tramp[FFI_TRAMPOLINE_SIZE];
311
+
312
+ ffi_cif *cif;
313
+
314
+ #if !FFI_NATIVE_RAW_API
315
+
316
+ /* if this is enabled, then a raw closure has the same layout
317
+ as a regular closure. We use this to install an intermediate
318
+ handler to do the transaltion, void** -> ffi_raw*. */
319
+
320
+ void (*translate_args)(ffi_cif*,void*,void**,void*);
321
+ void *this_closure;
322
+
323
+ #endif
324
+
325
+ void (*fun)(ffi_cif*,void*,ffi_raw*,void*);
326
+ void *user_data;
327
+
328
+ } ffi_raw_closure;
329
+
330
+ typedef struct {
331
+ char tramp[FFI_TRAMPOLINE_SIZE];
332
+
333
+ ffi_cif *cif;
334
+
335
+ #if !FFI_NATIVE_RAW_API
336
+
337
+ /* if this is enabled, then a raw closure has the same layout
338
+ as a regular closure. We use this to install an intermediate
339
+ handler to do the transaltion, void** -> ffi_raw*. */
340
+
341
+ void (*translate_args)(ffi_cif*,void*,void**,void*);
342
+ void *this_closure;
343
+
344
+ #endif
345
+
346
+ void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*);
347
+ void *user_data;
348
+
349
+ } ffi_java_raw_closure;
350
+
351
+ ffi_status
352
+ ffi_prep_raw_closure (ffi_raw_closure*,
353
+ ffi_cif *cif,
354
+ void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
355
+ void *user_data);
356
+
357
+ ffi_status
358
+ ffi_prep_raw_closure_loc (ffi_raw_closure*,
359
+ ffi_cif *cif,
360
+ void (*fun)(ffi_cif*,void*,ffi_raw*,void*),
361
+ void *user_data,
362
+ void *codeloc);
363
+
364
+ ffi_status
365
+ ffi_prep_java_raw_closure (ffi_java_raw_closure*,
366
+ ffi_cif *cif,
367
+ void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*),
368
+ void *user_data);
369
+
370
+ ffi_status
371
+ ffi_prep_java_raw_closure_loc (ffi_java_raw_closure*,
372
+ ffi_cif *cif,
373
+ void (*fun)(ffi_cif*,void*,ffi_java_raw*,void*),
374
+ void *user_data,
375
+ void *codeloc);
376
+
377
+ #endif /* FFI_CLOSURES */
378
+
379
+ /* ---- Public interface definition -------------------------------------- */
380
+
381
+ ffi_status ffi_prep_cif(ffi_cif *cif,
382
+ ffi_abi abi,
383
+ unsigned int nargs,
384
+ ffi_type *rtype,
385
+ ffi_type **atypes);
386
+
387
+ void ffi_call(ffi_cif *cif,
388
+ void (*fn)(void),
389
+ void *rvalue,
390
+ void **avalue);
391
+
392
+ /* Useful for eliminating compiler warnings */
393
+ #define FFI_FN(f) ((void (*)(void))f)
394
+
395
+ /* ---- Definitions shared with assembly code ---------------------------- */
396
+
397
+ #endif
398
+
399
+ /* If these change, update src/mips/ffitarget.h. */
400
+ #define FFI_TYPE_VOID 0
401
+ #define FFI_TYPE_INT 1
402
+ #define FFI_TYPE_FLOAT 2
403
+ #define FFI_TYPE_DOUBLE 3
404
+ #if 0
405
+ #define FFI_TYPE_LONGDOUBLE 4
406
+ #else
407
+ #define FFI_TYPE_LONGDOUBLE FFI_TYPE_DOUBLE
408
+ #endif
409
+ #define FFI_TYPE_UINT8 5
410
+ #define FFI_TYPE_SINT8 6
411
+ #define FFI_TYPE_UINT16 7
412
+ #define FFI_TYPE_SINT16 8
413
+ #define FFI_TYPE_UINT32 9
414
+ #define FFI_TYPE_SINT32 10
415
+ #define FFI_TYPE_UINT64 11
416
+ #define FFI_TYPE_SINT64 12
417
+ #define FFI_TYPE_STRUCT 13
418
+ #define FFI_TYPE_POINTER 14
419
+
420
+ /* This should always refer to the last type code (for sanity checks) */
421
+ #define FFI_TYPE_LAST FFI_TYPE_POINTER
422
+
423
+ #ifdef __cplusplus
424
+ }
425
+ #endif
426
+
427
+ #endif