changeset 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 667fe7b2be62
children cb2cbb6453e5
files test/plain/test_aggrs.c test/plain/test_main.c
diffstat 2 files changed, 138 insertions(+), 40 deletions(-) [+]
line wrap: on
line diff
--- a/test/plain/test_aggrs.c	Fri Oct 28 14:03:33 2022 +0200
+++ b/test/plain/test_aggrs.c	Fri Oct 28 15:08:21 2022 +0200
@@ -29,6 +29,7 @@
 #include "../../dyncall/dyncall_signature.h"
 #include "../../dyncall/dyncall_aggregate.h"
 #include <stdio.h>
+#include <stdarg.h>
 
 
 #if defined(DC__Feature_AggrByVal)
@@ -138,7 +139,7 @@
 
 		dcFreeAggr(s);
 
-		printf("r:{C}  (cdecl): %d\n", (returned.a == expected.a));
+		printf("C){C}  (cdecl): %d\n", (returned.a == expected.a));
 		ret = returned.a == expected.a && ret;
 	}
 	{
@@ -159,7 +160,7 @@
 
 		dcFreeAggr(s);
 
-		printf("r:{Cd}  (cdecl): %d\n", (returned.a == expected.a && returned.b == expected.b));
+		printf("Cd){Cd}  (cdecl): %d\n", (returned.a == expected.a && returned.b == expected.b));
 		ret = returned.a == expected.a && returned.b == expected.b && ret;
 	}
 	{
@@ -180,7 +181,7 @@
 
 		dcFreeAggr(s);
 
-		printf("r:{dC}  (cdecl): %d\n", (returned.a == expected.a && returned.b == expected.b));
+		printf("dC){dC}  (cdecl): %d\n", (returned.a == expected.a && returned.b == expected.b));
 		ret = returned.a == expected.a && returned.b == expected.b && ret;
 	}
 	{
@@ -206,7 +207,7 @@
 		dcFreeAggr(s_);
 		dcFreeAggr(s);
 
-		printf("r:{i{f}}  (cdecl): %d\n", (returned.a == expected.a && returned.b.f == expected.b.f));
+		printf("if){i{f}}  (cdecl): %d\n", (returned.a == expected.a && returned.b.f == expected.b.f));
 		ret = returned.a == expected.a && returned.b.f == expected.b.f && ret;
 	}
 	{
@@ -232,7 +233,7 @@
 		dcFreeAggr(s_);
 		dcFreeAggr(s);
 
-		printf("r:{i{d}}  (cdecl): %d\n", (returned.a == expected.a && returned.b.f == expected.b.f));
+		printf("id){i{d}}  (cdecl): %d\n", (returned.a == expected.a && returned.b.f == expected.b.f));
 		ret = returned.a == expected.a && returned.b.f == expected.b.f && ret;
 	}
 	{
@@ -255,7 +256,7 @@
 
 		dcFreeAggr(s);
 
-		printf("r:{ddd}  (cdecl): %d\n", (returned.a == expected.a && returned.b == expected.b && returned.c == expected.c));
+		printf("ddd){ddd}  (cdecl): %d\n", (returned.a == expected.a && returned.b == expected.b && returned.c == expected.c));
 		ret = returned.a == expected.a && returned.b == expected.b && returned.c == expected.c && ret;
 	}
 
@@ -274,6 +275,9 @@
 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; }
 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; }
 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; }
+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; }
+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; }
+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; }
 
 
 int testAggrParameters()
@@ -296,7 +300,7 @@
 
 		dcFreeAggr(s);
 
