ffi 0.5.0 → 0.6.0

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 (212) hide show
  1. data/LICENSE +1 -27
  2. data/Rakefile +9 -12
  3. data/ext/ffi_c/AbstractMemory.c +11 -8
  4. data/ext/ffi_c/AbstractMemory.h +23 -21
  5. data/ext/ffi_c/AutoPointer.c +0 -1
  6. data/ext/ffi_c/Buffer.c +24 -8
  7. data/ext/ffi_c/Call.c +28 -0
  8. data/ext/ffi_c/Call.h +8 -4
  9. data/ext/ffi_c/ClosurePool.c +7 -5
  10. data/ext/ffi_c/DynamicLibrary.c +0 -1
  11. data/ext/ffi_c/Function.c +19 -2
  12. data/ext/ffi_c/MemoryPointer.c +3 -3
  13. data/ext/ffi_c/MethodHandle.c +1 -1
  14. data/ext/ffi_c/Pointer.c +23 -9
  15. data/ext/ffi_c/Struct.c +142 -69
  16. data/ext/ffi_c/Struct.h +16 -7
  17. data/ext/ffi_c/StructLayout.c +92 -55
  18. data/ext/ffi_c/Type.c +5 -22
  19. data/ext/ffi_c/Type.h +1 -1
  20. data/ext/ffi_c/Types.c +8 -2
  21. data/ext/ffi_c/Types.h +2 -0
  22. data/ext/ffi_c/Variadic.c +7 -19
  23. data/ext/ffi_c/endian.h +1 -1
  24. data/ext/ffi_c/extconf.rb +20 -11
  25. data/ext/ffi_c/libffi/ChangeLog +900 -84
  26. data/ext/ffi_c/libffi/ChangeLog.libffi +311 -0
  27. data/ext/ffi_c/libffi/LICENSE +1 -1
  28. data/ext/ffi_c/libffi/Makefile.am +14 -4
  29. data/ext/ffi_c/libffi/Makefile.in +362 -211
  30. data/ext/ffi_c/libffi/README +70 -92
  31. data/ext/ffi_c/libffi/aclocal.m4 +6068 -4586
  32. data/ext/ffi_c/libffi/config.guess +125 -143
  33. data/ext/ffi_c/libffi/config.sub +103 -27
  34. data/ext/ffi_c/libffi/configure +11364 -18497
  35. data/ext/ffi_c/libffi/configure.ac +43 -4
  36. data/ext/ffi_c/libffi/doc/libffi.info +15 -15
  37. data/ext/ffi_c/libffi/doc/libffi.texi +1 -1
  38. data/ext/ffi_c/libffi/doc/stamp-vti +4 -4
  39. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  40. data/ext/ffi_c/libffi/fficonfig.h.in +24 -3
  41. data/ext/ffi_c/libffi/include/Makefile.am +1 -1
  42. data/ext/ffi_c/libffi/include/Makefile.in +97 -50
  43. data/ext/ffi_c/libffi/include/ffi.h.in +8 -2
  44. data/ext/ffi_c/libffi/include/ffi_common.h +24 -0
  45. data/ext/ffi_c/libffi/libtool-version +1 -1
  46. data/ext/ffi_c/libffi/ltmain.sh +7346 -5870
  47. data/ext/ffi_c/libffi/m4/libtool.m4 +7360 -0
  48. data/ext/ffi_c/libffi/m4/ltoptions.m4 +368 -0
  49. data/ext/ffi_c/libffi/m4/ltsugar.m4 +123 -0
  50. data/ext/ffi_c/libffi/m4/ltversion.m4 +23 -0
  51. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +92 -0
  52. data/ext/ffi_c/libffi/man/Makefile.in +115 -62
  53. data/ext/ffi_c/libffi/man/ffi_call.3 +3 -3
  54. data/ext/ffi_c/libffi/missing +15 -8
  55. data/ext/ffi_c/libffi/src/arm/sysv.S +15 -8
  56. data/ext/ffi_c/libffi/src/avr32/ffi.c +421 -0
  57. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +50 -0
  58. data/ext/ffi_c/libffi/src/avr32/sysv.S +208 -0
  59. data/ext/ffi_c/libffi/src/closures.c +47 -10
  60. data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
  61. data/ext/ffi_c/libffi/src/java_raw_api.c +0 -3
  62. data/ext/ffi_c/libffi/src/mips/ffi.c +135 -32
  63. data/ext/ffi_c/libffi/src/mips/ffitarget.h +37 -4
  64. data/ext/ffi_c/libffi/src/mips/n32.S +67 -10
  65. data/ext/ffi_c/libffi/src/mips/o32.S +8 -8
  66. data/ext/ffi_c/libffi/src/pa/ffi.c +7 -0
  67. data/ext/ffi_c/libffi/src/powerpc/aix.S +163 -64
  68. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +308 -112
  69. data/ext/ffi_c/libffi/src/powerpc/ffi.c +20 -7
  70. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +208 -80
  71. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +11 -3
  72. data/ext/ffi_c/libffi/src/powerpc/sysv.S +12 -23
  73. data/ext/ffi_c/libffi/src/s390/sysv.S +1 -1
  74. data/ext/ffi_c/libffi/src/sh/sysv.S +9 -9
  75. data/ext/ffi_c/libffi/src/sh64/ffi.c +37 -22
  76. data/ext/ffi_c/libffi/src/sh64/sysv.S +23 -14
  77. data/ext/ffi_c/libffi/src/sparc/ffi.c +21 -6
  78. data/ext/ffi_c/libffi/src/sparc/v8.S +55 -14
  79. data/ext/ffi_c/libffi/src/x86/darwin.S +10 -9
  80. data/ext/ffi_c/libffi/src/x86/ffi.c +293 -86
  81. data/ext/ffi_c/libffi/src/x86/ffi64.c +73 -19
  82. data/ext/ffi_c/libffi/src/x86/ffitarget.h +30 -0
  83. data/ext/ffi_c/libffi/src/x86/sysv.S +21 -4
  84. data/ext/ffi_c/libffi/src/x86/unix64.S +8 -4
  85. data/ext/ffi_c/libffi/src/x86/win32.S +633 -147
  86. data/ext/ffi_c/libffi/src/x86/win64.S +460 -0
  87. data/ext/ffi_c/libffi/testsuite/Makefile.am +63 -54
  88. data/ext/ffi_c/libffi/testsuite/Makefile.in +112 -77
  89. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +12 -1
  90. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +4 -4
  91. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +7 -15
  92. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +7 -15
  93. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +7 -15
  94. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +7 -15
  95. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +7 -15
  96. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +7 -14
  97. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +7 -15
  98. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c +95 -0
  99. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c +6 -14
  100. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +4 -12
  101. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +4 -12
  102. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +4 -12
  103. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +4 -12
  104. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +4 -12
  105. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +4 -12
  106. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +4 -12
  107. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +4 -12
  108. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +4 -12
  109. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +4 -12
  110. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +4 -12
  111. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +4 -12
  112. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +4 -12
  113. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +4 -12
  114. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +4 -12
  115. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +4 -12
  116. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +4 -12
  117. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +4 -12
  118. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +4 -12
  119. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +4 -12
  120. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +4 -12
  121. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +4 -12
  122. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +4 -12
  123. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +4 -12
  124. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +4 -12
  125. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +4 -12
  126. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +4 -12
  127. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +134 -0
  128. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +117 -0
  129. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +11 -17
  130. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +4 -12
  131. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +4 -12
  132. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +7 -15
  133. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +4 -12
  134. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +4 -12
  135. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +7 -15
  136. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +66 -0
  137. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +4 -12
  138. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +57 -0
  139. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +4 -13
  140. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +105 -0
  141. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +57 -0
  142. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +4 -12
  143. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +4 -12
  144. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +4 -12
  145. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +4 -12
  146. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +4 -12
  147. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +4 -12
  148. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +74 -0
  149. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +140 -0
  150. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +4 -12
  151. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +4 -12
  152. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +4 -12
  153. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +4 -12
  154. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +4 -12
  155. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +8 -16
  156. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +4 -12
  157. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c +37 -0
  158. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +25 -0
  159. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +31 -0
  160. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +2 -1
  161. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +342 -0
  162. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +4 -12
  163. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +4 -12
  164. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +4 -12
  165. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +4 -12
  166. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +4 -12
  167. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +4 -12
  168. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +4 -12
  169. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +4 -12
  170. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +4 -12
  171. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +4 -12
  172. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +4 -12
  173. data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +4 -12
  174. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
  175. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +1 -1
  176. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +145 -0
  177. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +148 -0
  178. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +124 -0
  179. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +124 -0
  180. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +70 -0
  181. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +10 -0
  182. data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +4 -5
  183. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc +17 -16
  184. data/ext/ffi_c/libffi/texinfo.tex +155 -427
  185. data/ext/ffi_c/libffi.bsd.mk +1 -1
  186. data/lib/ffi/autopointer.rb +79 -20
  187. data/lib/ffi/buffer.rb +4 -0
  188. data/lib/ffi/callback.rb +4 -10
  189. data/lib/ffi/enum.rb +28 -0
  190. data/lib/ffi/ffi.rb +0 -1
  191. data/lib/ffi/io.rb +28 -0
  192. data/lib/ffi/library.rb +237 -182
  193. data/lib/ffi/memorypointer.rb +28 -62
  194. data/lib/ffi/platform.rb +27 -0
  195. data/lib/ffi/pointer.rb +28 -0
  196. data/lib/ffi/struct.rb +55 -1
  197. data/lib/ffi/types.rb +29 -0
  198. data/lib/ffi/variadic.rb +29 -0
  199. data/spec/ffi/library_spec.rb +31 -5
  200. data/spec/ffi/managed_struct_spec.rb +1 -1
  201. data/spec/ffi/pointer_spec.rb +1 -1
  202. data/spec/ffi/rbx/attach_function_spec.rb +2 -1
  203. data/spec/ffi/rbx/memory_pointer_spec.rb +2 -1
  204. data/spec/ffi/spec_helper.rb +5 -1
  205. data/spec/ffi/struct_spec.rb +77 -0
  206. metadata +28 -18
  207. data/ext/ffi_c/libffi/TODO +0 -1
  208. data/ext/ffi_c/libffi/ltcf-c.sh +0 -861
  209. data/ext/ffi_c/libffi/ltcf-cxx.sh +0 -1069
  210. data/ext/ffi_c/libffi/ltcf-gcj.sh +0 -700
  211. data/ext/ffi_c/libffi/ltconfig +0 -2862
  212. data/ext/ffi_c/libffi/mkinstalldirs +0 -158
