annotate test/ellipsis/main.cc @ 663:127b569978cc default tip

- another tweak handling clang trying to be too smart (see last commit)
author Tassilo Philipp
date Sun, 24 Mar 2024 13:52:44 +0100
parents 85b7a117b807
children
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/ellipsis/main.cc
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description: call (...) functions via dyncall library, targets are auto-generated
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
606
85b7a117b807 - more statics in test code (this is partly needed on an experimental freebsd sparc64 build where the elf cleanup code crashes for some reason ... it's probably that experimental build, but a good change to do regardless)
Tassilo Philipp
parents: 410
diff changeset
9 Copyright (c) 2007-2022 Daniel Adler <dadler@uni-goettingen.de>,
0
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
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28 #include "config.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29 #include <math.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 #include "../../dyncall/dyncall.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31 #include "../../dyncall/dyncall_value.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 #include <stdlib.h>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 #include "../common/platformInit.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 #include "../common/platformInit.c" /* Impl. for functions only used in this translation unit */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37 int getId();
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38 DCpointer getFunc(int x);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39 DCValue* getArg(int pos);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40
606
85b7a117b807 - more statics in test code (this is partly needed on an experimental freebsd sparc64 build where the elf cleanup code crashes for some reason ... it's probably that experimental build, but a good change to do regardless)
Tassilo Philipp
parents: 410
diff changeset
41 static DCint valueInt [NARGS];
85b7a117b807 - more statics in test code (this is partly needed on an experimental freebsd sparc64 build where the elf cleanup code crashes for some reason ... it's probably that experimental build, but a good change to do regardless)
Tassilo Philipp
parents: 410
diff changeset
42 static DClonglong valueLongLong[NARGS];
85b7a117b807 - more statics in test code (this is partly needed on an experimental freebsd sparc64 build where the elf cleanup code crashes for some reason ... it's probably that experimental build, but a good change to do regardless)
Tassilo Philipp
parents: 410
diff changeset
43 static DCdouble valueDouble [NARGS];
85b7a117b807 - more statics in test code (this is partly needed on an experimental freebsd sparc64 build where the elf cleanup code crashes for some reason ... it's probably that experimental build, but a good change to do regardless)
Tassilo Philipp
parents: 410
diff changeset
44 static DCpointer valuePointer [NARGS];
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 bool equals(int select, int pos, void* data)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 switch(select)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50 case 0: return ( getArg(pos)->i == valueInt [pos] ); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 case 1: return ( getArg(pos)->l == valueLongLong[pos] ); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 case 2: return ( getArg(pos)->d == valueDouble [pos] ); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 case 3: return ( getArg(pos)->p == valuePointer [pos] ); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 return false;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 void clearValues();
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 void init()
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 {
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
61 for (int i = 0 ; i < NARGS ; ++i )
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 valueInt [i] = DCint (i);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 valueLongLong[i] = DClonglong(i);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 valueDouble [i] = DCdouble (i);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 valuePointer [i] = DCpointer (i);
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
67 }
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 void arg(DCCallVM* pCall, int select, int pos)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 {
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
72 switch(select)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 case 0: dcArgInt ( pCall, valueInt [pos] ); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75 case 1: dcArgLongLong( pCall, valueLongLong[pos] ); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 case 2: dcArgDouble ( pCall, valueDouble [pos] ); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 case 3: dcArgPointer ( pCall, valuePointer [pos] ); break;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
81 #define test(x) if (!(x)) return false
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 bool test_ellipsis_case(int x)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 clearValues();
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 DCCallVM* pCall = dcNewCallVM(4096);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
89 test( dcGetError(pCall) == DC_ERROR_NONE );
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
90
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 dcMode(pCall, DC_CALL_C_ELLIPSIS);
50
9bd3c5219505 - minor test code fix
cslag
parents: 0
diff changeset
92 dcReset(pCall);
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
93
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
94 test( dcGetError(pCall) == DC_ERROR_NONE );
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
95
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 int y = x;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97 int selects[NARGS] = { 0 };
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 int pos = 0;
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
99 if (y > 0)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 {
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
101 int select = (y-1) % NTYPES;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102 selects[pos] = select;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 arg(pCall,select,pos);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 y = (y-1) / NTYPES;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105 ++pos;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108 dcMode(pCall, DC_CALL_C_ELLIPSIS_VARARGS);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
110 for(; y>0; ++pos)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 {
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
112 int select = (y-1) % NTYPES;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113 selects[pos] = select;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114 arg(pCall,select,pos);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115 y = (y-1) / NTYPES;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
116 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
117 dcCallVoid(pCall,getFunc(x));
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
118
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
119 test( getId() == x );
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
120
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
121 for(int i=0; i<pos; ++i) {
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
122 test( equals( selects[i], i, getArg(i) ) );
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123 }
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
124
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125 dcFree(pCall);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126 return true;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129 int powerfact(int x, int n)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
130 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
131 if (n==0) return 0;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
132 return static_cast<int>( pow((double)x,n)+powerfact(x,n-1) );
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
133 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
134
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
135
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
136 bool run_range(int from, int to)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
137 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
138 bool tr = true;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
139 for (int i = from ; i < to ; ++i ) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
140 printf("%d:", i);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
141 bool r = test_ellipsis_case(i);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
142 printf("%d\n", r);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
143
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
144 tr &= r;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
145 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
146 return tr;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
147 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
148
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
149
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
150 extern "C" {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
151
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
152 int main(int argc, char* argv[])
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
153 {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
154 dcTest_initPlatform();
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
155
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
156 bool success = false;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
157 init();
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
158 if (argc == 2) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
159 int index = atoi(argv[1]);
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
160 success = run_range( index, index+1 );
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
161 } else if (argc == 3) {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
162 int from = atoi(argv[1]);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
163 int to = atoi(argv[2])+1;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
164 success = run_range(from,to);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
165 } else {
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
166 int ncalls = powerfact(NTYPES,NARGS)+1;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
167 success = run_range(0,ncalls);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
168 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
169
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
170 printf("result: ellipsis: %d\n", success);
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
171
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
172 dcTest_deInitPlatform();
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
173
410
7608e34098b0 - cleanups, simplifications, some api clarification, ...
Tassilo Philipp
parents: 281
diff changeset
174 return !success;
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
175 }
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
176
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
177 } // extern "C"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
178