Mercurial > pub > dyncall > dyncall
comparison test/suite_aggrs/main.c @ 461:236015fdf7a8
suite_aggrs:
- added support to gen unions in addition to structs
- regenerated struct/union-mixed and nested cases
- made rand-sig.lua ignore closing struct/union chars if not opened, effectively reducing number of empty aggregates as it now generated way too much
author | Tassilo Philipp |
---|---|
date | Mon, 31 Jan 2022 14:41:11 +0100 |
parents | 0ae555528709 |
children | 653b65580cb4 |
comparison
equal
deleted
inserted
replaced
460:0ae555528709 | 461:236015fdf7a8 |
---|---|
59 | 59 |
60 clear_V(); | 60 clear_V(); |
61 | 61 |
62 dcReset(p); | 62 dcReset(p); |
63 | 63 |
64 if(*sig == '{') { | 64 if(*sig == '{' || *sig == '<') { |
65 int len; | 65 int len; |
66 int i = find_agg_idx(&len, sig); | 66 int i = find_agg_idx(&len, sig); |
67 if(i == -1) { | 67 if(i == -1) { |
68 printf("unknown rtype sig at '%s' ;", sig); | 68 printf("unknown rtype sig at '%s' ;", sig); |
69 return 0; | 69 return 0; |
90 case 'j': dcArgLong (p,K_j[pos]); break; | 90 case 'j': dcArgLong (p,K_j[pos]); break; |
91 case 'l': dcArgLongLong(p,K_l[pos]); break; | 91 case 'l': dcArgLongLong(p,K_l[pos]); break; |
92 case 'p': dcArgPointer (p,K_p[pos]); break; | 92 case 'p': dcArgPointer (p,K_p[pos]); break; |
93 case 'f': dcArgFloat (p,K_f[pos]); break; | 93 case 'f': dcArgFloat (p,K_f[pos]); break; |
94 case 'd': dcArgDouble (p,K_d[pos]); break; | 94 case 'd': dcArgDouble (p,K_d[pos]); break; |
95 case '{': { | 95 case '<': /* union */ |
96 /* find struct sig */ | 96 case '{': /* struct */ |
97 { | |
98 /* find aggregate sig */ | |
97 int len; | 99 int len; |
98 DCstruct *st; | 100 DCstruct *st; |
99 int i = find_agg_idx(&len, sig); | 101 int i = find_agg_idx(&len, sig); |
100 if(i == -1) { | 102 if(i == -1) { |
101 printf("unknown sig at '%s' ;", sig); | 103 printf("unknown sig at '%s' ;", sig); |
120 case 'j': s = (dcCallLong (p,t) == K_j[pos]) ; break; | 122 case 'j': s = (dcCallLong (p,t) == K_j[pos]) ; break; |
121 case 'l': s = (dcCallLongLong(p,t) == K_l[pos]) ; break; | 123 case 'l': s = (dcCallLongLong(p,t) == K_l[pos]) ; break; |
122 case 'p': s = (dcCallPointer (p,t) == K_p[pos]) ; break; | 124 case 'p': s = (dcCallPointer (p,t) == K_p[pos]) ; break; |
123 case 'f': s = (dcCallFloat (p,t) == K_f[pos]) ; break; | 125 case 'f': s = (dcCallFloat (p,t) == K_f[pos]) ; break; |
124 case 'd': s = (dcCallDouble (p,t) == K_d[pos]) ; break; | 126 case 'd': s = (dcCallDouble (p,t) == K_d[pos]) ; break; |
125 case '{': { | 127 case '<': /* union */ |
126 /* bound check memory adjacent to returned struct, to check for overflows by dcCallStruct */ | 128 case '{': /* struct */ |
129 { | |
130 /* bound check memory adjacent to returned aggregate, to check for overflows by dcCallStruct */ | |
127 long long* adj_ll = (get_max_aggr_size() - rtype_size) > sizeof(long long) ? (long long*)((char*)V_a[0] + rtype_size) : NULL; | 131 long long* adj_ll = (get_max_aggr_size() - rtype_size) > sizeof(long long) ? (long long*)((char*)V_a[0] + rtype_size) : NULL; |
128 if(adj_ll) | 132 if(adj_ll) |
129 *adj_ll = 0x0123456789abcdef; | 133 *adj_ll = 0x0123456789abcdef; |
130 | 134 |
131 s = ((int(*)(const void*,const void*))rtype_st_cmp)(dcCallStruct(p, t, rtype_st, V_a[0]), K_a[pos]); | 135 s = ((int(*)(const void*,const void*))rtype_st_cmp)(dcCallStruct(p, t, rtype_st, V_a[0]), K_a[pos]); |
152 case 'j': s = ( V_j[pos] == K_j[pos] ); if (!s) printf("'j':%d: %ld != %ld ; ", pos, V_j[pos], K_j[pos]); break; | 156 case 'j': s = ( V_j[pos] == K_j[pos] ); if (!s) printf("'j':%d: %ld != %ld ; ", pos, V_j[pos], K_j[pos]); break; |
153 case 'l': s = ( V_l[pos] == K_l[pos] ); if (!s) printf("'l':%d: %lld != %lld ; ", pos, V_l[pos], K_l[pos]); break; | 157 case 'l': s = ( V_l[pos] == K_l[pos] ); if (!s) printf("'l':%d: %lld != %lld ; ", pos, V_l[pos], K_l[pos]); break; |
154 case 'p': s = ( V_p[pos] == K_p[pos] ); if (!s) printf("'p':%d: %p != %p ; ", pos, V_p[pos], K_p[pos]); break; | 158 case 'p': s = ( V_p[pos] == K_p[pos] ); if (!s) printf("'p':%d: %p != %p ; ", pos, V_p[pos], K_p[pos]); break; |
155 case 'f': s = ( V_f[pos] == K_f[pos] ); if (!s) printf("'f':%d: %f != %f ; ", pos, V_f[pos], K_f[pos]); break; | 159 case 'f': s = ( V_f[pos] == K_f[pos] ); if (!s) printf("'f':%d: %f != %f ; ", pos, V_f[pos], K_f[pos]); break; |
156 case 'd': s = ( V_d[pos] == K_d[pos] ); if (!s) printf("'d':%d: %f != %f ; ", pos, V_d[pos], K_d[pos]); break; | 160 case 'd': s = ( V_d[pos] == K_d[pos] ); if (!s) printf("'d':%d: %f != %f ; ", pos, V_d[pos], K_d[pos]); break; |
157 case '{': { | 161 case '<': /* union */ |
162 case '{': /* struct */ | |
163 { | |
158 /* no check: guaranteed to exist, or invoke func would've exited when passing args, above */ | 164 /* no check: guaranteed to exist, or invoke func would've exited when passing args, above */ |
159 int len; | 165 int len; |
160 int i = find_agg_idx(&len, sig); | 166 int i = find_agg_idx(&len, sig); |
161 s = ((int(*)(const void*,const void*))G_agg_cmpfuncs[i])(V_a[pos], K_a[pos]); | 167 s = ((int(*)(const void*,const void*))G_agg_cmpfuncs[i])(V_a[pos], K_a[pos]); |
162 if (!s) printf("'{':%d: *%p != *%p ; ", pos, V_a[pos], K_a[pos]); | 168 if (!s) printf("'%c':%d: *%p != *%p ; ", atype, pos, V_a[pos], K_a[pos]); |
163 sig += len-1; /* advance to next arg char */ | 169 sig += len-1; /* advance to next arg char */ |
164 break; | 170 break; |
165 } | 171 } |
166 default: printf("unknown atype '%c' ; ", atype); return 0; | 172 default: printf("unknown atype '%c' ; ", atype); return 0; |
167 } | 173 } |
215 dcFreeStruct(((DCstruct*(*)())G_agg_touchdcstfuncs[i])()); | 221 dcFreeStruct(((DCstruct*(*)())G_agg_touchdcstfuncs[i])()); |
216 | 222 |
217 dcFree(G_callvm); | 223 dcFree(G_callvm); |
218 deinit_test_data(G_maxargs); | 224 deinit_test_data(G_maxargs); |
219 | 225 |
220 printf("result: suite_aggrs: %d\n", total); | 226 printf("result: suite_aggrs: %d %d\n", total, get_max_aggr_size()); |
221 | 227 |
222 dcTest_deInitPlatform(); | 228 dcTest_deInitPlatform(); |
223 | 229 |
224 return !total; | 230 return !total; |
225 } | 231 } |