@@ -21,19 +21,11 @@ typedef signed char (*cls_ret_schar)(signed char);
21
21
  int main (void)
22
22
  {
23
23
  ffi_cif cif;
24
- #ifndef USING_MMAP
25
- static ffi_closure cl;
26
- #endif
27
- ffi_closure *pcl;
24
+ void *code;
25
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
28
26
  ffi_type * cl_arg_types[2];
29
27
  signed char res;
30
28
 
31
- #ifdef USING_MMAP
32
- pcl = allocate_mmap (sizeof(ffi_closure));
33
- #else
34
- pcl = &cl;
35
- #endif
36
-
37
29
  cl_arg_types[0] = &ffi_type_schar;
38
30
  cl_arg_types[1] = NULL;
39
31
 
@@ -41,9 +33,9 @@ int main (void)
41
33
  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
42
34
  &ffi_type_schar, cl_arg_types) == FFI_OK);
43
35
 
44
- CHECK(ffi_prep_closure(pcl, &cif, cls_ret_schar_fn, NULL) == FFI_OK);
36
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_schar_fn, NULL, code) == FFI_OK);
45
37
 
46
- res = (*((cls_ret_schar)pcl))(127);
38
+ res = (*((cls_ret_schar)code))(127);
47
39
  /* { dg-output "127: 127" } */
