diff test/suite_aggrs/main.c @ 433:45662241d9cd

suite_aggrs now handling struct by value return types, also still missing: nesting, unions, arrays note: this doesn't compile against this same checked in revision of dyncall, but only my working copy; a future checkin will catch up
author Tassilo Philipp
date Sat, 22 Jan 2022 16:07:57 +0100
parents 167faab0c0be
children 3d2c5d156d78
line wrap: on
line diff
--- a/test/suite_aggrs/main.c	Fri Jan 21 15:42:29 2022 +0100
+++ b/test/suite_aggrs/main.c	Sat Jan 22 16:07:57 2022 +0100
@@ -48,16 +48,37 @@
 {
   DCCallVM   * p = (DCCallVM*) G_callvm;
   char const * sig = signature;
+  char const * sig_args;
   char         rtype;
+  DCstruct *   rtype_st = NULL;
+  funptr       rtype_st_cmp = NULL;
   char         atype;
   int          pos = 0;
   int          s = 0;
 
   clear_V();
-  
-  rtype = *sig++;
+
   dcReset(p);
 
+  if(*sig == '{') {
+    int len;
+    int i = find_agg_idx(&len, sig);
+    if(i == -1) {
+      printf("unknown rtype sig at '%s' ;", sig);
+      return 0;
+    }
+    rtype = *sig;
+    sig += len;
+
+	rtype_st_cmp = G_agg_cmpfuncs[i];
+    rtype_st = ((DCstruct*(*)())G_agg_newdcstfuncs[i])();
+    dcBeginCallStruct(p, rtype_st, DC_FALSE);
+  }
+  else
+    rtype = *sig++;
+
+  sig_args = sig;
+
   while ( (atype = *sig) != '\0') {
     pos++;
     switch(atype) {
@@ -70,21 +91,21 @@
       case 'f': dcArgFloat   (p,K_f[pos]); break;
       case 'd': dcArgDouble  (p,K_d[pos]); break;
       case '{': {
-	    /* find struct sig */
-		int len;
-		int i = find_agg_idx(&len, sig);
+        /* find struct sig */
+        int len;
+        int i = find_agg_idx(&len, sig);
         if(i == -1) {
-		  printf("unknown sig at '%s' ;", sig);
-		  return 0;
-		}
-		DCstruct *st = ((DCstruct*(*)())G_agg_newdcstfuncs[i])();
-		dcArgStruct(p, st, K_a[pos]);
-		sig += len-1; /* advance to next arg char */
-		break;
+          printf("unknown sig at '%s' ;", sig);
+          return 0;
+        }
+        DCstruct *st = ((DCstruct*(*)())G_agg_newdcstfuncs[i])();
+        dcArgStruct(p, st, K_a[pos]);
+        sig += len-1; /* advance to next arg char */
+        break;
       }
       default: printf("unknown atype '%c' (1) ;", atype); return 0;
     }
-	++sig;
+    ++sig;
   }
   
   switch(rtype) 
@@ -98,40 +119,44 @@
     case 'p': s = (dcCallPointer (p,t) == K_p[pos]) ; break;
     case 'f': s = (dcCallFloat   (p,t) == K_f[pos]) ; break;
     case 'd': s = (dcCallDouble  (p,t) == K_d[pos]) ; break;
-    //@@@ handle return types case '{': @@@ ; break;
+    case '{': {
+      s = ((int(*)())rtype_st_cmp)(dcCallStruct(p,t,rtype_st, V_a[pos]), K_a[pos]);
+	  break;
+	}
     default: printf("unknown rtype '%c'", rtype); return 0;
   }
 
   if (!s) { printf("rval wrong;"); return 0; }
