Mercurial > pub > dyncall > dyncall
comparison test/plain/test_main.c @ 531:f6430d194be6
cleanups
author | Tassilo Philipp |
---|---|
date | Sat, 16 Apr 2022 14:59:05 +0200 |
parents | da4b267c10bf |
children | d4bf63ab9164 |
comparison
equal
deleted
inserted
replaced
530:585dcb68f55d | 531:f6430d194be6 |
---|---|
4 Library: test | 4 Library: test |
5 File: test/plain/test_main.c | 5 File: test/plain/test_main.c |
6 Description: | 6 Description: |
7 License: | 7 License: |
8 | 8 |
9 Copyright (c) 2007-2019 Daniel Adler <dadler@uni-goettingen.de>, | 9 Copyright (c) 2007-2022 Daniel Adler <dadler@uni-goettingen.de>, |
10 Tassilo Philipp <tphilipp@potion-studios.com> | 10 Tassilo Philipp <tphilipp@potion-studios.com> |
11 | 11 |
12 Permission to use, copy, modify, and distribute this software for any | 12 Permission to use, copy, modify, and distribute this software for any |
13 purpose with or without fee is hereby granted, provided that the above | 13 purpose with or without fee is hereby granted, provided that the above |
14 copyright notice and this permission notice appear in all copies. | 14 copyright notice and this permission notice appear in all copies. |
52 #endif | 52 #endif |
53 | 53 |
54 int g_void_testval; | 54 int g_void_testval; |
55 DEF_FUNCS(__cdecl,c) | 55 DEF_FUNCS(__cdecl,c) |
56 | 56 |
57 int testCallC() | 57 static int testCallC() |
58 { | 58 { |
59 int ret = 1; | 59 int ret = 1; |
60 | 60 |
61 DCCallVM* pc = dcNewCallVM(4096); | 61 DCCallVM* pc = dcNewCallVM(4096); |
62 dcMode(pc,DC_CALL_C_DEFAULT); | 62 dcMode(pc,DC_CALL_C_DEFAULT); |
70 DCbool r, val=DC_TRUE; | 70 DCbool r, val=DC_TRUE; |
71 dcReset(pc); | 71 dcReset(pc); |
72 dcArgBool(pc, val); | 72 dcArgBool(pc, val); |
73 r = dcCallBool(pc, (DCpointer) &fun_c_b); | 73 r = dcCallBool(pc, (DCpointer) &fun_c_b); |
74 printf("bt (cdecl): %d\n", (r == val)); | 74 printf("bt (cdecl): %d\n", (r == val)); |
75 ret = (r == val) && ret; | 75 ret = (r == val) && ret; |
76 | 76 |
77 val=DC_FALSE; | 77 val=DC_FALSE; |
78 dcReset(pc); | 78 dcReset(pc); |
79 dcArgBool(pc, val); | 79 dcArgBool(pc, val); |
80 r = dcCallBool(pc, (DCpointer) &fun_c_b); | 80 r = dcCallBool(pc, (DCpointer) &fun_c_b); |
81 printf("bf (cdecl): %d\n", (r == val)); | 81 printf("bf (cdecl): %d\n", (r == val)); |
82 ret = (r == val) && ret; | 82 ret = (r == val) && ret; |
83 } | 83 } |
84 /* int */ | 84 /* int */ |
85 { | 85 { |
86 DCint r, val=1234; | 86 DCint r, val=1234; |
87 dcReset(pc); | 87 dcReset(pc); |
88 dcArgInt(pc, val); | 88 dcArgInt(pc, val); |
89 r = dcCallInt(pc, (DCpointer) &fun_c_i); | 89 r = dcCallInt(pc, (DCpointer) &fun_c_i); |
90 printf("i (cdecl): %d\n", (r == val)); | 90 printf("i (cdecl): %d\n", (r == val)); |
91 ret = (r == val) && ret; | 91 ret = (r == val) && ret; |
92 } | 92 } |
93 /* long */ | 93 /* long */ |
94 { | 94 { |
95 DClong r, val=(DClong) 0xCAFEBABEL; | 95 DClong r, val=(DClong) 0xCAFEBABEL; |
96 dcReset(pc); | 96 dcReset(pc); |
97 dcArgLong(pc, val); | 97 dcArgLong(pc, val); |
98 r = dcCallLong(pc, (DCpointer) &fun_c_j); | 98 r = dcCallLong(pc, (DCpointer) &fun_c_j); |
99 printf("l (cdecl): %d\n", (r == val)); | 99 printf("l (cdecl): %d\n", (r == val)); |
100 ret = (r == val) && ret; | 100 ret = (r == val) && ret; |
101 } | 101 } |
102 /* long long */ | 102 /* long long */ |
103 { | 103 { |
104 DClonglong r, val=(DClonglong) 0xCAFEBABEDEADC0DELL; | 104 DClonglong r, val=(DClonglong) 0xCAFEBABEDEADC0DELL; |
105 dcReset(pc); | 105 dcReset(pc); |
106 dcArgLongLong(pc, val); | 106 dcArgLongLong(pc, val); |
107 r = dcCallLongLong(pc, (DCpointer) &fun_c_l); | 107 r = dcCallLongLong(pc, (DCpointer) &fun_c_l); |
108 printf("ll (cdecl): %d\n", (r == (DClonglong)val)); | 108 printf("ll (cdecl): %d\n", (r == (DClonglong)val)); |
109 ret = (r == (DClonglong)val) && ret; | 109 ret = (r == (DClonglong)val) && ret; |
110 } | 110 } |
111 /* float */ | 111 /* float */ |
112 { | 112 { |
113 DCfloat r, val=1.234567f; | 113 DCfloat r, val=1.234567f; |
114 dcReset(pc); | 114 dcReset(pc); |
115 dcArgFloat(pc, val); | 115 dcArgFloat(pc, val); |
116 r = dcCallFloat(pc, (DCpointer) &fun_c_f); | 116 r = dcCallFloat(pc, (DCpointer) &fun_c_f); |
117 printf("f (cdecl): %d\n", (r == val)); | 117 printf("f (cdecl): %d\n", (r == val)); |
118 ret = (r == val) && ret; | 118 ret = (r == val) && ret; |
119 } | 119 } |
120 /* double */ | 120 /* double */ |
121 { | 121 { |
122 DCdouble r, val=1.23456789; | 122 DCdouble r, val=1.23456789; |
123 dcReset(pc); | 123 dcReset(pc); |
124 dcArgDouble(pc, val); | 124 dcArgDouble(pc, val); |
125 r = dcCallDouble(pc, (DCpointer) &fun_c_d); | 125 r = dcCallDouble(pc, (DCpointer) &fun_c_d); |
126 printf("d (cdecl): %d\n", (r == val)); | 126 printf("d (cdecl): %d\n", (r == val)); |
127 ret = (r == val) && ret; | 127 ret = (r == val) && ret; |
128 } | 128 } |
129 /* ptr */ | 129 /* ptr */ |
130 { | 130 { |
131 DCpointer r; | 131 DCpointer r; |
132 dcReset(pc); | 132 dcReset(pc); |
133 dcArgPointer(pc, (DCpointer) &fun_c_b); | 133 dcArgPointer(pc, (DCpointer) &fun_c_b); |
134 r = dcCallPointer(pc, (DCpointer) &fun_c_p); | 134 r = dcCallPointer(pc, (DCpointer) &fun_c_p); |
135 printf("p (cdecl): %d\n", (r == (DCpointer) &fun_c_b)); | 135 printf("p (cdecl): %d\n", (r == (DCpointer) &fun_c_b)); |
136 ret = (r == (DCpointer) &fun_c_b) && ret; | 136 ret = (r == (DCpointer) &fun_c_b) && ret; |
137 } | 137 } |
138 dcFree(pc); | 138 dcFree(pc); |
139 | 139 |
140 return ret; | 140 return ret; |
141 } | 141 } |
144 #if defined(DC__OS_Win32) | 144 #if defined(DC__OS_Win32) |
145 /* win32 __stdcall */ | 145 /* win32 __stdcall */ |
146 | 146 |
147 DEF_FUNCS(__stdcall,std) | 147 DEF_FUNCS(__stdcall,std) |
148 | 148 |
149 int testCallStd() | 149 static int testCallStd() |
150 { | 150 { |
151 int ret = 1; | 151 int ret = 1; |
152 | 152 |
153 DCCallVM* pc = dcNewCallVM(4096); | 153 DCCallVM* pc = dcNewCallVM(4096); |
154 dcMode(pc,DC_CALL_C_X86_WIN32_STD); | 154 dcMode(pc,DC_CALL_C_X86_WIN32_STD); |
162 DCbool r, val=DC_TRUE; | 162 DCbool r, val=DC_TRUE; |
163 dcReset(pc); | 163 dcReset(pc); |
164 dcArgBool(pc, val); | 164 dcArgBool(pc, val); |
165 r = dcCallBool(pc, (DCpointer) &fun_std_b); | 165 r = dcCallBool(pc, (DCpointer) &fun_std_b); |
166 printf("bt (stdcall): %d\n", (r == val)); | 166 printf("bt (stdcall): %d\n", (r == val)); |
167 ret = (r == val) && ret; | 167 ret = (r == val) && ret; |
168 | 168 |
169 val=DC_FALSE; | 169 val=DC_FALSE; |
170 dcReset(pc); | 170 dcReset(pc); |
171 dcArgBool(pc, val); | 171 dcArgBool(pc, val); |
172 r = dcCallBool(pc, (DCpointer) &fun_std_b); | 172 r = dcCallBool(pc, (DCpointer) &fun_std_b); |
173 printf("bf (stdcall): %d\n", (r == val)); | 173 printf("bf (stdcall): %d\n", (r == val)); |
174 ret = (r == val) && ret; | 174 ret = (r == val) && ret; |
175 } | 175 } |
176 /* int */ | 176 /* int */ |
177 { | 177 { |
178 DCint r, val=1234; | 178 DCint r, val=1234; |
179 dcReset(pc); | 179 dcReset(pc); |
180 dcArgInt(pc, val); | 180 dcArgInt(pc, val); |
181 r = dcCallInt(pc, (DCpointer) &fun_std_i); | 181 r = dcCallInt(pc, (DCpointer) &fun_std_i); |
182 printf("i (stdcall): %d\n", (r == val)); | 182 printf("i (stdcall): %d\n", (r == val)); |
183 ret = (r == val) && ret; | 183 ret = (r == val) && ret; |
184 } | 184 } |
185 /* long */ | 185 /* long */ |
186 { | 186 { |
187 DClong r, val=0xCAFEBABEUL; | 187 DClong r, val=0xCAFEBABEUL; |
188 dcReset(pc); | 188 dcReset(pc); |
189 dcArgLong(pc, val); | 189 dcArgLong(pc, val); |
190 r = dcCallLong(pc, (DCpointer) &fun_std_j); | 190 r = dcCallLong(pc, (DCpointer) &fun_std_j); |
191 printf("l (stdcall): %d\n", (r == val)); | 191 printf("l (stdcall): %d\n", (r == val)); |
192 ret = (r == val) && ret; | 192 ret = (r == val) && ret; |
193 } | 193 } |
194 /* long long */ | 194 /* long long */ |
195 { | 195 { |
196 DClonglong r, val=0xCAFEBABEDEADC0DEULL; | 196 DClonglong r, val=0xCAFEBABEDEADC0DEULL; |
197 dcReset(pc); | 197 dcReset(pc); |
198 dcArgLongLong(pc, val); | 198 dcArgLongLong(pc, val); |
199 r = dcCallLongLong(pc, (DCpointer) &fun_std_l); | 199 r = dcCallLongLong(pc, (DCpointer) &fun_std_l); |
200 printf("ll (stdcall): %d\n", (r == val)); | 200 printf("ll (stdcall): %d\n", (r == val)); |
201 ret = (r == val) && ret; | 201 ret = (r == val) && ret; |
202 } | 202 } |
203 /* float */ | 203 /* float */ |
204 { | 204 { |
205 DCfloat r, val=1.234567f; | 205 DCfloat r, val=1.234567f; |
206 dcReset(pc); | 206 dcReset(pc); |
207 dcArgFloat(pc, val); | 207 dcArgFloat(pc, val); |
208 r = dcCallFloat(pc, (DCpointer) &fun_std_f); | 208 r = dcCallFloat(pc, (DCpointer) &fun_std_f); |
209 printf("f (stdcall): %d\n", (r == val)); | 209 printf("f (stdcall): %d\n", (r == val)); |
210 ret = (r == val) && ret; | 210 ret = (r == val) && ret; |
211 } | 211 } |
212 /* double */ | 212 /* double */ |
213 { | 213 { |
214 DCdouble r, val=1.23456789; | 214 DCdouble r, val=1.23456789; |
215 dcReset(pc); | 215 dcReset(pc); |
216 dcArgDouble(pc, val); | 216 dcArgDouble(pc, val); |
217 r = dcCallDouble(pc, (DCpointer) &fun_std_d); | 217 r = dcCallDouble(pc, (DCpointer) &fun_std_d); |
218 printf("d (stdcall): %d\n", (r == val)); | 218 printf("d (stdcall): %d\n", (r == val)); |
219 ret = (r == val) && ret; | 219 ret = (r == val) && ret; |
220 } | 220 } |
221 /* ptr */ | 221 /* ptr */ |
222 { | 222 { |
223 DCpointer r; | 223 DCpointer r; |
224 dcReset(pc); | 224 dcReset(pc); |
225 dcArgPointer(pc, (DCpointer) &fun_c_b); | 225 dcArgPointer(pc, (DCpointer) &fun_c_b); |
226 r = dcCallPointer(pc, (DCpointer) &fun_std_p); | 226 r = dcCallPointer(pc, (DCpointer) &fun_std_p); |
227 printf("p (stdcall): %d\n", (r == &fun_c_b)); | 227 printf("p (stdcall): %d\n", (r == &fun_c_b)); |
228 ret = (r == &fun_c_b) && ret; | 228 ret = (r == &fun_c_b) && ret; |
229 } | 229 } |
230 dcFree(pc); | 230 dcFree(pc); |
231 | 231 |
232 return ret; | 232 return ret; |
233 } | 233 } |
238 #if defined(DC__OS_Win32) | 238 #if defined(DC__OS_Win32) |
239 /* win32 __fastcall */ | 239 /* win32 __fastcall */ |
240 | 240 |
241 DEF_FUNCS(__fastcall,fast) | 241 DEF_FUNCS(__fastcall,fast) |
242 | 242 |
243 int testCallFast() | 243 static int testCallFast() |
244 { | 244 { |
245 int ret = 1; | 245 int ret = 1; |
246 | 246 |
247 DCCallVM* pc = dcNewCallVM(4096); | 247 DCCallVM* pc = dcNewCallVM(4096); |
248 #ifdef DC__C_GNU | 248 #ifdef DC__C_GNU |
262 DCbool r, val=DC_TRUE; | 262 DCbool r, val=DC_TRUE; |
263 dcReset(pc); | 263 dcReset(pc); |
264 dcArgBool(pc, val); | 264 dcArgBool(pc, val); |
265 r = dcCallBool(pc, (DCpointer) &fun_fast_b); | 265 r = dcCallBool(pc, (DCpointer) &fun_fast_b); |
266 printf("bt ("FT"fastcall): %d\n", (r == val)); | 266 printf("bt ("FT"fastcall): %d\n", (r == val)); |
267 ret = (r == val) && ret; | 267 ret = (r == val) && ret; |
268 | 268 |
269 val=DC_FALSE; | 269 val=DC_FALSE; |
270 dcReset(pc); | 270 dcReset(pc); |
271 dcArgBool(pc, val); | 271 dcArgBool(pc, val); |
272 r = dcCallBool(pc, (DCpointer) &fun_fast_b); | 272 r = dcCallBool(pc, (DCpointer) &fun_fast_b); |
273 printf("bf ("FT"fastcall): %d\n", (r == val)); | 273 printf("bf ("FT"fastcall): %d\n", (r == val)); |
274 ret = (r == val) && ret; | 274 ret = (r == val) && ret; |
275 } | 275 } |
276 /* int */ | 276 /* int */ |
277 { | 277 { |
278 DCint r, val=1234; | 278 DCint r, val=1234; |
279 dcReset(pc); | 279 dcReset(pc); |
280 dcArgInt(pc, val); | 280 dcArgInt(pc, val); |
281 r = dcCallInt(pc, (DCpointer) &fun_fast_i); | 281 r = dcCallInt(pc, (DCpointer) &fun_fast_i); |
282 printf("i ("FT"fastcall): %d\n", (r == val)); | 282 printf("i ("FT"fastcall): %d\n", (r == val)); |
283 ret = (r == val) && ret; | 283 ret = (r == val) && ret; |
284 } | 284 } |
285 /* long */ | 285 /* long */ |
286 { | 286 { |
287 DClong r, val=0xCAFEBABEUL; | 287 DClong r, val=0xCAFEBABEUL; |
288 dcReset(pc); | 288 dcReset(pc); |
289 dcArgLong(pc, val); | 289 dcArgLong(pc, val); |
290 r = dcCallLong(pc, (DCpointer) &fun_fast_j); | 290 r = dcCallLong(pc, (DCpointer) &fun_fast_j); |
291 printf("l ("FT"fastcall): %d\n", (r == val)); | 291 printf("l ("FT"fastcall): %d\n", (r == val)); |
292 ret = (r == val) && ret; | 292 ret = (r == val) && ret; |
293 } | 293 } |
294 /* long long */ | 294 /* long long */ |
295 { | 295 { |
296 DClonglong r, val=0xCAFEBABEDEADC0DEULL; | 296 DClonglong r, val=0xCAFEBABEDEADC0DEULL; |
297 dcReset(pc); | 297 dcReset(pc); |
298 dcArgLongLong(pc, val); | 298 dcArgLongLong(pc, val); |
299 r = dcCallLongLong(pc, (DCpointer) &fun_fast_l); | 299 r = dcCallLongLong(pc, (DCpointer) &fun_fast_l); |
300 printf("ll ("FT"fastcall): %d\n", (r == val)); | 300 printf("ll ("FT"fastcall): %d\n", (r == val)); |
301 ret = (r == val) && ret; | 301 ret = (r == val) && ret; |
302 } | 302 } |
303 /* float */ | 303 /* float */ |
304 { | 304 { |
305 DCfloat r, val=1.234567f; | 305 DCfloat r, val=1.234567f; |
306 dcReset(pc); | 306 dcReset(pc); |
307 dcArgFloat(pc, val); | 307 dcArgFloat(pc, val); |
308 r = dcCallFloat(pc, (DCpointer) &fun_fast_f); | 308 r = dcCallFloat(pc, (DCpointer) &fun_fast_f); |
309 printf("f ("FT"fastcall): %d\n", (r == val)); | 309 printf("f ("FT"fastcall): %d\n", (r == val)); |
310 ret = (r == val) && ret; | 310 ret = (r == val) && ret; |
311 } | 311 } |
312 /* double */ | 312 /* double */ |
313 { | 313 { |
314 DCdouble r, val=1.23456789; | 314 DCdouble r, val=1.23456789; |
315 dcReset(pc); | 315 dcReset(pc); |
316 dcArgDouble(pc, val); | 316 dcArgDouble(pc, val); |
317 r = dcCallDouble(pc, (DCpointer) &fun_fast_d); | 317 r = dcCallDouble(pc, (DCpointer) &fun_fast_d); |
318 printf("d ("FT"fastcall): %d\n", (r == val)); | 318 printf("d ("FT"fastcall): %d\n", (r == val)); |
319 ret = (r == val) && ret; | 319 ret = (r == val) && ret; |
320 } | 320 } |
321 /* ptr */ | 321 /* ptr */ |
322 { | 322 { |
323 DCpointer r; | 323 DCpointer r; |
324 dcReset(pc); | 324 dcReset(pc); |
325 dcArgPointer(pc, (DCpointer) &fun_c_b); | 325 dcArgPointer(pc, (DCpointer) &fun_c_b); |
326 r = dcCallPointer(pc, (DCpointer) &fun_fast_p); | 326 r = dcCallPointer(pc, (DCpointer) &fun_fast_p); |
327 printf("p ("FT"fastcall): %d\n", (r == &fun_c_b)); | 327 printf("p ("FT"fastcall): %d\n", (r == &fun_c_b)); |
328 ret = (r == &fun_c_b) && ret; | 328 ret = (r == &fun_c_b) && ret; |
329 } | 329 } |
330 dcFree(pc); | 330 dcFree(pc); |
331 | 331 |
332 return ret; | 332 return ret; |
333 } | 333 } |
342 { | 342 { |
343 int r = 1; | 343 int r = 1; |
344 dcTest_initPlatform(); | 344 dcTest_initPlatform(); |
345 | 345 |
346 r = testCallC() && r; | 346 r = testCallC() && r; |
347 r = testStructSizes() && r; | 347 r = testAggrReturns() && r; |
348 /*r = testCallStructs() && r;*/ | 348 r = testAggrParameters() && r; |
349 r = testAggrReturns() && r; | |
350 r = testAggrParameters() && r; | |
349 #if defined(DC__OS_Win32) | 351 #if defined(DC__OS_Win32) |
350 r = testCallStd() && r; | 352 r = testCallStd() && r; |
351 r = testCallFast() && r; | 353 r = testCallFast() && r; |
352 #endif | 354 #endif |
353 | 355 |