ยปCore Development>Code coverage>Modules/_ctypes/libffi/testsuite/libffi.call/cls_struct_va1.c

Python code coverage for Modules/_ctypes/libffi/testsuite/libffi.call/cls_struct_va1.c

#countcontent
1n/a/* Area: ffi_call, closure_call
2n/a Purpose: Test doubles passed in variable argument lists.
3n/a Limitations: none.
4n/a PR: none.
5n/a Originator: Blake Chaffin 6/6/2007 */
6n/a
7n/a/* { dg-do run } */
8n/a/* { dg-output "" { xfail avr32*-*-* } } */
9n/a#include "ffitest.h"
10n/a
11n/astruct small_tag
12n/a{
13n/a unsigned char a;
14n/a unsigned char b;
15n/a};
16n/a
17n/astruct large_tag
18n/a{
19n/a unsigned a;
20n/a unsigned b;
21n/a unsigned c;
22n/a unsigned d;
23n/a unsigned e;
24n/a};
25n/a
26n/astatic void
27n/atest_fn (ffi_cif* cif __UNUSED__, void* resp,
28n/a void** args, void* userdata __UNUSED__)
29n/a{
30n/a int n = *(int*)args[0];
31n/a struct small_tag s1 = * (struct small_tag *) args[1];
32n/a struct large_tag l1 = * (struct large_tag *) args[2];
33n/a struct small_tag s2 = * (struct small_tag *) args[3];
34n/a
35n/a printf ("%d %d %d %d %d %d %d %d %d %d\n", n, s1.a, s1.b,
36n/a l1.a, l1.b, l1.c, l1.d, l1.e,
37n/a s2.a, s2.b);
38n/a * (ffi_arg*) resp = 42;
39n/a}
40n/a
41n/aint
42n/amain (void)
43n/a{
44n/a ffi_cif cif;
45n/a void *code;
46n/a ffi_closure *pcl = ffi_closure_alloc (sizeof (ffi_closure), &code);
47n/a ffi_type* arg_types[5];
48n/a
49n/a ffi_arg res = 0;
50n/a
51n/a ffi_type s_type;
52n/a ffi_type *s_type_elements[3];
53n/a
54n/a ffi_type l_type;
55n/a ffi_type *l_type_elements[6];
56n/a
57n/a struct small_tag s1;
58n/a struct small_tag s2;
59n/a struct large_tag l1;
60n/a
61n/a int si;
62n/a
63n/a s_type.size = 0;
64n/a s_type.alignment = 0;
65n/a s_type.type = FFI_TYPE_STRUCT;
66n/a s_type.elements = s_type_elements;
67n/a
68n/a s_type_elements[0] = &ffi_type_uchar;
69n/a s_type_elements[1] = &ffi_type_uchar;
70n/a s_type_elements[2] = NULL;
71n/a
72n/a l_type.size = 0;
73n/a l_type.alignment = 0;
74n/a l_type.type = FFI_TYPE_STRUCT;
75n/a l_type.elements = l_type_elements;
76n/a
77n/a l_type_elements[0] = &ffi_type_uint;
78n/a l_type_elements[1] = &ffi_type_uint;
79n/a l_type_elements[2] = &ffi_type_uint;
80n/a l_type_elements[3] = &ffi_type_uint;
81n/a l_type_elements[4] = &ffi_type_uint;
82n/a l_type_elements[5] = NULL;
83n/a
84n/a arg_types[0] = &ffi_type_sint;
85n/a arg_types[1] = &s_type;
86n/a arg_types[2] = &l_type;
87n/a arg_types[3] = &s_type;
88n/a arg_types[4] = NULL;
89n/a
90n/a CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &ffi_type_sint,
91n/a arg_types) == FFI_OK);
92n/a
93n/a si = 4;
94n/a s1.a = 5;
95n/a s1.b = 6;
96n/a
97n/a s2.a = 20;
98n/a s2.b = 21;
99n/a
100n/a l1.a = 10;
101n/a l1.b = 11;
102n/a l1.c = 12;
103n/a l1.d = 13;
104n/a l1.e = 14;
105n/a
106n/a CHECK(ffi_prep_closure_loc(pcl, &cif, test_fn, NULL, code) == FFI_OK);
107n/a
108n/a res = ((int (*)(int, ...))(code))(si, s1, l1, s2);
109n/a /* { dg-output "4 5 6 10 11 12 13 14 20 21" } */
110n/a printf("res: %d\n", (int) res);
111n/a /* { dg-output "\nres: 42" } */
112n/a
113n/a exit(0);
114n/a}