diff options
author | Matthias Klose <doko@ubuntu.com> | 2010-03-15 13:25:28 (GMT) |
---|---|---|
committer | Matthias Klose <doko@ubuntu.com> | 2010-03-15 13:25:28 (GMT) |
commit | a8349756faf0979b9f2b3417624aa00979732079 (patch) | |
tree | a7fa826a4eafe0a51e801bf5db3e6eba0033ac96 /Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble_va.c | |
parent | 4e0f8910bf4894727778b183b05e0c7306bb1ede (diff) | |
download | cpython-a8349756faf0979b9f2b3417624aa00979732079.zip cpython-a8349756faf0979b9f2b3417624aa00979732079.tar.gz cpython-a8349756faf0979b9f2b3417624aa00979732079.tar.bz2 |
Merged revisions 78968-78969 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r78968 | matthias.klose | 2010-03-15 01:02:36 +0100 (Mon, 15 Mar 2010) | 226 lines
- Issue #8142: Update libffi to the 3.0.9 release.
........
r78969 | matthias.klose | 2010-03-15 01:36:18 +0100 (Mon, 15 Mar 2010) | 7 lines
Backport from the libffi trunk:
2010-02-15 Matthias Klose <doko@ubuntu.com>
* src/arm/sysv.S (__ARM_ARCH__): Define for processor
__ARM_ARCH_7EM__.
........
Diffstat (limited to 'Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble_va.c')
-rw-r--r-- | Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble_va.c | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble_va.c b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble_va.c new file mode 100644 index 0000000..38564cb --- /dev/null +++ b/Modules/_ctypes/libffi/testsuite/libffi.call/cls_longdouble_va.c @@ -0,0 +1,57 @@ +/* Area: ffi_call, closure_call + Purpose: Test long doubles passed in variable argument lists. + Limitations: none. + PR: none. + Originator: Blake Chaffin 6/6/2007 */ + +/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ +/* { dg-output "" { xfail avr32*-*-* x86_64-*-mingw* } } */ +#include "ffitest.h" + +static void +cls_longdouble_va_fn(ffi_cif* cif __UNUSED__, void* resp, + void** args, void* userdata __UNUSED__) +{ + char* format = *(char**)args[0]; + long double ldValue = *(long double*)args[1]; + + *(ffi_arg*)resp = printf(format, ldValue); +} + +int main (void) +{ + ffi_cif cif; + void *code; + ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); + void* args[3]; + ffi_type* arg_types[3]; + + char* format = "%.1Lf\n"; + long double ldArg = 7; + ffi_arg res = 0; + + arg_types[0] = &ffi_type_pointer; + arg_types[1] = &ffi_type_longdouble; + arg_types[2] = NULL; + + CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &ffi_type_sint, + arg_types) == FFI_OK); + + args[0] = &format; + args[1] = &ldArg; + args[2] = NULL; + + ffi_call(&cif, FFI_FN(printf), &res, args); + // { dg-output "7.0" } + printf("res: %d\n", (int) res); + // { dg-output "\nres: 4" } + + CHECK(ffi_prep_closure_loc(pcl, &cif, cls_longdouble_va_fn, NULL, code) == FFI_OK); + + res = ((int(*)(char*, long double))(code))(format, ldArg); + // { dg-output "\n7.0" } + printf("res: %d\n", (int) res); + // { dg-output "\nres: 4" } + + exit(0); +} |