-  /* test: */
-  sig = signature+1;
+
+  /* test V_* array against values passed to func: */
+  sig = sig_args;
   pos = 1;
   while ( (atype = *sig) != '\0') {
     switch(atype) {
-      case 'c': s = ( V_c[pos] == K_c[pos] ); if (!s) printf("'c':%d: %d != %d ; ", pos, V_c[pos], K_c[pos]); break;
-      case 's': s = ( V_s[pos] == K_s[pos] ); if (!s) printf("'s':%d: %d != %d ; ", pos, V_s[pos], K_s[pos]); break;
-      case 'i': s = ( V_i[pos] == K_i[pos] ); if (!s) printf("'i':%d: %d != %d ; ", pos, V_i[pos], K_i[pos]); break;
-      case 'j': s = ( V_j[pos] == K_j[pos] ); if (!s) printf("'j':%d: %ld != %ld ; ", pos, V_j[pos], K_j[pos]); break;
+      case 'c': s = ( V_c[pos] == K_c[pos] ); if (!s) printf("'c':%d: %d != %d ; ",     pos, V_c[pos], K_c[pos]); break;
+      case 's': s = ( V_s[pos] == K_s[pos] ); if (!s) printf("'s':%d: %d != %d ; ",     pos, V_s[pos], K_s[pos]); break;
+      case 'i': s = ( V_i[pos] == K_i[pos] ); if (!s) printf("'i':%d: %d != %d ; ",     pos, V_i[pos], K_i[pos]); break;
+      case 'j': s = ( V_j[pos] == K_j[pos] ); if (!s) printf("'j':%d: %ld != %ld ; ",   pos, V_j[pos], K_j[pos]); break;
       case 'l': s = ( V_l[pos] == K_l[pos] ); if (!s) printf("'l':%d: %lld != %lld ; ", pos, V_l[pos], K_l[pos]); break;
-      case 'p': s = ( V_p[pos] == K_p[pos] ); if (!s) printf("'p':%d: %lld != %lld ; ", pos, (long long) V_p[pos], (long long) K_p[pos]); break;
-      case 'f': s = ( V_f[pos] == K_f[pos] ); if (!s) printf("'f':%d: %f != %f ; ", pos, V_f[pos], K_f[pos]); break;
-      case 'd': s = ( V_d[pos] == K_d[pos] ); if (!s) printf("'d':%d: %f != %f ; ", pos, V_d[pos], K_d[pos]); break;
+      case 'p': s = ( V_p[pos] == K_p[pos] ); if (!s) printf("'p':%d: %p != %p ; ",     pos, V_p[pos], K_p[pos]); break;
+      case 'f': s = ( V_f[pos] == K_f[pos] ); if (!s) printf("'f':%d: %f != %f ; ",     pos, V_f[pos], K_f[pos]); break;
+      case 'd': s = ( V_d[pos] == K_d[pos] ); if (!s) printf("'d':%d: %f != %f ; ",     pos, V_d[pos], K_d[pos]); break;
       case '{': {
-	    /* no check: guaranteed to exist, or invoke func would've exited when passing args, above */
-		int len;
-		int i = find_agg_idx(&len, sig);
-		s = ((int(*)())G_agg_cmpfuncs[i])(V_a[pos], K_a[pos]);
-		if (!s) printf("'{':%d:  %lld != %lld ; ", pos, (long long) V_a[pos], (long long) K_a[pos]);
-		sig += len-1; /* advance to next arg char */
-		break;
-	  }
+        /* no check: guaranteed to exist, or invoke func would've exited when passing args, above */
+        int len;
+        int i = find_agg_idx(&len, sig);
+        s = ((int(*)())G_agg_cmpfuncs[i])(V_a[pos], K_a[pos]);
+        if (!s) printf("'{':%d:  *%p != *%p ; ", pos, V_a[pos], K_a[pos]);
+        sig += len-1; /* advance to next arg char */
+        break;
+      }
       default: printf("unknown atype '%c' ; ", atype); return 0;
     }
     if (!s) {
       printf("arg mismatch at %d ; ", pos);
       return 0;
     }
-	++sig;
+    ++sig;
     ++pos;
   }
   return 1;