-		printf("{C}  (cdecl): %d\n", returned == t.a);
+		printf("{C})d  (cdecl): %d\n", returned == t.a);
 		ret = returned == t.a && ret;
 	}
 	{
@@ -314,7 +318,7 @@
 
 		dcFreeAggr(s);
 
-		printf("{Cd}  (cdecl): %d\n", returned == t.a + t.b);
+		printf("{Cd})d  (cdecl): %d\n", returned == t.a + t.b);
 		ret = returned == t.a + t.b && ret;
 	}
 	{
@@ -332,7 +336,7 @@
 
 		dcFreeAggr(s);
 
-		printf("{ff}  (cdecl): %d\n", returned == t.a + t.b);
+		printf("{ff})d  (cdecl): %d\n", returned == t.a + t.b);
 		ret = returned == t.a + t.b && ret;
 	}
 	{
@@ -350,7 +354,7 @@
 
 		dcFreeAggr(s);
 
-		printf("{dC}  (cdecl): %d\n", returned == t.a + t.b);
+		printf("{dC})d  (cdecl): %d\n", returned == t.a + t.b);
 		ret = returned == t.a + t.b && ret;
 	}
 	{
@@ -374,7 +378,7 @@
 		dcFreeAggr(s_);
 		dcFreeAggr(s);
 
-		printf("{i{f}}  (cdecl): %d\n", returned == t.a + t.b.f);
+		printf("{i{f}})d  (cdecl): %d\n", returned == t.a + t.b.f);
 		ret = returned == t.a + t.b.f && ret;
 	}
 	{
@@ -398,7 +402,7 @@
 		dcFreeAggr(s_);
 		dcFreeAggr(s);
 
-		printf("{i{d}}  (cdecl): %d\n", returned == t.a + t.b.f);
+		printf("{i{d}})d  (cdecl): %d\n", returned == t.a + t.b.f);
 		ret = returned == t.a + t.b.f && ret;
 	}
 	{
@@ -417,7 +421,7 @@
 
 		dcFreeAggr(s);
 
-		printf("{fff}  (cdecl): %d\n", returned == t.a + t.b + t.c);
+		printf("{fff})d  (cdecl): %d\n", returned == t.a + t.b + t.c);
 		ret = returned == t.a + t.b + t.c && ret;
 	}
 	{
@@ -446,7 +450,7 @@
 
 		dcFreeAggr(s);
 
-		printf("dffifdf{fff}  (cdecl): %d\n", returned < .00001);
+		printf("dffifdf{fff})d  (cdecl): %d\n", returned < .00001);
 		ret = returned < .00001 && ret;
 	}
 	{
@@ -469,7 +473,7 @@
 
 		dcFreeAggr(s);
 
-		printf("iiiii{il}  (cdecl): %d\n", returned == -18528);
+		printf("iiiii{il})i  (cdecl): %d\n", returned == -18528);
 		ret = returned == -18528 && ret;
 	}
 	{
@@ -503,9 +507,103 @@
 
 		dcFreeAggr(s);
 
-		printf("{dddlccdddfifdsjiIl}  (cdecl): %d\n", returned == 171.);
+		printf("{dddlccdddfifdsjiIl})d  (cdecl): %d\n", returned == 171.);
 		ret = returned == 171. && ret;
 	}
