ffi 0.5.4 → 0.6.0

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 (203) hide show
  1. data/LICENSE +1 -27
  2. data/Rakefile +2 -11
  3. data/ext/ffi_c/AbstractMemory.c +6 -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 +23 -8
  7. data/ext/ffi_c/Call.c +28 -0
  8. data/ext/ffi_c/Call.h +5 -1
  9. data/ext/ffi_c/DynamicLibrary.c +0 -1
  10. data/ext/ffi_c/Function.c +19 -2
  11. data/ext/ffi_c/MemoryPointer.c +2 -3
  12. data/ext/ffi_c/Pointer.c +23 -9
  13. data/ext/ffi_c/Struct.c +142 -69
  14. data/ext/ffi_c/Struct.h +16 -7
  15. data/ext/ffi_c/StructLayout.c +92 -55
  16. data/ext/ffi_c/Type.c +5 -22
  17. data/ext/ffi_c/Type.h +1 -1
  18. data/ext/ffi_c/Types.c +8 -2
  19. data/ext/ffi_c/Types.h +2 -0
  20. data/ext/ffi_c/extconf.rb +11 -7
  21. data/ext/ffi_c/libffi/ChangeLog +900 -84
  22. data/ext/ffi_c/libffi/ChangeLog.libffi +311 -0
  23. data/ext/ffi_c/libffi/LICENSE +1 -1
  24. data/ext/ffi_c/libffi/Makefile.am +14 -4
  25. data/ext/ffi_c/libffi/Makefile.in +362 -211
  26. data/ext/ffi_c/libffi/README +70 -92
  27. data/ext/ffi_c/libffi/aclocal.m4 +6068 -4586
  28. data/ext/ffi_c/libffi/config.guess +125 -143
  29. data/ext/ffi_c/libffi/config.sub +103 -27
  30. data/ext/ffi_c/libffi/configure +11364 -18497
  31. data/ext/ffi_c/libffi/configure.ac +43 -4
  32. data/ext/ffi_c/libffi/doc/libffi.info +15 -15
  33. data/ext/ffi_c/libffi/doc/libffi.texi +1 -1
  34. data/ext/ffi_c/libffi/doc/stamp-vti +4 -4
  35. data/ext/ffi_c/libffi/doc/version.texi +4 -4
  36. data/ext/ffi_c/libffi/fficonfig.h.in +24 -3
  37. data/ext/ffi_c/libffi/include/Makefile.am +1 -1
  38. data/ext/ffi_c/libffi/include/Makefile.in +97 -50
  39. data/ext/ffi_c/libffi/include/ffi.h.in +8 -2
  40. data/ext/ffi_c/libffi/include/ffi_common.h +24 -0
  41. data/ext/ffi_c/libffi/libtool-version +1 -1
  42. data/ext/ffi_c/libffi/ltmain.sh +7346 -5870
  43. data/ext/ffi_c/libffi/m4/libtool.m4 +7360 -0
  44. data/ext/ffi_c/libffi/m4/ltoptions.m4 +368 -0
  45. data/ext/ffi_c/libffi/m4/ltsugar.m4 +123 -0
  46. data/ext/ffi_c/libffi/m4/ltversion.m4 +23 -0
  47. data/ext/ffi_c/libffi/m4/lt~obsolete.m4 +92 -0
  48. data/ext/ffi_c/libffi/man/Makefile.in +115 -62
  49. data/ext/ffi_c/libffi/man/ffi_call.3 +3 -3
  50. data/ext/ffi_c/libffi/missing +15 -8
  51. data/ext/ffi_c/libffi/src/arm/sysv.S +15 -8
  52. data/ext/ffi_c/libffi/src/avr32/ffi.c +421 -0
  53. data/ext/ffi_c/libffi/src/avr32/ffitarget.h +50 -0
  54. data/ext/ffi_c/libffi/src/avr32/sysv.S +208 -0
  55. data/ext/ffi_c/libffi/src/closures.c +47 -10
  56. data/ext/ffi_c/libffi/src/frv/ffi.c +1 -1
  57. data/ext/ffi_c/libffi/src/java_raw_api.c +0 -3
  58. data/ext/ffi_c/libffi/src/mips/ffi.c +135 -32
  59. data/ext/ffi_c/libffi/src/mips/ffitarget.h +37 -4
  60. data/ext/ffi_c/libffi/src/mips/n32.S +67 -10
  61. data/ext/ffi_c/libffi/src/mips/o32.S +8 -8
  62. data/ext/ffi_c/libffi/src/pa/ffi.c +7 -0
  63. data/ext/ffi_c/libffi/src/powerpc/aix.S +163 -64
  64. data/ext/ffi_c/libffi/src/powerpc/aix_closure.S +308 -112
  65. data/ext/ffi_c/libffi/src/powerpc/ffi.c +20 -7
  66. data/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +208 -80
  67. data/ext/ffi_c/libffi/src/powerpc/ffitarget.h +11 -3
  68. data/ext/ffi_c/libffi/src/powerpc/sysv.S +12 -23
  69. data/ext/ffi_c/libffi/src/s390/sysv.S +1 -1
  70. data/ext/ffi_c/libffi/src/sh/sysv.S +9 -9
  71. data/ext/ffi_c/libffi/src/sh64/ffi.c +37 -22
  72. data/ext/ffi_c/libffi/src/sh64/sysv.S +23 -14
  73. data/ext/ffi_c/libffi/src/sparc/ffi.c +21 -6
  74. data/ext/ffi_c/libffi/src/sparc/v8.S +55 -14
  75. data/ext/ffi_c/libffi/src/x86/darwin.S +10 -9
  76. data/ext/ffi_c/libffi/src/x86/ffi.c +293 -86
  77. data/ext/ffi_c/libffi/src/x86/ffi64.c +73 -19
  78. data/ext/ffi_c/libffi/src/x86/ffitarget.h +30 -0
  79. data/ext/ffi_c/libffi/src/x86/sysv.S +21 -4
  80. data/ext/ffi_c/libffi/src/x86/unix64.S +8 -4
  81. data/ext/ffi_c/libffi/src/x86/win32.S +633 -147
  82. data/ext/ffi_c/libffi/src/x86/win64.S +460 -0
  83. data/ext/ffi_c/libffi/testsuite/Makefile.am +63 -54
  84. data/ext/ffi_c/libffi/testsuite/Makefile.in +112 -77
  85. data/ext/ffi_c/libffi/testsuite/lib/libffi-dg.exp +12 -1
  86. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +4 -4
  87. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +7 -15
  88. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +7 -15
  89. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +7 -15
  90. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +7 -15
  91. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +7 -15
  92. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +7 -14
  93. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +7 -15
  94. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c +95 -0
  95. data/ext/ffi_c/libffi/testsuite/libffi.call/closure_stdcall.c +6 -14
  96. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +4 -12
  97. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +4 -12
  98. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +4 -12
  99. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +4 -12
  100. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +4 -12
  101. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +4 -12
  102. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +4 -12
  103. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +4 -12
  104. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +4 -12
  105. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +4 -12
  106. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +4 -12
  107. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +4 -12
  108. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +4 -12
  109. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +4 -12
  110. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +4 -12
  111. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +4 -12
  112. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +4 -12
  113. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +4 -12
  114. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +4 -12
  115. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +4 -12
  116. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +4 -12
  117. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +4 -12
  118. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +4 -12
  119. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +4 -12
  120. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +4 -12
  121. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +4 -12
  122. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +4 -12
  123. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +134 -0
  124. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +117 -0
  125. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +11 -17
  126. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +4 -12
  127. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +4 -12
  128. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +7 -15
  129. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +4 -12
  130. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +4 -12
  131. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +7 -15
  132. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +66 -0
  133. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +4 -12
  134. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +57 -0
  135. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +4 -13
  136. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +105 -0
  137. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +57 -0
  138. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +4 -12
  139. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +4 -12
  140. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +4 -12
  141. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +4 -12
  142. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +4 -12
  143. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +4 -12
  144. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +74 -0
  145. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +140 -0
  146. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +4 -12
  147. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +4 -12
  148. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +4 -12
  149. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +4 -12
  150. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +4 -12
  151. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +8 -16
  152. data/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +4 -12
  153. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c +37 -0
  154. data/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +25 -0
  155. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +31 -0
  156. data/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +2 -1
  157. data/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c +342 -0
  158. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +4 -12
  159. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +4 -12
  160. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +4 -12
  161. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +4 -12
  162. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +4 -12
  163. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +4 -12
  164. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +4 -12
  165. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +4 -12
  166. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +4 -12
  167. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +4 -12
  168. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +4 -12
  169. data/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +4 -12
  170. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +1 -1
  171. data/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +1 -1
  172. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +145 -0
  173. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +148 -0
  174. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +124 -0
  175. data/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +124 -0
  176. data/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +70 -0
  177. data/ext/ffi_c/libffi/testsuite/libffi.special/ffitestcxx.h +10 -0
  178. data/ext/ffi_c/libffi/testsuite/libffi.special/special.exp +4 -5
  179. data/ext/ffi_c/libffi/testsuite/libffi.special/unwindtest.cc +17 -16
  180. data/ext/ffi_c/libffi/texinfo.tex +155 -427
  181. data/lib/ffi/autopointer.rb +79 -20
  182. data/lib/ffi/callback.rb +4 -10
  183. data/lib/ffi/enum.rb +28 -0
  184. data/lib/ffi/io.rb +28 -0
  185. data/lib/ffi/library.rb +237 -182
  186. data/lib/ffi/memorypointer.rb +28 -62
  187. data/lib/ffi/platform.rb +27 -0
  188. data/lib/ffi/pointer.rb +28 -0
  189. data/lib/ffi/struct.rb +55 -1
  190. data/lib/ffi/types.rb +29 -0
  191. data/lib/ffi/variadic.rb +29 -0
  192. data/spec/ffi/library_spec.rb +31 -5
  193. data/spec/ffi/rbx/attach_function_spec.rb +2 -1
  194. data/spec/ffi/rbx/memory_pointer_spec.rb +2 -1
  195. data/spec/ffi/spec_helper.rb +5 -1
  196. data/spec/ffi/struct_spec.rb +64 -0
  197. metadata +28 -8
  198. data/ext/ffi_c/libffi/TODO +0 -1
  199. data/ext/ffi_c/libffi/ltcf-c.sh +0 -861
  200. data/ext/ffi_c/libffi/ltcf-cxx.sh +0 -1069
  201. data/ext/ffi_c/libffi/ltcf-gcj.sh +0 -700
  202. data/ext/ffi_c/libffi/ltconfig +0 -2862
  203. data/ext/ffi_c/libffi/mkinstalldirs +0 -158
