]> gitweb.factorcode.org Git - factor.git/blob - vm/ffi_test.c
Fix ffi-test library to work with Windows SDK. Turns out MINGW has a different ABI...
[factor.git] / vm / ffi_test.c
1 /* This file is linked into the runtime for the sole purpose
2  * of testing FFI code. */
3 #include "ffi_test.h"
4
5 #include <assert.h>
6 #include <string.h>
7
8 void ffi_test_0(void)
9 {
10 }
11
12 int ffi_test_1(void)
13 {
14         return 3;
15 }
16
17 int ffi_test_2(int x, int y)
18 {
19         return x + y;
20 }
21
22 int ffi_test_3(int x, int y, int z, int t)
23 {
24         return x + y + z * t;
25 }
26
27 float ffi_test_4(void)
28 {
29         return 1.5;
30 }
31
32 double ffi_test_5(void)
33 {
34         return 1.5;
35 }
36
37 double ffi_test_6(float x, float y)
38 {
39         return x * y;
40 }
41
42 double ffi_test_7(double x, double y)
43 {
44         return x * y;
45 }
46
47 double ffi_test_8(double x, float y, double z, float t, int w)
48 {
49         return x * y + z * t + w;
50 }
51
52 int ffi_test_9(int a, int b, int c, int d, int e, int f, int g)
53 {
54         return a + b + c + d + e + f + g;
55 }
56
57 int ffi_test_10(int a, int b, double c, int d, float e, int f, int g, int h)
58 {
59         return a - b - c - d - e - f - g - h;
60 }
61
62 int ffi_test_11(int a, struct foo b, int c)
63 {
64         return a * b.x + c * b.y;
65 }
66
67 int ffi_test_12(int a, int b, struct rect c, int d, int e, int f)
68 {
69         return a + b + c.x + c.y + c.w + c.h + d + e + f;
70 }
71
72 int ffi_test_13(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j, int k)
73 {
74         return a + b + c + d + e + f + g + h + i + j + k;
75 }
76
77 struct foo ffi_test_14(int x, int y)
78 {
79         struct foo r;
80         r.x = x; r.y = y;
81         return r;
82 }
83
84 char *ffi_test_15(char *x, char *y)
85 {
86         if(strcmp(x,y))
87                 return "foo";
88         else
89                 return "bar";
90 }
91
92 struct bar ffi_test_16(long x, long y, long z)
93 {
94         struct bar r;
95         r.x = x; r.y = y; r.z = z;
96         return r;
97 }
98
99 struct tiny ffi_test_17(int x)
100 {
101         struct tiny r;
102         r.x = x;
103         return r;
104 }
105
106 FACTOR_STDCALL(int) ffi_test_18(int x, int y, int z, int t)
107 {
108         return x + y + z * t;
109 }
110
111 FACTOR_STDCALL(struct bar) ffi_test_19(long x, long y, long z)
112 {
113         struct bar r;
114         r.x = x; r.y = y; r.z = z;
115         return r;
116 }
117
118 void ffi_test_20(double x1, double x2, double x3,
119         double y1, double y2, double y3,
120         double z1, double z2, double z3)
121 {
122 }
123
124 long long ffi_test_21(long x, long y)
125 {
126         return (long long)x * (long long)y;
127 }
128
129 long ffi_test_22(long x, long long y, long long z)
130 {
131         return x + y / z;
132 }
133
134 float ffi_test_23(float x[3], float y[3])
135 {
136         return x[0] * y[0] + x[1] * y[1] + x[2] * y[2];
137 }
138
139 struct test_struct_1 ffi_test_24(void)
140 {
141         struct test_struct_1 s;
142         s.x = 1;
143         return s;
144 }
145
146 struct test_struct_2 ffi_test_25(void)
147 {
148         struct test_struct_2 s;
149         s.x = 1;
150         s.y = 2;
151         return s;
152 }
153
154 struct test_struct_3 ffi_test_26(void)
155 {
156         struct test_struct_3 s;
157         s.x = 1;
158         s.y = 2;
159         s.z = 3;
160         return s;
161 }
162
163 struct test_struct_4 ffi_test_27(void)
164 {
165         struct test_struct_4 s;
166         s.x = 1;
167         s.y = 2;
168         s.z = 3;
169         s.a = 4;
170         return s;
171 }
172
173 struct test_struct_5 ffi_test_28(void)
174 {
175         struct test_struct_5 s;
176         s.x = 1;
177         s.y = 2;
178         s.z = 3;
179         s.a = 4;
180         s.b = 5;
181         return s;
182 }
183
184 struct test_struct_6 ffi_test_29(void)
185 {
186         struct test_struct_6 s;
187         s.x = 1;
188         s.y = 2;
189         s.z = 3;
190         s.a = 4;
191         s.b = 5;
192         s.c = 6;
193         return s;
194 }
195
196 struct test_struct_7 ffi_test_30(void)
197 {
198         struct test_struct_7 s;
199         s.x = 1;
200         s.y = 2;
201         s.z = 3;
202         s.a = 4;
203         s.b = 5;
204         s.c = 6;
205         s.d = 7;
206         return s;
207 }
208
209 int ffi_test_31(int x0, int x1, int x2, int x3, int x4, int x5, int x6, int x7, int x8, int x9, int x10, int x11, int x12, int x13, int x14, int x15, int x16, int x17, int x18, int x19, int x20, int x21, int x22, int x23, int x24, int x25, int x26, int x27, int x28, int x29, int x30, int x31, int x32, int x33, int x34, int x35, int x36, int x37, int x38, int x39, int x40, int x41)
210 {
211         return x0 + x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12 + x13 + x14 + x15 + x16 + x17 + x18 + x19 + x20 + x21 + x22 + x23 + x24 + x25 + x26 + x27 + x28 + x29 + x30 + x31 + x32 + x33 + x34 + x35 + x36 + x37 + x38 + x39 + x40 + x41;
212 }
213
214 float ffi_test_31_point_5(float x0, float x1, float x2, float x3, float x4, float x5, float x6, float x7, float x8, float x9, float x10, float x11, float x12, float x13, float x14, float x15, float x16, float x17, float x18, float x19, float x20, float x21, float x22, float x23, float x24, float x25, float x26, float x27, float x28, float x29, float x30, float x31, float x32, float x33, float x34, float x35, float x36, float x37, float x38, float x39, float x40, float x41)
215 {
216         return x0 + x1 + x2 + x3 + x4 + x5 + x6 + x7 + x8 + x9 + x10 + x11 + x12 + x13 + x14 + x15 + x16 + x17 + x18 + x19 + x20 + x21 + x22 + x23 + x24 + x25 + x26 + x27 + x28 + x29 + x30 + x31 + x32 + x33 + x34 + x35 + x36 + x37 + x38 + x39 + x40 + x41;
217 }
218
219 double ffi_test_32(struct test_struct_8 x, int y)
220 {
221         return (x.x + x.y) * y;
222 }
223
224 double ffi_test_33(struct test_struct_9 x, int y)
225 {
226         return (x.x + x.y) * y;
227 }
228
229 double ffi_test_34(struct test_struct_10 x, int y)
230 {
231         return (x.x + x.y) * y;
232 }
233
234 double ffi_test_35(struct test_struct_11 x, int y)
235 {
236         return (x.x + x.y) * y;
237 }
238
239 double ffi_test_36(struct test_struct_12 x)
240 {
241         return x.x;
242 }
243
244 static int global_var;
245
246 void ffi_test_36_point_5(void)
247 {
248         global_var = 0;
249 }
250
251 int ffi_test_37(int (*f)(int, int, int))
252 {
253         global_var = f(global_var,global_var * 2,global_var * 3);
254         return global_var;
255 }
256
257 unsigned long long ffi_test_38(unsigned long long x, unsigned long long y)
258 {
259         return x * y;
260 }
261
262 int ffi_test_39(long a, long b, struct test_struct_13 s)
263 {
264         assert(a == b);
265         return s.x1 + s.x2 + s.x3 + s.x4 + s.x5 + s.x6;
266 }
267
268 struct test_struct_14 ffi_test_40(double x1, double x2)
269 {
270         struct test_struct_14 retval;
271         retval.x1 = x1;
272         retval.x2 = x2;
273         return retval;
274 }
275
276 struct test_struct_12 ffi_test_41(int a, double x)
277 {
278         struct test_struct_12 retval;
279         retval.a = a;
280         retval.x = x;
281         return retval;
282 }
283
284 struct test_struct_15 ffi_test_42(float x, float y)
285 {
286         struct test_struct_15 retval;
287         retval.x = x;
288         retval.y = y;
289         return retval;
290 }
291
292 struct test_struct_16 ffi_test_43(float x, int a)
293 {
294         struct test_struct_16 retval;
295         retval.x = x;
296         retval.a = a;
297         return retval;
298 }
299
300 struct test_struct_14 ffi_test_44(void)
301 {
302         struct test_struct_14 retval;
303         retval.x1 = 1.0;
304         retval.x2 = 2.0;
305         return retval;
306 }
307
308 /* C99 features */
309 #ifndef _MSC_VER
310
311 _Complex float ffi_test_45(int x)
312 {
313         return x;
314 }
315
316 _Complex double ffi_test_46(int x)
317 {
318         return x;
319 }
320
321 _Complex float ffi_test_47(_Complex float x, _Complex double y)
322 {
323         return x + 2 * y;
324 }
325
326 short ffi_test_48(struct bool_field_test x)
327 {
328         return x.parents;
329 }
330
331 #endif