+	{
+		/* w/ some prev params, so not fitting into float regs anymore (on win and sysv) */
+		Three_Double t = { 1.4, 3.6, 4.7 };
+		double returned;
+
+		DCaggr *s = dcNewAggr(3, sizeof(t));
+		dcAggrField(s, DC_SIGCHAR_DOUBLE, offsetof(Three_Double, a), 1);
+		dcAggrField(s, DC_SIGCHAR_DOUBLE, offsetof(Three_Double, b), 1);
+		dcAggrField(s, DC_SIGCHAR_DOUBLE, offsetof(Three_Double, c), 1);
+		dcCloseAggr(s);
+
+		dcReset(vm);
+		dcMode(vm,DC_CALL_C_ELLIPSIS);
+		dcArgDouble(vm, 234.6);
+		dcArgFloat(vm, 29.4f);
+		dcArgFloat(vm, 5.0f);
+		dcArgInt(vm, -11);
+		dcMode(vm,DC_CALL_C_ELLIPSIS_VARARGS);
+		dcArgDouble(vm, -83.9f);
+		dcArgDouble(vm, -.9);
+		dcArgDouble(vm, .6f);
+		dcArgAggr(vm, s, &t);
+		returned = dcCallDouble(vm, (DCpointer) &fun_take_mixed_fp_vararg) + 65.7;
+		if(returned < 0.)
+			returned = -returned;
+
+		dcFreeAggr(s);
+
+		printf("dffi.fdf{fff})d  (cdecl): %d\n", returned < .00001);
+		ret = returned < .00001 && ret;
+	}
+	{
+		Int_LongLong t = { 71, -1177LL };
+		int returned;
+
+		DCaggr *s = dcNewAggr(2, sizeof(t));
+		dcAggrField(s, DC_SIGCHAR_INT,      offsetof(Int_LongLong, a), 1);
+		dcAggrField(s, DC_SIGCHAR_LONGLONG, offsetof(Int_LongLong, b), 1);
+		dcCloseAggr(s);
+
+		dcReset(vm);
+		dcMode(vm,DC_CALL_C_ELLIPSIS);
+		dcArgInt(vm, 31);
+		dcArgInt(vm, -123);
+		dcArgInt(vm, 108);
+		dcArgInt(vm, 133);
+		dcArgInt(vm, -17933);
+		dcMode(vm,DC_CALL_C_ELLIPSIS_VARARGS);
+		dcArgAggr(vm, s, &t);
+		returned = dcCallInt(vm, (DCpointer) &fun_take_iiiii_il_vararg);
+
+		dcFreeAggr(s);
+
+		printf("iiiii.{il})i  (cdecl): %d\n", returned == -18890);
+		ret = returned == -18890 && ret;
+	}
+	{
+		Int_NestedDouble t0 = { -64, { -6.6} };
+		Int_NestedFloat t1 = { 112, { 7.5f } };
+		int returned;
+
+		DCaggr *s0_ = dcNewAggr(1, sizeof(NestedDouble));
+		dcAggrField(s0_, DC_SIGCHAR_DOUBLE, offsetof(NestedDouble, f), 1);
+		dcCloseAggr(s0_);
+
+		DCaggr *s0 = dcNewAggr(2, sizeof(t0));
+		dcAggrField(s0, DC_SIGCHAR_INT, offsetof(Int_NestedDouble, a), 1);
+		dcAggrField(s0, DC_SIGCHAR_AGGREGATE, offsetof(Int_NestedDouble, b), 1, s0_);
+		dcCloseAggr(s0);
+
+		DCaggr *s1_ = dcNewAggr(1, sizeof(NestedFloat));
+		dcAggrField(s1_, DC_SIGCHAR_FLOAT, offsetof(NestedFloat, f), 1);
+		dcCloseAggr(s1_);
+
+		DCaggr *s1 = dcNewAggr(2, sizeof(t1));
+		dcAggrField(s1, DC_SIGCHAR_INT, offsetof(Int_NestedFloat, a), 1);
+		dcAggrField(s1, DC_SIGCHAR_AGGREGATE, offsetof(Int_NestedFloat, b), 1, s1_);
+		dcCloseAggr(s1);
+
+		dcReset(vm);
+		dcMode(vm,DC_CALL_C_ELLIPSIS);
+		dcArgAggr(vm, s0, &t0);
+		dcMode(vm,DC_CALL_C_ELLIPSIS_VARARGS);
+		dcArgAggr(vm, s1, &t1);
+		returned = dcCallDouble(vm, (DCpointer) &fun_take_aggrs_vararg) - 48.9;
+
+		dcFreeAggr(s0_);
+		dcFreeAggr(s0);
+		dcFreeAggr(s1_);
+		dcFreeAggr(s1);
+
+		printf("{i{d}}.{i{f}})d  (cdecl): %d\n", returned < .00001);
+		ret = returned < .00001 && ret;
+	}
 
 	dcFree(vm);
 
--- a/test/plain/test_main.c	Fri Oct 28 14:03:33 2022 +0200
+++ b/test/plain/test_main.c	Fri Oct 28 15:08:21 2022 +0200
@@ -71,14 +71,14 @@
     dcReset(pc);
     dcArgBool(pc, val);
     r = dcCallBool(pc, (DCpointer) &fun_c_b);
-    printf("bt (cdecl): %d\n", (r == val));
+    printf("b)b == t (cdecl): %d\n", (r == val));
     ret = (r == val) && ret;
 
     val=DC_FALSE;
     dcReset(pc);
     dcArgBool(pc, val);
     r = dcCallBool(pc, (DCpointer) &fun_c_b);
-    printf("bf (cdecl): %d\n", (r == val));
+    printf("b)b == f (cdecl): %d\n", (r == val));
     ret = (r == val) && ret;
   }
   /* int */