@@ -43,21 +43,13 @@ cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
43
43
  int main (void)
44
44
  {
45
45
  ffi_cif cif;
46
- #ifndef USING_MMAP
47
- static ffi_closure cl;
48
- #endif
49
- ffi_closure *pcl;
46
+ void *code;
47
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
50
48
  void* args_dbl[5];
51
49
  ffi_type* cls_struct_fields[4];
52
50
  ffi_type cls_struct_type;
53
51
  ffi_type* dbl_arg_types[5];
54
52
 
55
- #ifdef USING_MMAP
56
- pcl = allocate_mmap (sizeof(ffi_closure));
57
- #else
58
- pcl = &cl;
59
- #endif
60
-
61
53
  cls_struct_type.size = 0;
62
54
  cls_struct_type.alignment = 0;
63
55
  cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -88,9 +80,9 @@ int main (void)
88
80
  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
89
81
  /* { dg-output "\nres: 13 14271 140" } */
90
82
 
91
- CHECK(ffi_prep_closure(pcl, &cif, cls_struct_align_gn, NULL) == FFI_OK);
83
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
92
84
 
93
- res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(pcl))(g_dbl, f_dbl);
85
+ res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
94
86
  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
95
87
  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
96
88
  /* { dg-output "\nres: 13 14271 140" } */
