comparison 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
comparison
equal deleted inserted replaced
432:167faab0c0be 433:45662241d9cd
46 46
47 int invoke(char const* signature, void* t) 47 int invoke(char const* signature, void* t)
48 { 48 {
49 DCCallVM * p = (DCCallVM*) G_callvm; 49 DCCallVM * p = (DCCallVM*) G_callvm;
50 char const * sig = signature; 50 char const * sig = signature;
51 char const * sig_args;
51 char rtype; 52 char rtype;
53 DCstruct * rtype_st = NULL;
54 funptr rtype_st_cmp = NULL;
52 char atype; 55 char atype;
53 int pos = 0; 56 int pos = 0;
54 int s = 0; 57 int s = 0;
55 58
56 clear_V(); 59 clear_V();
57 60
58 rtype = *sig++;
59 dcReset(p); 61 dcReset(p);
62
63 if(*sig == '{') {
64 int len;
65 int i = find_agg_idx(&len, sig);
66 if(i == -1) {
67 printf("unknown rtype sig at '%s' ;", sig);
68 return 0;
69 }
70 rtype = *sig;
71 sig += len;
72
73 rtype_st_cmp = G_agg_cmpfuncs[i];
74 rtype_st = ((DCstruct*(*)())G_agg_newdcstfuncs[i])();
75 dcBeginCallStruct(p, rtype_st, DC_FALSE);
76 }
77 else
78 rtype = *sig++;
79
80 sig_args = sig;
60 81
61 while ( (atype = *sig) != '\0') { 82 while ( (atype = *sig) != '\0') {
62 pos++; 83 pos++;
63 switch(atype) { 84 switch(atype) {
64 case 'c': dcArgChar (p,K_c[pos]); break; 85 case 'c': dcArgChar (p,K_c[pos]); break;
68 case 'l': dcArgLongLong(p,K_l[pos]); break; 89 case 'l': dcArgLongLong(p,K_l[pos]); break;
69 case 'p': dcArgPointer (p,K_p[pos]); break; 90 case 'p': dcArgPointer (p,K_p[pos]); break;
70 case 'f': dcArgFloat (p,K_f[pos]); break; 91 case 'f': dcArgFloat (p,K_f[pos]); break;
71 case 'd': dcArgDouble (p,K_d[pos]); break; 92 case 'd': dcArgDouble (p,K_d[pos]); break;
72 case '{': { 93 case '{': {
73 /* find struct sig */ 94 /* find struct sig */
74 int len; 95 int len;
75 int i = find_agg_idx(&len, sig); 96 int i = find_agg_idx(&len, sig);
76 if(i == -1) { 97 if(i == -1) {
77 printf("unknown sig at '%s' ;", sig); 98 printf("unknown sig at '%s' ;", sig);
78 return 0; 99 return 0;
79 } 100 }
80 DCstruct *st = ((DCstruct*(*)())G_agg_newdcstfuncs[i])(); 101 DCstruct *st = ((DCstruct*(*)())G_agg_newdcstfuncs[i])();
81 dcArgStruct(p, st, K_a[pos]); 102 dcArgStruct(p, st, K_a[pos]);
82 sig += len-1; /* advance to next arg char */ 103 sig += len-1; /* advance to next arg char */
83 break; 104 break;
84 } 105 }
85 default: printf("unknown atype '%c' (1) ;", atype); return 0; 106 default: printf("unknown atype '%c' (1) ;", atype); return 0;
86 } 107 }
87 ++sig; 108 ++sig;
88 } 109 }
89 110
90 switch(rtype) 111 switch(rtype)
91 { 112 {
92 case 'v': dcCallVoid(p,t); s=1; /*TODO:check that no return-arg was touched.*/ break; 113 case 'v': dcCallVoid(p,t); s=1; /*TODO:check that no return-arg was touched.*/ break;
96 case 'j': s = (dcCallLong (p,t) == K_j[pos]) ; break; 117 case 'j': s = (dcCallLong (p,t) == K_j[pos]) ; break;
97 case 'l': s = (dcCallLongLong(p,t) == K_l[pos]) ; break; 118 case 'l': s = (dcCallLongLong(p,t) == K_l[pos]) ; break;
98 case 'p': s = (dcCallPointer (p,t) == K_p[pos]) ; break; 119 case 'p': s = (dcCallPointer (p,t) == K_p[pos]) ; break;
99 case 'f': s = (dcCallFloat (p,t) == K_f[pos]) ; break; 120 case 'f': s = (dcCallFloat (p,t) == K_f[pos]) ; break;
100 case 'd': s = (dcCallDouble (p,t) == K_d[pos]) ; break; 121 case 'd': s = (dcCallDouble (p,t) == K_d[pos]) ; break;
101 //@@@ handle return types case '{': @@@ ; break; 122 case '{': {
123 s = ((int(*)())rtype_st_cmp)(dcCallStruct(p,t,rtype_st, V_a[pos]), K_a[pos]);
124 break;
125 }
102 default: printf("unknown rtype '%c'", rtype); return 0; 126 default: printf("unknown rtype '%c'", rtype); return 0;
103 } 127 }
104 128
105 if (!s) { printf("rval wrong;"); return 0; } 129 if (!s) { printf("rval wrong;"); return 0; }
106 /* test: */ 130
107 sig = signature+1; 131 /* test V_* array against values passed to func: */
132 sig = sig_args;
108 pos = 1; 133 pos = 1;
109 while ( (atype = *sig) != '\0') { 134 while ( (atype = *sig) != '\0') {
110 switch(atype) { 135 switch(atype) {
111 case 'c': s = ( V_c[pos] == K_c[pos] ); if (!s) printf("'c':%d: %d != %d ; ", pos, V_c[pos], K_c[pos]); break; 136 case 'c': s = ( V_c[pos] == K_c[pos] ); if (!s) printf("'c':%d: %d != %d ; ", pos, V_c[pos], K_c[pos]); break;
112 case 's': s = ( V_s[pos] == K_s[pos] ); if (!s) printf("'s':%d: %d != %d ; ", pos, V_s[pos], K_s[pos]); break; 137 case 's': s = ( V_s[pos] == K_s[pos] ); if (!s) printf("'s':%d: %d != %d ; ", pos, V_s[pos], K_s[pos]); break;
113 case 'i': s = ( V_i[pos] == K_i[pos] ); if (!s) printf("'i':%d: %d != %d ; ", pos, V_i[pos], K_i[pos]); break; 138 case 'i': s = ( V_i[pos] == K_i[pos] ); if (!s) printf("'i':%d: %d != %d ; ", pos, V_i[pos], K_i[pos]); break;
114 case 'j': s = ( V_j[pos] == K_j[pos] ); if (!s) printf("'j':%d: %ld != %ld ; ", pos, V_j[pos], K_j[pos]); break; 139 case 'j': s = ( V_j[pos] == K_j[pos] ); if (!s) printf("'j':%d: %ld != %ld ; ", pos, V_j[pos], K_j[pos]); break;
115 case 'l': s = ( V_l[pos] == K_l[pos] ); if (!s) printf("'l':%d: %lld != %lld ; ", pos, V_l[pos], K_l[pos]); break; 140 case 'l': s = ( V_l[pos] == K_l[pos] ); if (!s) printf("'l':%d: %lld != %lld ; ", pos, V_l[pos], K_l[pos]); break;
116 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; 141 case 'p': s = ( V_p[pos] == K_p[pos] ); if (!s) printf("'p':%d: %p != %p ; ", pos, V_p[pos], K_p[pos]); break;
117 case 'f': s = ( V_f[pos] == K_f[pos] ); if (!s) printf("'f':%d: %f != %f ; ", pos, V_f[pos], K_f[pos]); break; 142 case 'f': s = ( V_f[pos] == K_f[pos] ); if (!s) printf("'f':%d: %f != %f ; ", pos, V_f[pos], K_f[pos]); break;
118 case 'd': s = ( V_d[pos] == K_d[pos] ); if (!s) printf("'d':%d: %f != %f ; ", pos, V_d[pos], K_d[pos]); break; 143 case 'd': s = ( V_d[pos] == K_d[pos] ); if (!s) printf("'d':%d: %f != %f ; ", pos, V_d[pos], K_d[pos]); break;
119 case '{': { 144 case '{': {
120 /* no check: guaranteed to exist, or invoke func would've exited when passing args, above */ 145 /* no check: guaranteed to exist, or invoke func would've exited when passing args, above */
121 int len; 146 int len;
122 int i = find_agg_idx(&len, sig); 147 int i = find_agg_idx(&len, sig);
123 s = ((int(*)())G_agg_cmpfuncs[i])(V_a[pos], K_a[pos]); 148 s = ((int(*)())G_agg_cmpfuncs[i])(V_a[pos], K_a[pos]);
124 if (!s) printf("'{':%d: %lld != %lld ; ", pos, (long long) V_a[pos], (long long) K_a[pos]); 149 if (!s) printf("'{':%d: *%p != *%p ; ", pos, V_a[pos], K_a[pos]);
125 sig += len-1; /* advance to next arg char */ 150 sig += len-1; /* advance to next arg char */
126 break; 151 break;
127 } 152 }
128 default: printf("unknown atype '%c' ; ", atype); return 0; 153 default: printf("unknown atype '%c' ; ", atype); return 0;
129 } 154 }
130 if (!s) { 155 if (!s) {
131 printf("arg mismatch at %d ; ", pos); 156 printf("arg mismatch at %d ; ", pos);
132 return 0; 157 return 0;
133 } 158 }
134 ++sig; 159 ++sig;
135 ++pos; 160 ++pos;
136 } 161 }
137 return 1; 162 return 1;
138 } 163 }
139 164