Mercurial > pub > dyncall > dyncall
comparison test/plain/test_aggrs.c @ 627:c477ddd64718 r1.4-RC5
- test/plain:
* added some aggregate-by-val-as-vararg cases
* made output be more in line w/ sig format
author | Tassilo Philipp |
---|---|
date | Fri, 28 Oct 2022 15:08:21 +0200 |
parents | 71c884e610f0 |
children | 4754d195d2b5 |
comparison
equal
deleted
inserted
replaced
626:667fe7b2be62 | 627:c477ddd64718 |
---|---|
27 | 27 |
28 #include "../../dyncall/dyncall.h" | 28 #include "../../dyncall/dyncall.h" |
29 #include "../../dyncall/dyncall_signature.h" | 29 #include "../../dyncall/dyncall_signature.h" |
30 #include "../../dyncall/dyncall_aggregate.h" | 30 #include "../../dyncall/dyncall_aggregate.h" |
31 #include <stdio.h> | 31 #include <stdio.h> |
32 #include <stdarg.h> | |
32 | 33 |
33 | 34 |
34 #if defined(DC__Feature_AggrByVal) | 35 #if defined(DC__Feature_AggrByVal) |
35 | 36 |
36 #if !defined(DC__OS_Win32) | 37 #if !defined(DC__OS_Win32) |
136 | 137 |
137 dcCallAggr(vm, (DCpointer) &fun_return_u8, s, &returned); | 138 dcCallAggr(vm, (DCpointer) &fun_return_u8, s, &returned); |
138 | 139 |
139 dcFreeAggr(s); | 140 dcFreeAggr(s); |
140 | 141 |
141 printf("r:{C} (cdecl): %d\n", (returned.a == expected.a)); | 142 printf("C){C} (cdecl): %d\n", (returned.a == expected.a)); |
142 ret = returned.a == expected.a && ret; | 143 ret = returned.a == expected.a && ret; |
143 } | 144 } |
144 { | 145 { |
145 U8_Double expected = fun_return_u8_double(5, 5.5), returned = { 6, 7.8 }; | 146 U8_Double expected = fun_return_u8_double(5, 5.5), returned = { 6, 7.8 }; |
146 | 147 |
157 | 158 |
158 dcCallAggr(vm, (DCpointer) &fun_return_u8_double, s, &returned); | 159 dcCallAggr(vm, (DCpointer) &fun_return_u8_double, s, &returned); |
159 | 160 |
160 dcFreeAggr(s); | 161 dcFreeAggr(s); |
161 | 162 |
162 printf("r:{Cd} (cdecl): %d\n", (returned.a == expected.a && returned.b == expected.b)); | 163 printf("Cd){Cd} (cdecl): %d\n", (returned.a == expected.a && returned.b == expected.b)); |
163 ret = returned.a == expected.a && returned.b == expected.b && ret; | 164 ret = returned.a == expected.a && returned.b == expected.b && ret; |
164 } | 165 } |
165 { | 166 { |
166 Double_U8 expected = fun_return_double_u8(5.5, 42), returned = { 6.7, 8 }; | 167 Double_U8 expected = fun_return_double_u8(5.5, 42), returned = { 6.7, 8 }; |
167 | 168 |
178 | 179 |
179 dcCallAggr(vm, (DCpointer) &fun_return_double_u8, s, &returned); | 180 dcCallAggr(vm, (DCpointer) &fun_return_double_u8, s, &returned); |
180 | 181 |
181 dcFreeAggr(s); | 182 dcFreeAggr(s); |
182 | 183 |
183 printf("r:{dC} (cdecl): %d\n", (returned.a == expected.a && returned.b == expected.b)); | 184 printf("dC){dC} (cdecl): %d\n", (returned.a == expected.a && returned.b == expected.b)); |
184 ret = returned.a == expected.a && returned.b == expected.b && ret; | 185 ret = returned.a == expected.a && returned.b == expected.b && ret; |
185 } | 186 } |
186 { | 187 { |
187 Int_NestedFloat expected = fun_return_int_nested_float(24, 2.5f), returned = { 25, { 3.5f } }; | 188 Int_NestedFloat expected = fun_return_int_nested_float(24, 2.5f), returned = { 25, { 3.5f } }; |
188 DCaggr *s, *s_; | 189 DCaggr *s, *s_; |
204 dcCallAggr(vm, (DCpointer) &fun_return_int_nested_float, s, &returned); | 205 dcCallAggr(vm, (DCpointer) &fun_return_int_nested_float, s, &returned); |
205 | 206 |
206 dcFreeAggr(s_); | 207 dcFreeAggr(s_); |
207 dcFreeAggr(s); | 208 dcFreeAggr(s); |
208 | 209 |
209 printf("r:{i{f}} (cdecl): %d\n", (returned.a == expected.a && returned.b.f == expected.b.f)); | 210 printf("if){i{f}} (cdecl): %d\n", (returned.a == expected.a && returned.b.f == expected.b.f)); |
210 ret = returned.a == expected.a && returned.b.f == expected.b.f && ret; | 211 ret = returned.a == expected.a && returned.b.f == expected.b.f && ret; |
211 } | 212 } |
212 { | 213 { |
213 Int_NestedDouble expected = fun_return_int_nested_double(24, 2.5), returned = { 25, { 3.5f } }; | 214 Int_NestedDouble expected = fun_return_int_nested_double(24, 2.5), returned = { 25, { 3.5f } }; |
214 DCaggr *s, *s_; | 215 DCaggr *s, *s_; |
230 dcCallAggr(vm, (DCpointer) &fun_return_int_nested_double, s, &returned); | 231 dcCallAggr(vm, (DCpointer) &fun_return_int_nested_double, s, &returned); |
231 | 232 |
232 dcFreeAggr(s_); | 233 dcFreeAggr(s_); |
233 dcFreeAggr(s); | 234 dcFreeAggr(s); |
234 | 235 |
235 printf("r:{i{d}} (cdecl): %d\n", (returned.a == expected.a && returned.b.f == expected.b.f)); | 236 printf("id){i{d}} (cdecl): %d\n", (returned.a == expected.a && returned.b.f == expected.b.f)); |
236 ret = returned.a == expected.a && returned.b.f == expected.b.f && ret; | 237 ret = returned.a == expected.a && returned.b.f == expected.b.f && ret; |
237 } | 238 } |
238 { | 239 { |
239 Three_Double expected = fun_return_three_double(1.5, 2.5, 3.5), returned = { 2.5, 3.5, 4.5 }; | 240 Three_Double expected = fun_return_three_double(1.5, 2.5, 3.5), returned = { 2.5, 3.5, 4.5 }; |
240 | 241 |
253 | 254 |
254 dcCallAggr(vm, (DCpointer) &fun_return_three_double, s, &returned); | 255 dcCallAggr(vm, (DCpointer) &fun_return_three_double, s, &returned); |
255 | 256 |
256 dcFreeAggr(s); | 257 dcFreeAggr(s); |
257 | 258 |
258 printf("r:{ddd} (cdecl): %d\n", (returned.a == expected.a && returned.b == expected.b && returned.c == expected.c)); | 259 printf("ddd){ddd} (cdecl): %d\n", (returned.a == expected.a && returned.b == expected.b && returned.c == expected.c)); |
259 ret = returned.a == expected.a && returned.b == expected.b && returned.c == expected.c && ret; | 260 ret = returned.a == expected.a && returned.b == expected.b && returned.c == expected.c && ret; |
260 } | 261 } |
261 | 262 |
262 dcFree(vm); | 263 dcFree(vm); |
263 | 264 |
272 static double __cdecl fun_take_int_nested_double(Int_NestedDouble s) { return s.a + s.b.f; } | 273 static double __cdecl fun_take_int_nested_double(Int_NestedDouble s) { return s.a + s.b.f; } |
273 static double __cdecl fun_take_three_double(Three_Double s) { return s.a + s.b + s.c; } | 274 static double __cdecl fun_take_three_double(Three_Double s) { return s.a + s.b + s.c; } |
274 static double __cdecl fun_take_mixed_fp(double a, float b, float c, int d, float e, double f, float g, Three_Double s) { return a + 2.*b + 3.*c + 4.*d + 5.*e + 6.*f + 7.*g + 8.*s.a + 9.*s.b + 10.*s.c; } | 275 static double __cdecl fun_take_mixed_fp(double a, float b, float c, int d, float e, double f, float g, Three_Double s) { return a + 2.*b + 3.*c + 4.*d + 5.*e + 6.*f + 7.*g + 8.*s.a + 9.*s.b + 10.*s.c; } |
275 static int __cdecl fun_take_iiiii_il(int a, int b, int c, int d, int e, Int_LongLong f) { return a + b + c + d + e + f.a + (int)f.b; } | 276 static int __cdecl fun_take_iiiii_il(int a, int b, int c, int d, int e, Int_LongLong f) { return a + b + c + d + e + f.a + (int)f.b; } |
276 static double __cdecl fun_take_more_than_regs(More_Than_Regs s) { return s.a + s.b + s.c + s.d + s.e + s.f + s.g + s.h + s.i + s.j + s.k + s.l + s.m + s.n + s.o + s.p + s.q + s.r; } | 277 static double __cdecl fun_take_more_than_regs(More_Than_Regs s) { return s.a + s.b + s.c + s.d + s.e + s.f + s.g + s.h + s.i + s.j + s.k + s.l + s.m + s.n + s.o + s.p + s.q + s.r; } |
278 static double __cdecl fun_take_mixed_fp_vararg(double a, float b, float c, int d, ...) { double r = a + 2.*b + 3.*c + 4.*d; va_list v; va_start(v,d); r += 5.*va_arg(v,double); r += 6.*va_arg(v,double); r += 7.*va_arg(v,double); Three_Double s = va_arg(v,Three_Double); va_end(v); return r + 8.*s.a + 9.*s.b + 10.*s.c; } | |
279 static int __cdecl fun_take_iiiii_il_vararg(int a, int b, int c, int d, int e, ...) { int r = a + b + c + d + e; va_list v; va_start(v,e); Int_LongLong f = va_arg(v,Int_LongLong); va_end(v); return r + f.a + (int)f.b; } | |
280 static double __cdecl fun_take_aggrs_vararg(Int_NestedDouble a, ...) { double r = a.a + a.b.f; va_list v; va_start(v,a); Int_NestedFloat b = va_arg(v,Int_NestedFloat); va_end(v); return r + b.a + b.b.f; } | |
277 | 281 |
278 | 282 |
279 int testAggrParameters() | 283 int testAggrParameters() |
280 { | 284 { |
281 int ret = 1; | 285 int ret = 1; |
294 dcArgAggr(vm, s, &t); | 298 dcArgAggr(vm, s, &t); |
295 returned = dcCallDouble(vm, (DCpointer) &fun_take_u8); | 299 returned = dcCallDouble(vm, (DCpointer) &fun_take_u8); |
296 | 300 |
297 dcFreeAggr(s); | 301 dcFreeAggr(s); |
298 | 302 |
299 printf("{C} (cdecl): %d\n", returned == t.a); | 303 printf("{C})d (cdecl): %d\n", returned == t.a); |
300 ret = returned == t.a && ret; | 304 ret = returned == t.a && ret; |
301 } | 305 } |
302 { | 306 { |
303 U8_Double t = { 5, 5.5 }; | 307 U8_Double t = { 5, 5.5 }; |
304 double returned; | 308 double returned; |
312 dcArgAggr(vm, s, &t); | 316 dcArgAggr(vm, s, &t); |
313 returned = dcCallDouble(vm, (DCpointer) &fun_take_u8_double); | 317 returned = dcCallDouble(vm, (DCpointer) &fun_take_u8_double); |
314 | 318 |
315 dcFreeAggr(s); | 319 dcFreeAggr(s); |
316 | 320 |
317 printf("{Cd} (cdecl): %d\n", returned == t.a + t.b); | 321 printf("{Cd})d (cdecl): %d\n", returned == t.a + t.b); |
318 ret = returned == t.a + t.b && ret; | 322 ret = returned == t.a + t.b && ret; |
319 } | 323 } |
320 { | 324 { |
321 Float_Float t = { 1.5, 5.5 }; | 325 Float_Float t = { 1.5, 5.5 }; |
322 double returned; | 326 double returned; |
330 dcArgAggr(vm, s, &t); | 334 dcArgAggr(vm, s, &t); |
331 returned = dcCallDouble(vm, (DCpointer) &fun_take_float_float); | 335 returned = dcCallDouble(vm, (DCpointer) &fun_take_float_float); |
332 | 336 |
333 dcFreeAggr(s); | 337 dcFreeAggr(s); |
334 | 338 |
335 printf("{ff} (cdecl): %d\n", returned == t.a + t.b); | 339 printf("{ff})d (cdecl): %d\n", returned == t.a + t.b); |
336 ret = returned == t.a + t.b && ret; | 340 ret = returned == t.a + t.b && ret; |
337 } | 341 } |
338 { | 342 { |
339 Double_U8 t = { 5.5, 42 }; | 343 Double_U8 t = { 5.5, 42 }; |
340 double returned; | 344 double returned; |
348 dcArgAggr(vm, s, &t); | 352 dcArgAggr(vm, s, &t); |
349 returned = dcCallDouble(vm, (DCpointer) &fun_take_double_u8); | 353 returned = dcCallDouble(vm, (DCpointer) &fun_take_double_u8); |
350 | 354 |
351 dcFreeAggr(s); | 355 dcFreeAggr(s); |
352 | 356 |
353 printf("{dC} (cdecl): %d\n", returned == t.a + t.b); | 357 printf("{dC})d (cdecl): %d\n", returned == t.a + t.b); |
354 ret = returned == t.a + t.b && ret; | 358 ret = returned == t.a + t.b && ret; |
355 } | 359 } |
356 { | 360 { |
357 Int_NestedFloat t = { 24, { 2.5f } }; | 361 Int_NestedFloat t = { 24, { 2.5f } }; |
358 double returned; | 362 double returned; |
372 returned = dcCallDouble(vm, (DCpointer) &fun_take_int_nested_float); | 376 returned = dcCallDouble(vm, (DCpointer) &fun_take_int_nested_float); |
373 | 377 |
374 dcFreeAggr(s_); | 378 dcFreeAggr(s_); |
375 dcFreeAggr(s); | 379 dcFreeAggr(s); |
376 | 380 |
377 printf("{i{f}} (cdecl): %d\n", returned == t.a + t.b.f); | 381 printf("{i{f}})d (cdecl): %d\n", returned == t.a + t.b.f); |
378 ret = returned == t.a + t.b.f && ret; | 382 ret = returned == t.a + t.b.f && ret; |
379 } | 383 } |
380 { | 384 { |
381 Int_NestedDouble t = { 24, { 2.5} }; | 385 Int_NestedDouble t = { 24, { 2.5} }; |
382 double returned; | 386 double returned; |
396 returned = dcCallDouble(vm, (DCpointer) &fun_take_int_nested_double); | 400 returned = dcCallDouble(vm, (DCpointer) &fun_take_int_nested_double); |
397 | 401 |
398 dcFreeAggr(s_); | 402 dcFreeAggr(s_); |
399 dcFreeAggr(s); | 403 dcFreeAggr(s); |
400 | 404 |
401 printf("{i{d}} (cdecl): %d\n", returned == t.a + t.b.f); | 405 printf("{i{d}})d (cdecl): %d\n", returned == t.a + t.b.f); |
402 ret = returned == t.a + t.b.f && ret; | 406 ret = returned == t.a + t.b.f && ret; |
403 } | 407 } |
404 { | 408 { |
405 Three_Double t = { 1.5, 2.5, 3.5 }; | 409 Three_Double t = { 1.5, 2.5, 3.5 }; |
406 double returned; | 410 double returned; |
415 dcArgAggr(vm, s, &t); | 419 dcArgAggr(vm, s, &t); |
416 returned = dcCallDouble(vm, (DCpointer) &fun_take_three_double); | 420 returned = dcCallDouble(vm, (DCpointer) &fun_take_three_double); |
417 | 421 |
418 dcFreeAggr(s); | 422 dcFreeAggr(s); |
419 | 423 |
420 printf("{fff} (cdecl): %d\n", returned == t.a + t.b + t.c); | 424 printf("{fff})d (cdecl): %d\n", returned == t.a + t.b + t.c); |
421 ret = returned == t.a + t.b + t.c && ret; | 425 ret = returned == t.a + t.b + t.c && ret; |
422 } | 426 } |
423 { | 427 { |
424 /* w/ some prev params, so not fitting into float regs anymore (on win and sysv) */ | 428 /* w/ some prev params, so not fitting into float regs anymore (on win and sysv) */ |
425 Three_Double t = { 1.5, 2.5, 3.5 }; | 429 Three_Double t = { 1.5, 2.5, 3.5 }; |
444 if(returned < 0.) | 448 if(returned < 0.) |
445 returned = -returned; | 449 returned = -returned; |
446 | 450 |
447 dcFreeAggr(s); | 451 dcFreeAggr(s); |
448 | 452 |
449 printf("dffifdf{fff} (cdecl): %d\n", returned < .00001); | 453 printf("dffifdf{fff})d (cdecl): %d\n", returned < .00001); |
450 ret = returned < .00001 && ret; | 454 ret = returned < .00001 && ret; |
451 } | 455 } |
452 { | 456 { |
453 Int_LongLong t = { -17, 822LL }; | 457 Int_LongLong t = { -17, 822LL }; |
454 int returned; | 458 int returned; |
467 dcArgAggr(vm, s, &t); | 471 dcArgAggr(vm, s, &t); |
468 returned = dcCallInt(vm, (DCpointer) &fun_take_iiiii_il); | 472 returned = dcCallInt(vm, (DCpointer) &fun_take_iiiii_il); |
469 | 473 |
470 dcFreeAggr(s); | 474 dcFreeAggr(s); |
471 | 475 |
472 printf("iiiii{il} (cdecl): %d\n", returned == -18528); | 476 printf("iiiii{il})i (cdecl): %d\n", returned == -18528); |
473 ret = returned == -18528 && ret; | 477 ret = returned == -18528 && ret; |
474 } | 478 } |
475 { | 479 { |
476 More_Than_Regs t = { 1., 2., 3., 4, 5, 6, 7., 8., 9., 10.f, 11, 12.f, 13., 14, 15, 16, 17, 18 }; | 480 More_Than_Regs t = { 1., 2., 3., 4, 5, 6, 7., 8., 9., 10.f, 11, 12.f, 13., 14, 15, 16, 17, 18 }; |
477 double returned; | 481 double returned; |
501 dcArgAggr(vm, s, &t); | 505 dcArgAggr(vm, s, &t); |
502 returned = dcCallDouble(vm, (DCpointer) &fun_take_more_than_regs); | 506 returned = dcCallDouble(vm, (DCpointer) &fun_take_more_than_regs); |
503 | 507 |
504 dcFreeAggr(s); | 508 dcFreeAggr(s); |
505 | 509 |
506 printf("{dddlccdddfifdsjiIl} (cdecl): %d\n", returned == 171.); | 510 printf("{dddlccdddfifdsjiIl})d (cdecl): %d\n", returned == 171.); |
507 ret = returned == 171. && ret; | 511 ret = returned == 171. && ret; |
512 } | |
513 { | |
514 /* w/ some prev params, so not fitting into float regs anymore (on win and sysv) */ | |
515 Three_Double t = { 1.4, 3.6, 4.7 }; | |
516 double returned; | |
517 | |
518 DCaggr *s = dcNewAggr(3, sizeof(t)); | |
519 dcAggrField(s, DC_SIGCHAR_DOUBLE, offsetof(Three_Double, a), 1); | |
520 dcAggrField(s, DC_SIGCHAR_DOUBLE, offsetof(Three_Double, b), 1); | |
521 dcAggrField(s, DC_SIGCHAR_DOUBLE, offsetof(Three_Double, c), 1); | |
522 dcCloseAggr(s); | |
523 | |
524 dcReset(vm); | |
525 dcMode(vm,DC_CALL_C_ELLIPSIS); | |
526 dcArgDouble(vm, 234.6); | |
527 dcArgFloat(vm, 29.4f); | |
528 dcArgFloat(vm, 5.0f); | |
529 dcArgInt(vm, -11); | |
530 dcMode(vm,DC_CALL_C_ELLIPSIS_VARARGS); | |
531 dcArgDouble(vm, -83.9f); | |
532 dcArgDouble(vm, -.9); | |
533 dcArgDouble(vm, .6f); | |
534 dcArgAggr(vm, s, &t); | |
535 returned = dcCallDouble(vm, (DCpointer) &fun_take_mixed_fp_vararg) + 65.7; | |
536 if(returned < 0.) | |
537 returned = -returned; | |
538 | |
539 dcFreeAggr(s); | |
540 | |
541 printf("dffi.fdf{fff})d (cdecl): %d\n", returned < .00001); | |
542 ret = returned < .00001 && ret; | |
543 } | |
544 { | |
545 Int_LongLong t = { 71, -1177LL }; | |
546 int returned; | |
547 | |
548 DCaggr *s = dcNewAggr(2, sizeof(t)); | |
549 dcAggrField(s, DC_SIGCHAR_INT, offsetof(Int_LongLong, a), 1); | |
550 dcAggrField(s, DC_SIGCHAR_LONGLONG, offsetof(Int_LongLong, b), 1); | |
551 dcCloseAggr(s); | |
552 | |
553 dcReset(vm); | |
554 dcMode(vm,DC_CALL_C_ELLIPSIS); | |
555 dcArgInt(vm, 31); | |
556 dcArgInt(vm, -123); | |
557 dcArgInt(vm, 108); | |
558 dcArgInt(vm, 133); | |
559 dcArgInt(vm, -17933); | |
560 dcMode(vm,DC_CALL_C_ELLIPSIS_VARARGS); | |
561 dcArgAggr(vm, s, &t); | |
562 returned = dcCallInt(vm, (DCpointer) &fun_take_iiiii_il_vararg); | |
563 | |
564 dcFreeAggr(s); | |
565 | |
566 printf("iiiii.{il})i (cdecl): %d\n", returned == -18890); | |
567 ret = returned == -18890 && ret; | |
568 } | |
569 { | |
570 Int_NestedDouble t0 = { -64, { -6.6} }; | |
571 Int_NestedFloat t1 = { 112, { 7.5f } }; | |
572 int returned; | |
573 | |
574 DCaggr *s0_ = dcNewAggr(1, sizeof(NestedDouble)); | |
575 dcAggrField(s0_, DC_SIGCHAR_DOUBLE, offsetof(NestedDouble, f), 1); | |
576 dcCloseAggr(s0_); | |
577 | |
578 DCaggr *s0 = dcNewAggr(2, sizeof(t0)); | |
579 dcAggrField(s0, DC_SIGCHAR_INT, offsetof(Int_NestedDouble, a), 1); | |
580 dcAggrField(s0, DC_SIGCHAR_AGGREGATE, offsetof(Int_NestedDouble, b), 1, s0_); | |
581 dcCloseAggr(s0); | |
582 | |
583 DCaggr *s1_ = dcNewAggr(1, sizeof(NestedFloat)); | |
584 dcAggrField(s1_, DC_SIGCHAR_FLOAT, offsetof(NestedFloat, f), 1); | |
585 dcCloseAggr(s1_); | |
586 | |
587 DCaggr *s1 = dcNewAggr(2, sizeof(t1)); | |
588 dcAggrField(s1, DC_SIGCHAR_INT, offsetof(Int_NestedFloat, a), 1); | |
589 dcAggrField(s1, DC_SIGCHAR_AGGREGATE, offsetof(Int_NestedFloat, b), 1, s1_); | |
590 dcCloseAggr(s1); | |
591 | |
592 dcReset(vm); | |
593 dcMode(vm,DC_CALL_C_ELLIPSIS); | |
594 dcArgAggr(vm, s0, &t0); | |
595 dcMode(vm,DC_CALL_C_ELLIPSIS_VARARGS); | |
596 dcArgAggr(vm, s1, &t1); | |
597 returned = dcCallDouble(vm, (DCpointer) &fun_take_aggrs_vararg) - 48.9; | |
598 | |
599 dcFreeAggr(s0_); | |
600 dcFreeAggr(s0); | |
601 dcFreeAggr(s1_); | |
602 dcFreeAggr(s1); | |
603 | |
604 printf("{i{d}}.{i{f}})d (cdecl): %d\n", returned < .00001); | |
605 ret = returned < .00001 && ret; | |
508 } | 606 } |
509 | 607 |
510 dcFree(vm); | 608 dcFree(vm); |
511 | 609 |
512 return ret; | 610 return ret; |