@@ -22,7 +22,7 @@ cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
22
22
  result.b = a1.b + a2.b;
23
23
  result.c = a1.c + a2.c;
24
24
 
25
- printf("%d %lld %d %d %lld %d: %d %lld %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
25
+ printf("%d %" PRIdLL " %d %d %" PRIdLL " %d: %d %" PRIdLL " %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
26
26
 
27
27
  return result;
28
28
  }
@@ -43,21 +43,13 @@ cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
43
43
  int main (void)
44
44
  {
45
45
  ffi_cif cif;
46
- #ifndef USING_MMAP
47
- static ffi_closure cl;
48
- #endif
49
- ffi_closure *pcl;
46
+ void *code;
47
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
50
48
  void* args_dbl[5];
51
49
  ffi_type* cls_struct_fields[4];
52
50
  ffi_type cls_struct_type;
53
51
  ffi_type* dbl_arg_types[5];
54
52
 
55
- #ifdef USING_MMAP
56
- pcl = allocate_mmap (sizeof(ffi_closure));
57
- #else
58
- pcl = &cl;
59
- #endif
60
-
61
53
  cls_struct_type.size = 0;
62
54
  cls_struct_type.alignment = 0;
63
55
  cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -85,14 +77,14 @@ int main (void)
85
77
 
86
78
  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
87
79
  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
88
- printf("res: %d %lld %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
80
+ printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
89
81
  /* { dg-output "\nres: 13 14271 140" } */
90
82
 
91
- CHECK(ffi_prep_closure(pcl, &cif, cls_struct_align_gn, NULL) == FFI_OK);
83
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
92
84
 
93
- res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(pcl))(g_dbl, f_dbl);
85
+ res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
94
86
  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
95
- printf("res: %d %lld %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
87
+ printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
96
88
  /* { dg-output "\nres: 13 14271 140" } */
97
89
 
98
90
  exit(0);
@@ -43,21 +43,13 @@ cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
43
43
  int main (void)
44
44
  {
45
45
  ffi_cif cif;
46
- #ifndef USING_MMAP
47
- static ffi_closure cl;
48
- #endif
49
- ffi_closure *pcl;
46
+ void *code;
47
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
50
48
  void* args_dbl[5];
51
49
  ffi_type* cls_struct_fields[4];
52
50
  ffi_type cls_struct_type;
53
51
  ffi_type* dbl_arg_types[5];
54
52
 
55
- #ifdef USING_MMAP
56
- pcl = allocate_mmap (sizeof(ffi_closure));
57
- #else
58
- pcl = &cl;
59
- #endif
60
-
61
53
  cls_struct_type.size = 0;
62
54
  cls_struct_type.alignment = 0;
63
55
  cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -88,9 +80,9 @@ int main (void)
88
80
  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
89
81
  /* { dg-output "\nres: 13 14271 140" } */
90
82
 
91
- CHECK(ffi_prep_closure(pcl, &cif, cls_struct_align_gn, NULL) == FFI_OK);
83
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
92
84
 
93
- res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(pcl))(g_dbl, f_dbl);
85
+ res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
94
86
  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
95
87
  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
96
88
  /* { dg-output "\nres: 13 14271 140" } */
@@ -43,21 +43,13 @@ cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
43
43
  int main (void)
44
44
  {
45
45
  ffi_cif cif;
46
- #ifndef USING_MMAP
47
- static ffi_closure cl;
48
- #endif
49
- ffi_closure *pcl;
46
+ void *code;
47
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
50
48
  void* args_dbl[5];
51
49
  ffi_type* cls_struct_fields[4];
52
50
  ffi_type cls_struct_type;
53
51
  ffi_type* dbl_arg_types[5];
54
52
 
55
- #ifdef USING_MMAP
56
- pcl = allocate_mmap (sizeof(ffi_closure));
57
- #else
58
- pcl = &cl;
59
- #endif
60
-
61
53
  cls_struct_type.size = 0;
62
54
  cls_struct_type.alignment = 0;
63
55
  cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -88,9 +80,9 @@ int main (void)
88
80
  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
89
81
  /* { dg-output "\nres: 13 14271 140" } */
90
82
 
91
- CHECK(ffi_prep_closure(pcl, &cif, cls_struct_align_gn, NULL) == FFI_OK);
83
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
92
84
 
93
- res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(pcl))(g_dbl, f_dbl);
85
+ res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
94
86
  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
95
87
  printf("res: %d %d %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
96
88
  /* { dg-output "\nres: 13 14271 140" } */
@@ -23,7 +23,7 @@ cls_struct_align cls_struct_align_fn(struct cls_struct_align a1,
23
23
  result.b = a1.b + a2.b;
24
24
  result.c = a1.c + a2.c;
25
25
 
26
- printf("%d %lld %d %d %lld %d: %d %lld %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
26
+ printf("%d %" PRIdLL " %d %d %" PRIdLL " %d: %d %" PRIdLL " %d\n", a1.a, a1.b, a1.c, a2.a, a2.b, a2.c, result.a, result.b, result.c);
27
27
 
28
28
  return result;
29
29
  }
@@ -44,21 +44,13 @@ cls_struct_align_gn(ffi_cif* cif __UNUSED__, void* resp, void** args,
44
44
  int main (void)
45
45
  {
46
46
  ffi_cif cif;
47
- #ifndef USING_MMAP
48
- static ffi_closure cl;
49
- #endif
50
- ffi_closure *pcl;
47
+ void *code;
48
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
51
49
  void* args_dbl[5];
52
50
  ffi_type* cls_struct_fields[4];
53
51
  ffi_type cls_struct_type;
54
52
  ffi_type* dbl_arg_types[5];
55
53
 
56
- #ifdef USING_MMAP
57
- pcl = allocate_mmap (sizeof(ffi_closure));
58
- #else
59
- pcl = &cl;
60
- #endif
61
-
62
54
  cls_struct_type.size = 0;
63
55
  cls_struct_type.alignment = 0;
64
56
  cls_struct_type.type = FFI_TYPE_STRUCT;
@@ -86,14 +78,14 @@ int main (void)
86
78
 
87
79
  ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_dbl, args_dbl);
88
80
  /* { dg-output "12 4951 127 1 9320 13: 13 14271 140" } */
89
- printf("res: %d %lld %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
81
+ printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
90
82
  /* { dg-output "\nres: 13 14271 140" } */
91
83
 
92
- CHECK(ffi_prep_closure(pcl, &cif, cls_struct_align_gn, NULL) == FFI_OK);
84
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK);
93
85
 
94
- res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(pcl))(g_dbl, f_dbl);
86
+ res_dbl = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_dbl, f_dbl);
95
87
  /* { dg-output "\n12 4951 127 1 9320 13: 13 14271 140" } */
96
- printf("res: %d %lld %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
88
+ printf("res: %d %" PRIdLL " %d\n", res_dbl.a, res_dbl.b, res_dbl.c);
97
89
  /* { dg-output "\nres: 13 14271 140" } */
98
90
 
99
91
  exit(0);
@@ -0,0 +1,66 @@
1
+ /* Area: ffi_call, closure_call
2
+ Purpose: Check double arguments in structs.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: Blake Chaffin 6/23/2007 */
6
+
7
+ /* { dg-do run } */
8
+
9
+ #include "ffitest.h"
10
+
11
+ typedef struct Dbls {
12
+ double x;
13
+ double y;
14
+ } Dbls;
15
+
16
+ void
17
+ closure_test_fn(Dbls p)
18
+ {
19
+ printf("%.1f %.1f\n", p.x, p.y);
20
+ }
21
+
22
+ void
23
+ closure_test_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__,
24
+ void** args, void* userdata __UNUSED__)
25
+ {
26
+ closure_test_fn(*(Dbls*)args[0]);
27
+ }
28
+
29
+ int main(int argc __UNUSED__, char** argv __UNUSED__)
30
+ {
31
+ ffi_cif cif;
32
+
33
+ void *code;
34
+ ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
35
+ ffi_type* cl_arg_types[1];
36
+
37
+ ffi_type ts1_type;
38
+ ffi_type* ts1_type_elements[4];
39
+
40
+ ts1_type.size = 0;
41
+ ts1_type.alignment = 0;
42
+ ts1_type.type = FFI_TYPE_STRUCT;
43
+ ts1_type.elements = ts1_type_elements;
44
+
45
+ ts1_type_elements[0] = &ffi_type_double;
46
+ ts1_type_elements[1] = &ffi_type_double;
47
+ ts1_type_elements[2] = NULL;
48
+
49
+ cl_arg_types[0] = &ts1_type;
50
+
51
+ Dbls arg = { 1.0, 2.0 };
52
+
53
+ /* Initialize the cif */
54
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
55
+ &ffi_type_void, cl_arg_types) == FFI_OK);
56
+
57
+ CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test_gn, NULL, code) == FFI_OK);
58
+
59
+ ((void*(*)(Dbls))(code))(arg);
60
+ /* { dg-output "1.0 2.0\n" } */
61
+
62
+ closure_test_fn(arg);
63
+ /* { dg-output "1.0 2.0\n" } */
64
+
65
+ return 0;
66
+ }
@@ -20,19 +20,11 @@ typedef double (*cls_ret_double)(double);
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
  double 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_double;
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_double, cl_arg_types) == FFI_OK);
42
34
 
