• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /macosx-10.9.5/pyobjc-42/2.5/pyobjc/pyobjc-core/libffi-src/tests/testsuite/libffi.call/
1/* Area:	ffi_call
2   Purpose:	Check structures.
3   Limitations:	none.
4   PR:		none.
5   Originator:	From the original ffitest.c  */
6
7/* { dg-do run } */
8#include "ffitest.h"
9
10typedef struct
11{
12  unsigned char uc;
13  double d;
14  unsigned int ui;
15} test_structure_1;
16
17static test_structure_1 struct1(test_structure_1 ts)
18{
19  /*@-type@*/
20  ts.uc++;
21  /*@=type@*/
22  ts.d--;
23  ts.ui++;
24
25  return ts;
26}
27
28int main (void)
29{
30  ffi_cif cif;
31  ffi_type *args[MAX_ARGS];
32  void *values[MAX_ARGS];
33  ffi_type ts1_type;
34  ffi_type *ts1_type_elements[4];
35  ts1_type.size = 0;
36  ts1_type.alignment = 0;
37  ts1_type.type = FFI_TYPE_STRUCT;
38  ts1_type.elements = ts1_type_elements;
39  ts1_type_elements[0] = &ffi_type_uchar;
40  ts1_type_elements[1] = &ffi_type_double;
41  ts1_type_elements[2] = &ffi_type_uint;
42  ts1_type_elements[3] = NULL;
43
44  test_structure_1 ts1_arg;
45  /* This is a hack to get a properly aligned result buffer */
46  test_structure_1 *ts1_result =
47    (test_structure_1 *) malloc (sizeof(test_structure_1));
48
49  args[0] = &ts1_type;
50  values[0] = &ts1_arg;
51
52  /* Initialize the cif */
53  CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1,
54		     &ts1_type, args) == FFI_OK);
55
56  ts1_arg.uc = '\x01';
57  ts1_arg.d = 3.14159;
58  ts1_arg.ui = 555;
59
60  ffi_call(&cif, FFI_FN(struct1), ts1_result, values);
61
62  CHECK(ts1_result->ui == 556);
63  CHECK(ts1_result->d == 3.14159 - 1);
64
65  free (ts1_result);
66  exit(0);
67}
68