48
40
  printf("res: %d\n", res);
49
41
  /* { dg-output "\nres: 127" } */
@@ -19,19 +19,11 @@ typedef signed int (*cls_ret_sint)(signed int);
19
19
  int main (void)
20
20
  {
21
21
  ffi_cif cif;
22
- #ifndef USING_MMAP
23
- static ffi_closure cl;
24
- #endif
25
- ffi_closure *pcl;
22
+ void *code;
23
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
26
24
  ffi_type * cl_arg_types[2];
27
25
  signed int res;
28
26
 
29
- #ifdef USING_MMAP
30
- pcl = allocate_mmap (sizeof(ffi_closure));
31
- #else
32
- pcl = &cl;
33
- #endif
34
-
35
27
  cl_arg_types[0] = &ffi_type_sint;
36
28
  cl_arg_types[1] = NULL;
37
29
 
@@ -39,9 +31,9 @@ int main (void)
39
31
  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
40
32
  &ffi_type_sint, cl_arg_types) == FFI_OK);
41
33
 
42
- CHECK(ffi_prep_closure(pcl, &cif, cls_ret_sint_fn, NULL) == FFI_OK);
34
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_sint_fn, NULL, code) == FFI_OK);
43
35
 
44
- res = (*((cls_ret_sint)pcl))(65534);
36
+ res = (*((cls_ret_sint)code))(65534);
45
37
  /* { dg-output "65534: 65534" } */
