Mercurial > pub > dyncall > dyncall
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;