123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- /* Area: ffi_call
- Purpose: Reproduce bug found in python ctypes
- Limitations: none.
- PR: Fedora 1174037 */
- /* { dg-do run } */
- #include "ffitest.h"
- typedef struct {
- long x;
- long y;
- } POINT;
- typedef struct {
- long left;
- long top;
- long right;
- long bottom;
- } RECT;
- static RECT ABI_ATTR pr_test(int i __UNUSED__, RECT ar __UNUSED__,
- RECT* br __UNUSED__, POINT cp __UNUSED__,
- RECT dr __UNUSED__, RECT *er __UNUSED__,
- POINT fp, RECT gr __UNUSED__)
- {
- RECT result;
- result.left = fp.x;
- result.right = fp.y;
- result.top = fp.x;
- result.bottom = fp.y;
- return result;
- }
- int main (void)
- {
- ffi_cif cif;
- ffi_type *args[MAX_ARGS];
- void *values[MAX_ARGS];
- ffi_type point_type, rect_type;
- ffi_type *point_type_elements[3];
- ffi_type *rect_type_elements[5];
-
- int i;
- POINT cp, fp;
- RECT ar, br, dr, er, gr;
- RECT *p1, *p2;
- /* This is a hack to get a properly aligned result buffer */
- RECT *rect_result =
- (RECT *) malloc (sizeof(RECT));
- point_type.size = 0;
- point_type.alignment = 0;
- point_type.type = FFI_TYPE_STRUCT;
- point_type.elements = point_type_elements;
- point_type_elements[0] = &ffi_type_slong;
- point_type_elements[1] = &ffi_type_slong;
- point_type_elements[2] = NULL;
- rect_type.size = 0;
- rect_type.alignment = 0;
- rect_type.type = FFI_TYPE_STRUCT;
- rect_type.elements = rect_type_elements;
- rect_type_elements[0] = &ffi_type_slong;
- rect_type_elements[1] = &ffi_type_slong;
- rect_type_elements[2] = &ffi_type_slong;
- rect_type_elements[3] = &ffi_type_slong;
- rect_type_elements[4] = NULL;
- args[0] = &ffi_type_sint;
- args[1] = &rect_type;
- args[2] = &ffi_type_pointer;
- args[3] = &point_type;
- args[4] = &rect_type;
- args[5] = &ffi_type_pointer;
- args[6] = &point_type;
- args[7] = &rect_type;
-
- /* Initialize the cif */
- CHECK(ffi_prep_cif(&cif, ABI_NUM, 8, &rect_type, args) == FFI_OK);
- i = 1;
- ar.left = 2;
- ar.right = 3;
- ar.top = 4;
- ar.bottom = 5;
- br.left = 6;
- br.right = 7;
- br.top = 8;
- br.bottom = 9;
- cp.x = 10;
- cp.y = 11;
- dr.left = 12;
- dr.right = 13;
- dr.top = 14;
- dr.bottom = 15;
- er.left = 16;
- er.right = 17;
- er.top = 18;
- er.bottom = 19;
- fp.x = 20;
- fp.y = 21;
- gr.left = 22;
- gr.right = 23;
- gr.top = 24;
- gr.bottom = 25;
-
- values[0] = &i;
- values[1] = &ar;
- p1 = &br;
- values[2] = &p1;
- values[3] = &cp;
- values[4] = &dr;
- p2 = &er;
- values[5] = &p2;
- values[6] = &fp;
- values[7] = &gr;
- ffi_call (&cif, FFI_FN(pr_test), rect_result, values);
-
- CHECK(rect_result->top == 20);
-
- free (rect_result);
- exit(0);
- }
|