46
38
  printf("res: %d\n",res);
47
39
  /* { dg-output "\nres: 65534" } */
@@ -19,19 +19,11 @@ typedef signed short (*cls_ret_sshort)(signed short);
19
19
  int main (void)
20
20
  {
21
21
  ffi_cif cif;
22
- #ifndef USING_MMAP
23
- static ffi_closure cl;
24
- #endif
25
- ffi_closure *pcl;
22
+ void *code;
23
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
26
24
  ffi_type * cl_arg_types[2];
27
25
  signed short res;
28
26
 
29
- #ifdef USING_MMAP
30
- pcl = allocate_mmap (sizeof(ffi_closure));
31
- #else
32
- pcl = &cl;
33
- #endif
34
-
35
27
  cl_arg_types[0] = &ffi_type_sshort;
36
28
  cl_arg_types[1] = NULL;
37
29
 
@@ -39,9 +31,9 @@ int main (void)
39
31
  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
40
32
  &ffi_type_sshort, cl_arg_types) == FFI_OK);
41
33
 
42
- CHECK(ffi_prep_closure(pcl, &cif, cls_ret_sshort_fn, NULL) == FFI_OK);
34
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_sshort_fn, NULL, code) == FFI_OK);
43
35
 
44
- res = (*((cls_ret_sshort)pcl))(255);
36
+ res = (*((cls_ret_sshort)code))(255);
45
37
  /* { dg-output "255: 255" } */
46
38
  printf("res: %d\n",res);
47
39
  /* { dg-output "\nres: 255" } */
@@ -19,19 +19,11 @@ typedef unsigned char (*cls_ret_uchar)(unsigned char);
19
19
  int main (void)
20
20
  {
21
21
  ffi_cif cif;
22
- #ifndef USING_MMAP
23
- static ffi_closure cl;
24
- #endif
25
- ffi_closure *pcl;
22
+ void *code;
23
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
26
24
  ffi_type * cl_arg_types[2];
27
25
  unsigned char res;
28
26
 
29
- #ifdef USING_MMAP
30
- pcl = allocate_mmap (sizeof(ffi_closure));
31
- #else
32
- pcl = &cl;
33
- #endif
34
-
35
27
  cl_arg_types[0] = &ffi_type_uchar;
36
28
  cl_arg_types[1] = NULL;
37
29
 
@@ -39,9 +31,9 @@ int main (void)
39
31
  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
40
32
  &ffi_type_uchar, cl_arg_types) == FFI_OK);
41
33
 
42
- CHECK(ffi_prep_closure(pcl, &cif, cls_ret_uchar_fn, NULL) == FFI_OK);
34
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_uchar_fn, NULL, code) == FFI_OK);
43
35
 
44
- res = (*((cls_ret_uchar)pcl))(127);
36
+ res = (*((cls_ret_uchar)code))(127);
45
37
  /* { dg-output "127: 127" } */
46
38
  printf("res: %d\n",res);
47
39
  /* { dg-output "\nres: 127" } */
@@ -20,19 +20,11 @@ typedef unsigned int (*cls_ret_uint)(unsigned int);
20
20
  int main (void)
21
21
  {
22
22
  ffi_cif cif;
23
- #ifndef USING_MMAP
24
- static ffi_closure cl;
25
- #endif
26
- ffi_closure *pcl;
23
+ void *code;
24
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
27
25
  ffi_type * cl_arg_types[2];
28
26
  unsigned int res;
29
27
 
30
- #ifdef USING_MMAP
31
- pcl = allocate_mmap (sizeof(ffi_closure));
32
- #else
33
- pcl = &cl;
34
- #endif
35
-
36
28
  cl_arg_types[0] = &ffi_type_uint;
37
29
  cl_arg_types[1] = NULL;
38
30
 
@@ -40,9 +32,9 @@ int main (void)
40
32
  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
41
33
  &ffi_type_uint, cl_arg_types) == FFI_OK);
