ยปCore Development>Code coverage>Modules/_ctypes/libffi/testsuite/libffi.call/pyobjc-tc.c

Python code coverage for Modules/_ctypes/libffi/testsuite/libffi.call/pyobjc-tc.c

#countcontent
1n/a/* Area: ffi_call
2n/a Purpose: Check different structures.
3n/a Limitations: none.
4n/a PR: none.
5n/a Originator: Ronald Oussoren <oussoren@cistron.nl> 20030824 */
6n/a
7n/a/* { dg-do run } */
8n/a#include "ffitest.h"
9n/a
10n/atypedef struct Point {
11n/a float x;
12n/a float y;
13n/a} Point;
14n/a
15n/atypedef struct Size {
16n/a float h;
17n/a float w;
18n/a} Size;
19n/a
20n/atypedef struct Rect {
21n/a Point o;
22n/a Size s;
23n/a} Rect;
24n/a
25n/aint doit(int o, char* s, Point p, Rect r, int last)
26n/a{
27n/a printf("CALLED WITH %d %s {%f %f} {{%f %f} {%f %f}} %d\n",
28n/a o, s, p.x, p.y, r.o.x, r.o.y, r.s.h, r.s.w, last);
29n/a return 42;
30n/a}
31n/a
32n/a
33n/aint main(void)
34n/a{
35n/a ffi_type point_type;
36n/a ffi_type size_type;
37n/a ffi_type rect_type;
38n/a ffi_cif cif;
39n/a ffi_type* arglist[6];
40n/a void* values[6];
41n/a int r;
42n/a
43n/a /*
44n/a * First set up FFI types for the 3 struct types
45n/a */
46n/a
47n/a point_type.size = 0; /*sizeof(Point);*/
48n/a point_type.alignment = 0; /*__alignof__(Point);*/
49n/a point_type.type = FFI_TYPE_STRUCT;
50n/a point_type.elements = malloc(3 * sizeof(ffi_type*));
51n/a point_type.elements[0] = &ffi_type_float;
52n/a point_type.elements[1] = &ffi_type_float;
53n/a point_type.elements[2] = NULL;
54n/a
55n/a size_type.size = 0;/* sizeof(Size);*/
56n/a size_type.alignment = 0;/* __alignof__(Size);*/
57n/a size_type.type = FFI_TYPE_STRUCT;
58n/a size_type.elements = malloc(3 * sizeof(ffi_type*));
59n/a size_type.elements[0] = &ffi_type_float;
60n/a size_type.elements[1] = &ffi_type_float;
61n/a size_type.elements[2] = NULL;
62n/a
63n/a rect_type.size = 0;/*sizeof(Rect);*/
64n/a rect_type.alignment =0;/* __alignof__(Rect);*/
65n/a rect_type.type = FFI_TYPE_STRUCT;
66n/a rect_type.elements = malloc(3 * sizeof(ffi_type*));
67n/a rect_type.elements[0] = &point_type;
68n/a rect_type.elements[1] = &size_type;
69n/a rect_type.elements[2] = NULL;
70n/a
71n/a /*
72n/a * Create a CIF
73n/a */
74n/a arglist[0] = &ffi_type_sint;
75n/a arglist[1] = &ffi_type_pointer;
76n/a arglist[2] = &point_type;
77n/a arglist[3] = &rect_type;
78n/a arglist[4] = &ffi_type_sint;
79n/a arglist[5] = NULL;
80n/a
81n/a r = ffi_prep_cif(&cif, FFI_DEFAULT_ABI,
82n/a 5, &ffi_type_sint, arglist);
83n/a if (r != FFI_OK) {
84n/a abort();
85n/a }
86n/a
87n/a
88n/a /* And call the function through the CIF */
89n/a
90n/a {
91n/a Point p = { 1.0, 2.0 };
92n/a Rect r = { { 9.0, 10.0}, { -1.0, -2.0 } };
93n/a int o = 0;
94n/a int l = 42;
95n/a char* m = "myMethod";
96n/a ffi_arg result;
97n/a
98n/a values[0] = &o;
99n/a values[1] = &m;
100n/a values[2] = &p;
101n/a values[3] = &r;
102n/a values[4] = &l;
103n/a values[5] = NULL;
104n/a
105n/a printf("CALLING WITH %d %s {%f %f} {{%f %f} {%f %f}} %d\n",
106n/a o, m, p.x, p.y, r.o.x, r.o.y, r.s.h, r.s.w, l);
107n/a
108n/a ffi_call(&cif, FFI_FN(doit), &result, values);
109n/a
110n/a printf ("The result is %d\n", (int)result);
111n/a
112n/a }
113n/a exit(0);
114n/a}