@@ -87,7 +87,7 @@
     dcReset(pc);
     dcArgInt(pc, val);
     r = dcCallInt(pc, (DCpointer) &fun_c_i);
-    printf("i  (cdecl): %d\n", (r == val));
+    printf("i)i  (cdecl): %d\n", (r == val));
     ret = (r == val) && ret;
   }
   /* long */
@@ -96,7 +96,7 @@
     dcReset(pc);
     dcArgLong(pc, val);
     r = dcCallLong(pc, (DCpointer) &fun_c_j);
-    printf("l  (cdecl): %d\n", (r == val));
+    printf("j)j  (cdecl): %d\n", (r == val));
     ret = (r == val) && ret;
   }
   /* long long */
@@ -105,7 +105,7 @@
     dcReset(pc);
     dcArgLongLong(pc, val);
     r = dcCallLongLong(pc, (DCpointer) &fun_c_l);
-    printf("ll (cdecl): %d\n", (r == (DClonglong)val));
+    printf("l)l (cdecl): %d\n", (r == (DClonglong)val));
     ret = (r == (DClonglong)val) && ret;
   }
   /* float */
@@ -114,7 +114,7 @@
     dcReset(pc);
     dcArgFloat(pc, val);
     r = dcCallFloat(pc, (DCpointer) &fun_c_f);
-    printf("f  (cdecl): %d\n", (r == val));
+    printf("f)f  (cdecl): %d\n", (r == val));
     ret = (r == val) && ret;
   }
   /* double */
@@ -123,7 +123,7 @@
     dcReset(pc);
     dcArgDouble(pc, val);
     r = dcCallDouble(pc, (DCpointer) &fun_c_d);
-    printf("d  (cdecl): %d\n", (r == val));
+    printf("d)d  (cdecl): %d\n", (r == val));
     ret = (r == val) && ret;
   }
   /* ptr */
@@ -132,7 +132,7 @@
     dcReset(pc);
     dcArgPointer(pc, (DCpointer) &fun_c_b);
     r = dcCallPointer(pc, (DCpointer) &fun_c_p);
-    printf("p  (cdecl): %d\n", (r == (DCpointer) &fun_c_b));
+    printf("p)p  (cdecl): %d\n", (r == (DCpointer) &fun_c_b));
     ret = (r == (DCpointer) &fun_c_b) && ret;
   }
   dcFree(pc);
@@ -163,14 +163,14 @@
     dcReset(pc);
     dcArgBool(pc, val);
     r = dcCallBool(pc, (DCpointer) &fun_std_b);
-    printf("bt (stdcall): %d\n", (r == val));
+    printf("b)b == t (stdcall): %d\n", (r == val));
     ret = (r == val) && ret;
 
     val=DC_FALSE;
     dcReset(pc);
     dcArgBool(pc, val);
     r = dcCallBool(pc, (DCpointer) &fun_std_b);
-    printf("bf (stdcall): %d\n", (r == val));
+    printf("b)b == f (stdcall): %d\n", (r == val));
     ret = (r == val) && ret;
   }
   /* int */
@@ -179,7 +179,7 @@
     dcReset(pc);
     dcArgInt(pc, val);
     r = dcCallInt(pc, (DCpointer) &fun_std_i);
-    printf("i  (stdcall): %d\n", (r == val));
+    printf("i)i  (stdcall): %d\n", (r == val));
     ret = (r == val) && ret;
   }
   /* long */
@@ -188,7 +188,7 @@
     dcReset(pc);
     dcArgLong(pc, val);
     r = dcCallLong(pc, (DCpointer) &fun_std_j);
-    printf("l  (stdcall): %d\n", (r == val));
+    printf("j)j  (stdcall): %d\n", (r == val));
     ret = (r == val) && ret;
   }
   /* long long */
@@ -197,7 +197,7 @@
     dcReset(pc);
     dcArgLongLong(pc, val);
     r = dcCallLongLong(pc, (DCpointer) &fun_std_l);
-    printf("ll (stdcall): %d\n", (r == val));
+    printf("l)l (stdcall): %d\n", (r == val));
     ret = (r == val) && ret;
   }
   /* float */
@@ -206,7 +206,7 @@
     dcReset(pc);
     dcArgFloat(pc, val);
     r = dcCallFloat(pc, (DCpointer) &fun_std_f);