42
34
 
43
- CHECK(ffi_prep_closure(pcl, &cif, cls_ret_uint_fn, NULL) == FFI_OK);
35
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_uint_fn, NULL, code) == FFI_OK);
44
36
 
45
- res = (*((cls_ret_uint)pcl))(2147483647);
37
+ res = (*((cls_ret_uint)code))(2147483647);
46
38
  /* { dg-output "2147483647: 2147483647" } */
47
39
  printf("res: %d\n",res);
48
40
  /* { dg-output "\nres: 2147483647" } */
@@ -12,7 +12,7 @@ static void cls_ret_ulonglong_fn(ffi_cif* cif __UNUSED__, void* resp,
12
12
  {
13
13
  *(unsigned long long *)resp= *(unsigned long long *)args[0];
14
14
 
15
- printf("%llu: %llu\n",*(unsigned long long *)args[0],
15
+ printf("%" PRIuLL ": %" PRIuLL "\n",*(unsigned long long *)args[0],
16
16
  *(unsigned long long *)(resp));
17
17
  }
18
18
  typedef unsigned long long (*cls_ret_ulonglong)(unsigned long long);
@@ -20,34 +20,26 @@ typedef unsigned long long (*cls_ret_ulonglong)(unsigned long long);
20
20
  int main (void)
21
21
  {
22
22
  ffi_cif cif;
23
- #ifndef USING_MMAP
24
- static ffi_closure cl;
25
- #endif
26
- ffi_closure *pcl;
23
+ void *code;
24
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
27
25
  ffi_type * cl_arg_types[2];
28
26
  unsigned long long res;
29
27
 
30
- #ifdef USING_MMAP
31
- pcl = allocate_mmap (sizeof(ffi_closure));
32
- #else
33
- pcl = &cl;
34
- #endif
35
-
36
28
  cl_arg_types[0] = &ffi_type_uint64;
37
29
  cl_arg_types[1] = NULL;
38
30
 
39
31
  /* Initialize the cif */
40
32
  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
41
33
  &ffi_type_uint64, cl_arg_types) == FFI_OK);
42
- CHECK(ffi_prep_closure(pcl, &cif, cls_ret_ulonglong_fn, NULL) == FFI_OK);
43
- res = (*((cls_ret_ulonglong)pcl))(214LL);
34
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_ulonglong_fn, NULL, code) == FFI_OK);
35
+ res = (*((cls_ret_ulonglong)code))(214LL);
44
36
  /* { dg-output "214: 214" } */
45
- printf("res: %lld\n", res);
37
+ printf("res: %" PRIdLL "\n", res);
46
38
  /* { dg-output "\nres: 214" } */
47
39
 
48
- res = (*((cls_ret_ulonglong)pcl))(9223372035854775808LL);
40
+ res = (*((cls_ret_ulonglong)code))(9223372035854775808LL);
49
41
  /* { dg-output "\n9223372035854775808: 9223372035854775808" } */
50
- printf("res: %lld\n", res);
42
+ printf("res: %" PRIdLL "\n", res);
51
43
  /* { dg-output "\nres: 9223372035854775808" } */
52
44
 
53
45
  exit(0);
@@ -20,19 +20,11 @@ typedef unsigned short (*cls_ret_ushort)(unsigned short);
20
20
  int main (void)
21
21
  {
22
22
  ffi_cif cif;
23
- #ifndef USING_MMAP
24
- static ffi_closure cl;
25
- #endif
26
- ffi_closure *pcl;
23
+ void *code;
24
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
27
25
  ffi_type * cl_arg_types[2];
28
26
  unsigned short res;
29
27
 
30
- #ifdef USING_MMAP
31
- pcl = allocate_mmap (sizeof(ffi_closure));
32
- #else
33
- pcl = &cl;
34
- #endif
35
-
36
28
  cl_arg_types[0] = &ffi_type_ushort;
37
29
  cl_arg_types[1] = NULL;
38
30
 
@@ -40,9 +32,9 @@ int main (void)
40
32
  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
41
33
  &ffi_type_ushort, cl_arg_types) == FFI_OK);
42
34
 
43
- CHECK(ffi_prep_closure(pcl, &cif, cls_ret_ushort_fn, NULL) == FFI_OK);
35
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_ushort_fn, NULL, code) == FFI_OK);
44
36
 
