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