43
- CHECK(ffi_prep_closure(pcl, &cif, cls_ret_double_fn, NULL) == FFI_OK);
35
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_double_fn, NULL, code) == FFI_OK);
44
36
 
45
- res = (*((cls_ret_double)pcl))(21474.789);
37
+ res = (*((cls_ret_double)code))(21474.789);
46
38
  /* { dg-output "21474.789000: 21474.789000" } */
47
39
  printf("res: %.6f\n", res);
48
40
  /* { dg-output "\nres: 21474.789000" } */
@@ -0,0 +1,57 @@
1
+ /* Area: ffi_call, closure_call
2
+ Purpose: Test doubles passed in variable argument lists.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: Blake Chaffin 6/6/2007 */
6
+
7
+ /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
8
+ /* { dg-output "" { xfail avr32*-*-* } } */
9
+ #include "ffitest.h"
10
+
11
+ static void
12
+ cls_double_va_fn(ffi_cif* cif __UNUSED__, void* resp,
13
+ void** args, void* userdata __UNUSED__)
14
+ {
15
+ char* format = *(char**)args[0];
16
+ double doubleValue = *(double*)args[1];
17
+
18
+ *(ffi_arg*)resp = printf(format, doubleValue);
19
+ }
20
+
21
+ int main (void)
22
+ {
23
+ ffi_cif cif;
24
+ void *code;
25
+ ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
26
+ void* args[3];
27
+ ffi_type* arg_types[3];
28
+
29
+ char* format = "%.1f\n";
30
+ double doubleArg = 7;
31
+ ffi_arg res = 0;
32
+
33
+ arg_types[0] = &ffi_type_pointer;
34
+ arg_types[1] = &ffi_type_double;
35
+ arg_types[2] = NULL;
36
+
37
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint,
38
+ arg_types) == FFI_OK);
39
+
40
+ args[0] = &format;
41
+ args[1] = &doubleArg;
42
+ args[2] = NULL;
43
+
44
+ ffi_call(&cif, FFI_FN(printf), &res, args);
45
+ // { dg-output "7.0" }
46
+ printf("res: %d\n", (int) res);
47
+ // { dg-output "\nres: 4" }
48
+
49
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_double_va_fn, NULL, code) == FFI_OK);
50
+
51
+ res = ((int(*)(char*, double))(code))(format, doubleArg);
52
+ // { dg-output "\n7.0" }
53
+ printf("res: %d\n", (int) res);
54
+ // { dg-output "\nres: 4" }
55
+
56
+ exit(0);
57
+ }
@@ -21,20 +21,11 @@ typedef float (*cls_ret_float)(float);
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
  float res;