45
- res = (*((cls_ret_ushort)pcl))(65535);
37
+ res = (*((cls_ret_ushort)code))(65535);
46
38
  /* { dg-output "65535: 65535" } */
47
39
  printf("res: %d\n",res);
48
40
  /* { dg-output "\nres: 65535" } */
@@ -0,0 +1,37 @@
1
+ /* Area: ffi_prep_cif, ffi_prep_closure
2
+ Purpose: Test error return for bad ABIs.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: Blake Chaffin 6/6/2007 */
6
+
7
+ /* { dg-do run { xfail *-*-* } } */
8
+ #include "ffitest.h"
9
+
10
+ static void
11
+ dummy_fn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__,
12
+ void** args __UNUSED__, void* userdata __UNUSED__)
13
+ {}
14
+
15
+ int main (void)
16
+ {
17
+ ffi_cif cif;
18
+ void *code;
19
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
20
+ void* args[1];
21
+ ffi_type* arg_types[1];
22
+
23
+ arg_types[0] = NULL;
24
+ args[0] = NULL;
25
+
26
+ CHECK(ffi_prep_cif(&cif, 255, 0, &ffi_type_void,
27
+ arg_types) == FFI_BAD_ABI);
28
+
29
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &ffi_type_void,
30
+ arg_types) == FFI_OK);
31
+
32
+ cif.abi= 255;
33
+
34
+ CHECK(ffi_prep_closure_loc(pcl, &cif, dummy_fn, NULL, code) == FFI_BAD_ABI);
35
+
36
+ exit(0);
37
+ }
@@ -0,0 +1,25 @@
1
+ /* Area: ffi_prep_cif
2
+ Purpose: Test error return for bad typedefs.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: Blake Chaffin 6/6/2007 */
6
+
7
+ /* { dg-do run { xfail *-*-* } } */
8
+ #include "ffitest.h"
9
+
10
+ int main (void)
11
+ {
12
+ ffi_cif cif;
13
+ ffi_type* arg_types[1];
14
+
15
+ arg_types[0] = NULL;
16
+
17
+ ffi_type badType = ffi_type_void;
18
+
19
+ badType.size = 0;
20
+
21
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &badType,
22
+ arg_types) == FFI_BAD_TYPEDEF);
23
+
24
+ exit(0);
25
+ }
@@ -5,6 +5,14 @@
5
5
  #include <ffi.h>
6
6
  #include "fficonfig.h"
7
7
 
8
+ #if defined HAVE_STDINT_H
9
+ #include <stdint.h>
10
+ #endif
11
+
12
+ #if defined HAVE_INTTYPES_H
13
+ #include <inttypes.h>
14
+ #endif
15
+
8
16
  #define MAX_ARGS 256
9
17
 
10
18
  #define CHECK(x) !(x) ? abort() : 0
@@ -43,6 +51,29 @@
43
51
 
44
52
  #endif
45
53
 
54
+ /* MinGW kludge. */
55
+ #ifdef _WIN64
56
+ #define PRIdLL "I64d"
57
+ #define PRIuLL "I64u"
58
+ #else
59
+ #define PRIdLL "lld"
60
+ #define PRIuLL "llu"
61
+ #endif
62
+
63
+ /* PA HP-UX kludge. */
64
+ #if defined(__hppa__) && defined(__hpux__) && !defined(PRIuPTR)
65
+ #define PRIuPTR "lu"
66
+ #endif
67
+
68
+ /* Solaris < 10 kludge. */
69
+ #if defined(__sun__) && defined(__svr4__) && !defined(PRIuPTR)
70
+ #if defined(__arch64__) || defined (__x86_64__)
71
+ #define PRIuPTR "lu"
72
+ #else
73
+ #define PRIuPTR "u"
74
+ #endif
75
+ #endif
76
+
46
77
  #ifdef USING_MMAP
47
78
  static inline void *
48
79
  allocate_mmap (size_t size)
@@ -4,7 +4,8 @@
4
4
  PR: none.
5
5
  Originator: From the original ffitest.c */
6
6
 
7
- /* { dg-do run } */
7
+ /* { dg-excess-errors "fails" { target x86_64-*-mingw* x86_64-*-cygwin* } } */
8
+ /* { dg-do run { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
8
9
 
9
10
  #include "ffitest.h"
10
11
  #include "float.h"