annotate test/call_suite/invoke.c @ 0:3e629dc19168

initial from svn dyncall-1745
author Daniel Adler
date Thu, 19 Mar 2015 22:24:28 +0100
parents
children f5577f6bf97a
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
1 /*
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
3 Package: dyncall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
4 Library: test
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 File: test/call_suite/invoke.c
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
7 License:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
9 Copyright (c) 2011-2015 Daniel Adler <dadler@uni-goettingen.de>,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10 Tassilo Philipp <tphilipp@potion-studios.com>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14 copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
23
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
24 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
25
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
26 #include "dyncall.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27 #include "globals.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28 #include "../common/platformInit.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 int invoke(char const* signature, void* t)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 DCCallVM * p = (DCCallVM*) G_callvm;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 char const * sig = signature;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 char rtype;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35 char atype;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36 int pos = 0;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37 int s = 0;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39 clear_V();
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41 rtype = *sig++;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42 dcReset(p);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44 while ( (atype = *sig++) != '\0') {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 pos++;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 switch(atype) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 case 'c': dcArgChar (p,K_c[pos]); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 case 's': dcArgShort (p,K_s[pos]); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 case 'i': dcArgInt (p,K_i[pos]); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50 case 'j': dcArgLong (p,K_j[pos]); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 case 'l': dcArgLongLong(p,K_l[pos]); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 case 'p': dcArgPointer (p,K_p[pos]); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 case 'f': dcArgFloat (p,K_f[pos]); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 case 'd': dcArgDouble (p,K_d[pos]); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 default: printf("unknown atype '%c' (1) ;", atype); return 0;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 switch(rtype)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 case 'v': dcCallVoid(p,t); s=1; /*TODO:check that no return-arg was touched.*/ break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 case 'c': s = (dcCallChar (p,t) == K_c[pos]) ; break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 case 's': s = (dcCallShort (p,t) == K_s[pos]) ; break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 case 'i': s = (dcCallInt (p,t) == K_i[pos]) ; break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 case 'j': s = (dcCallLong (p,t) == K_j[pos]) ; break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 case 'l': s = (dcCallLongLong(p,t) == K_l[pos]) ; break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 case 'p': s = (dcCallPointer (p,t) == K_p[pos]) ; break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 case 'f': s = (dcCallFloat (p,t) == K_f[pos]) ; break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 case 'd': s = (dcCallDouble (p,t) == K_d[pos]) ; break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 default: printf("unknown rtype '%c'", rtype); return 0;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 if (!s) { printf("rval wrong;"); return 0; }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 /* test: */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75 sig = signature+1;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 pos = 1;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 while ( (atype = *sig++) != '\0') {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 switch(atype) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 #if 0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 #define X(CH,T,QCH) case QCH: s = (V_##CH[pos] == K_##CH[pos]); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 DEF_TYPES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 #undef X
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 case 'c': s = ( V_c[pos] == K_c[pos] ); if (!s) printf("'c':%d: %d != %d ; ", pos, V_c[pos], K_c[pos]); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 case 's': s = ( V_s[pos] == K_s[pos] ); if (!s) printf("'s':%d: %d != %d ; ", pos, V_s[pos], K_s[pos]); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 case 'i': s = ( V_i[pos] == K_i[pos] ); if (!s) printf("'i':%d: %d != %d ; ", pos, V_i[pos], K_i[pos]); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 case 'j': s = ( V_j[pos] == K_j[pos] ); if (!s) printf("'j':%d: %ld != %ld ; ", pos, V_j[pos], K_j[pos]); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 case 'l': s = ( V_l[pos] == K_l[pos] ); if (!s) printf("'l':%d: %lld != %lld ; ", pos, V_l[pos], K_l[pos]); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 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;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 case 'f': s = ( V_f[pos] == K_f[pos] ); if (!s) printf("'f':%d: %f != %f ; ", pos, V_f[pos], K_f[pos]); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 case 'd': s = ( V_d[pos] == K_d[pos] ); if (!s) printf("'d':%d: %f != %f ; ", pos, V_d[pos], K_d[pos]); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 default: printf("unknown atype '%c' ; ", atype); return 0;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 if (!s) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95 printf("arg mismatch at %d ; ", pos);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 return 0;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 pos++;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 return 1;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102