30
28
 
31
- #ifdef USING_MMAP
32
- pcl = allocate_mmap (sizeof(ffi_closure));
33
- #else
34
- pcl = &cl;
35
- #endif
36
-
37
-
38
29
  cl_arg_types[0] = &ffi_type_float;
39
30
  cl_arg_types[1] = NULL;
40
31
 
@@ -42,8 +33,8 @@ int main (void)
42
33
  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
43
34
  &ffi_type_float, cl_arg_types) == FFI_OK);
44
35
 
45
- CHECK(ffi_prep_closure(pcl, &cif, cls_ret_float_fn, NULL) == FFI_OK);
46
- res = ((((cls_ret_float)pcl)(-2122.12)));
36
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_float_fn, NULL, code) == FFI_OK);
37
+ res = ((((cls_ret_float)code)(-2122.12)));
47
38
  /* { dg-output "\\-2122.12: \\-2122.12" } */
48
39
  printf("res: %.6f\n", res);
49
40
  /* { dg-output "\nres: \-2122.120117" } */
@@ -0,0 +1,105 @@
1
+ /* Area: ffi_call, closure_call
2
+ Purpose: Check long double arguments.
3
+ Limitations: none.
4
+ PR: none.
5
+ Originator: Blake Chaffin */
6
+
7
+ /* { dg-excess-errors "no long double format" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
8
+ /* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */
9
+ /* { dg-options -mlong-double-128 { target powerpc64*-*-* } } */
10
+ /* { dg-output "" { xfail x86_64-*-mingw* x86_64-*-cygwin* } } */
11
+
12
+ #include "ffitest.h"
13
+
14
+ long double cls_ldouble_fn(
15
+ long double a1,
16
+ long double a2,
17
+ long double a3,
18
+ long double a4,
19
+ long double a5,
20
+ long double a6,
21
+ long double a7,
22
+ long double a8)
23
+ {
24
+ long double r = a1 + a2 + a3 + a4 + a5 + a6 + a7 + a8;
25
+
26
+ printf("%Lg %Lg %Lg %Lg %Lg %Lg %Lg %Lg: %Lg\n",
27
+ a1, a2, a3, a4, a5, a6, a7, a8, r);
28
+
29
+ return r;
30
+ }
31
+
32
+ static void
33
+ cls_ldouble_gn(ffi_cif* cif __UNUSED__, void* resp,
34
+ void** args, void* userdata __UNUSED__)
35
+ {
36
+ long double a1 = *(long double*)args[0];
37
+ long double a2 = *(long double*)args[1];
38
+ long double a3 = *(long double*)args[2];
39
+ long double a4 = *(long double*)args[3];
40
+ long double a5 = *(long double*)args[4];
41
+ long double a6 = *(long double*)args[5];
42
+ long double a7 = *(long double*)args[6];
43
+ long double a8 = *(long double*)args[7];
44
+
45
+ *(long double*)resp = cls_ldouble_fn(
46
+ a1, a2, a3, a4, a5, a6, a7, a8);
47
+ }
48
+
49
+ int main(void)
50
+ {
51
+ ffi_cif cif;
52
+ void* code;
53
+ ffi_closure* pcl = ffi_closure_alloc(sizeof(ffi_closure), &code);
54
+ void* args[9];
55
+ ffi_type* arg_types[9];
56
+ long double res = 0;
57
+
58
+ long double arg1 = 1;
59
+ long double arg2 = 2;
60
+ long double arg3 = 3;
61
+ long double arg4 = 4;
62
+ long double arg5 = 5;
63
+ long double arg6 = 6;
64
+ long double arg7 = 7;
65
+ long double arg8 = 8;
66
+
67
+ arg_types[0] = &ffi_type_longdouble;
68
+ arg_types[1] = &ffi_type_longdouble;
69
+ arg_types[2] = &ffi_type_longdouble;
70
+ arg_types[3] = &ffi_type_longdouble;
71
+ arg_types[4] = &ffi_type_longdouble;
72
+ arg_types[5] = &ffi_type_longdouble;
73
+ arg_types[6] = &ffi_type_longdouble;
74
+ arg_types[7] = &ffi_type_longdouble;
75
+ arg_types[8] = NULL;
76
+
77
+ CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 8, &ffi_type_longdouble,
78
+ arg_types) == FFI_OK);
79
+
80
+ args[0] = &arg1;
81
+ args[1] = &arg2;
82
+ args[2] = &arg3;
83
+ args[3] = &arg4;
84
+ args[4] = &arg5;
85
+ args[5] = &arg6;
86
+ args[6] = &arg7;
87
+ args[7] = &arg8;
88
+ args[8] = NULL;
89
+
90
+ ffi_call(&cif, FFI_FN(cls_ldouble_fn), &res, args);
91
+ /* { dg-output "1 2 3 4 5 6 7 8: 36" } */
92
+ printf("res: %Lg\n", res);
93
+ /* { dg-output "\nres: 36" } */
94
+
95
+ CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ldouble_gn, NULL, code) == FFI_OK);
96
+
97
+ res = ((long double(*)(long double, long double, long double, long double,
98
+ long double, long double, long double, long double))(code))(arg1, arg2,
99
+ arg3, arg4, arg5, arg6, arg7, arg8);
100
+ /* { dg-output "\n1 2 3 4 5 6 7 8: 36" } */
101
+ printf("res: %Lg\n", res);
102
+ /* { dg-output "\nres: 36" } */
103
+
104
+ return 0;
105
+ }