-    printf("f  (stdcall): %d\n", (r == val));
+    printf("f)f  (stdcall): %d\n", (r == val));
     ret = (r == val) && ret;
   }
   /* double */
@@ -215,7 +215,7 @@
     dcReset(pc);
     dcArgDouble(pc, val);
     r = dcCallDouble(pc, (DCpointer) &fun_std_d);
-    printf("d  (stdcall): %d\n", (r == val));
+    printf("d)d  (stdcall): %d\n", (r == val));
     ret = (r == val) && ret;
   }
   /* ptr */
@@ -224,7 +224,7 @@
     dcReset(pc);
     dcArgPointer(pc, (DCpointer) &fun_c_b);
     r = dcCallPointer(pc, (DCpointer) &fun_std_p);
-    printf("p  (stdcall): %d\n", (r == &fun_c_b));
+    printf("p)p  (stdcall): %d\n", (r == &fun_c_b));
     ret = (r == &fun_c_b) && ret;
   }
   dcFree(pc);
@@ -263,14 +263,14 @@
     dcReset(pc);
     dcArgBool(pc, val);
     r = dcCallBool(pc, (DCpointer) &fun_fast_b);
-    printf("bt ("FT"fastcall): %d\n", (r == val));
+    printf("b)b == t ("FT"fastcall): %d\n", (r == val));
     ret = (r == val) && ret;
 
     val=DC_FALSE;
     dcReset(pc);
     dcArgBool(pc, val);
     r = dcCallBool(pc, (DCpointer) &fun_fast_b);
-    printf("bf ("FT"fastcall): %d\n", (r == val));
+    printf("b)b == f ("FT"fastcall): %d\n", (r == val));
     ret = (r == val) && ret;
   }
   /* int */
@@ -279,7 +279,7 @@
     dcReset(pc);
     dcArgInt(pc, val);
     r = dcCallInt(pc, (DCpointer) &fun_fast_i);
-    printf("i  ("FT"fastcall): %d\n", (r == val));
+    printf("i)i  ("FT"fastcall): %d\n", (r == val));
     ret = (r == val) && ret;
   }
   /* long */
@@ -288,7 +288,7 @@
     dcReset(pc);
     dcArgLong(pc, val);
     r = dcCallLong(pc, (DCpointer) &fun_fast_j);
-    printf("l  ("FT"fastcall): %d\n", (r == val));
+    printf("j)j  ("FT"fastcall): %d\n", (r == val));
     ret = (r == val) && ret;
   }
   /* long long */
@@ -297,7 +297,7 @@
     dcReset(pc);
     dcArgLongLong(pc, val);
     r = dcCallLongLong(pc, (DCpointer) &fun_fast_l);
-    printf("ll ("FT"fastcall): %d\n", (r == val));
+    printf("l)l ("FT"fastcall): %d\n", (r == val));
     ret = (r == val) && ret;
   }
   /* float */
@@ -306,7 +306,7 @@
     dcReset(pc);
     dcArgFloat(pc, val);
     r = dcCallFloat(pc, (DCpointer) &fun_fast_f);
-    printf("f  ("FT"fastcall): %d\n", (r == val));
+    printf("f)f  ("FT"fastcall): %d\n", (r == val));
     ret = (r == val) && ret;
   }
   /* double */
@@ -315,7 +315,7 @@
     dcReset(pc);
     dcArgDouble(pc, val);
     r = dcCallDouble(pc, (DCpointer) &fun_fast_d);
-    printf("d  ("FT"fastcall): %d\n", (r == val));
+    printf("d)d  ("FT"fastcall): %d\n", (r == val));
     ret = (r == val) && ret;
   }
   /* ptr */
@@ -324,7 +324,7 @@
     dcReset(pc);
     dcArgPointer(pc, (DCpointer) &fun_c_b);
     r = dcCallPointer(pc, (DCpointer) &fun_fast_p);
-    printf("p  ("FT"fastcall): %d\n", (r == &fun_c_b));
+    printf("p)p  ("FT"fastcall): %d\n", (r == &fun_c_b));
     ret = (r == &fun_c_b) && ret;
   }
   dcFree(pc);