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