0
|
1 /*
|
|
2
|
|
3 Package: dyncall
|
|
4 Library: test
|
|
5 File: test/plain/test_structs.c
|
|
6 Description:
|
|
7 License:
|
|
8
|
|
9 Copyright (c) 2010-2015 Olivier Chafik <olivier.chafik@gmail.com>
|
|
10
|
|
11 Permission to use, copy, modify, and distribute this software for any
|
|
12 purpose with or without fee is hereby granted, provided that the above
|
|
13 copyright notice and this permission notice appear in all copies.
|
|
14
|
|
15 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
16 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
17 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
18 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
21 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
22
|
|
23 */
|
|
24
|
|
25
|
|
26
|
|
27
|
141
|
28 #include "../common/test_framework.h"
|
0
|
29 #include "../../dyncall/dyncall.h"
|
|
30 #include "../../dyncall/dyncall_signature.h"
|
|
31 #include "../../dyncall/dyncall_struct.h"
|
|
32 #include "../common/platformInit.h"
|
|
33
|
|
34 #define DC_TEST_INT_EQUAL(expected, computed) { \
|
|
35 if (expected != computed) \
|
|
36 printf("expected = %d, computed = %d\n\n", (int)expected, (int)computed); \
|
|
37 DC_TEST(expected == computed); \
|
|
38 }
|
|
39 #define DC_TEST_STRUCT_SIZE(type, s) { \
|
|
40 DCsize expected = sizeof(type), computed = dcStructSize(s);\
|
|
41 DC_TEST_INT_EQUAL(expected, computed); \
|
|
42 }
|
|
43
|
|
44 DC_DEFINE_TEST_FUNC_BEGIN(testStructSizes)
|
|
45
|
|
46 {
|
|
47 typedef struct {
|
|
48 double a, b, c, d;
|
|
49 } S;
|
|
50
|
|
51 size_t size;
|
|
52 DCstruct* s = dcNewStruct(4, DEFAULT_ALIGNMENT);
|
|
53 dcStructField(s, DC_SIGCHAR_DOUBLE, DEFAULT_ALIGNMENT, 1);
|
|
54 dcStructField(s, DC_SIGCHAR_DOUBLE, DEFAULT_ALIGNMENT, 1);
|
|
55 dcStructField(s, DC_SIGCHAR_DOUBLE, DEFAULT_ALIGNMENT, 1);
|
|
56 dcStructField(s, DC_SIGCHAR_DOUBLE, DEFAULT_ALIGNMENT, 1);
|
|
57 dcCloseStruct(s);
|
|
58
|
|
59 DC_TEST_STRUCT_SIZE(S, s);
|
|
60 dcFreeStruct(s);
|
|
61 }
|
|
62 {
|
|
63 typedef struct {
|
|
64 char a, b;
|
|
65 void* p[3];
|
|
66 } S;
|
|
67
|
|
68 size_t size;
|
|
69 DCstruct* s = dcNewStruct(3, DEFAULT_ALIGNMENT);
|
|
70 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1);
|
|
71 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1);
|
|
72 dcStructField(s, DC_SIGCHAR_POINTER, DEFAULT_ALIGNMENT, 3);
|
|
73 dcCloseStruct(s);
|
|
74
|
|
75 DC_TEST_STRUCT_SIZE(S, s);
|
|
76 dcFreeStruct(s);
|
|
77 }
|
|
78 {
|
|
79 typedef struct {
|
|
80 short a;
|
|
81 struct {
|
|
82 char a, b;
|
|
83 void* p[3];
|
|
84 } sub;
|
|
85 short b;
|
|
86 } S;
|
|
87
|
|
88 size_t size;
|
|
89 DCstruct* s = dcNewStruct(3, DEFAULT_ALIGNMENT);
|
|
90 dcStructField(s, DC_SIGCHAR_SHORT, DEFAULT_ALIGNMENT, 1);
|
|
91 dcSubStruct(s, 3, DEFAULT_ALIGNMENT, 1);
|
|
92 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1);
|
|
93 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1);
|
|
94 dcStructField(s, DC_SIGCHAR_POINTER, DEFAULT_ALIGNMENT, 3);
|
|
95 dcCloseStruct(s);
|
|
96 dcStructField(s, DC_SIGCHAR_SHORT, DEFAULT_ALIGNMENT, 1);
|
|
97 dcCloseStruct(s);
|
|
98
|
|
99 DC_TEST_STRUCT_SIZE(S, s);
|
|
100 dcFreeStruct(s);
|
|
101 }
|
|
102
|
|
103 #define TEST_MONO_STRUCT(type, sig) \
|
|
104 { \
|
|
105 typedef struct { \
|
|
106 type v; \
|
|
107 } S; \
|
|
108 \
|
|
109 DCstruct* s = dcNewStruct(1, DEFAULT_ALIGNMENT); \
|
|
110 dcStructField(s, sig, DEFAULT_ALIGNMENT, 1); \
|
|
111 dcCloseStruct(s); \
|
|
112 \
|
|
113 DC_TEST_STRUCT_SIZE(S, s); \
|
|
114 dcFreeStruct(s); \
|
|
115 }
|
|
116
|
|
117 TEST_MONO_STRUCT(char, DC_SIGCHAR_CHAR);
|
|
118 TEST_MONO_STRUCT(unsigned char, DC_SIGCHAR_UCHAR);
|
|
119 TEST_MONO_STRUCT(short, DC_SIGCHAR_SHORT);
|
|
120 TEST_MONO_STRUCT(unsigned short, DC_SIGCHAR_USHORT);
|
|
121 TEST_MONO_STRUCT(int, DC_SIGCHAR_INT);
|
|
122 TEST_MONO_STRUCT(unsigned int, DC_SIGCHAR_UINT);
|
|
123 TEST_MONO_STRUCT(long, DC_SIGCHAR_LONG);
|
|
124 TEST_MONO_STRUCT(unsigned long, DC_SIGCHAR_ULONG);
|
|
125 TEST_MONO_STRUCT(long long, DC_SIGCHAR_LONGLONG);
|
|
126 TEST_MONO_STRUCT(unsigned long long, DC_SIGCHAR_ULONGLONG);
|
|
127 TEST_MONO_STRUCT(void*, DC_SIGCHAR_POINTER);
|
|
128 TEST_MONO_STRUCT(float, DC_SIGCHAR_FLOAT);
|
|
129 TEST_MONO_STRUCT(double, DC_SIGCHAR_DOUBLE);
|
|
130
|
|
131 DC_DEFINE_TEST_FUNC_END
|
|
132
|
|
133
|
|
134
|
|
135 typedef struct
|
|
136 {
|
|
137 char a, b, c;
|
|
138 } FewValues;
|
|
139
|
|
140 double sum_FewValues(FewValues values)
|
|
141 {
|
|
142 printf("sum_FewValues(a = %d, b = %d, c = %d)\n", (int)values.a, (int)values.b, (int)values.c);
|
|
143 return ((double)values.a) + ((double)values.b) + ((double)values.c);
|
|
144 }
|
|
145
|
|
146
|
|
147 typedef struct
|
|
148 {
|
|
149 char a, b;
|
|
150 double p[10];
|
|
151 } SomeValues;
|
|
152
|
|
153 double sum_SomeValues(SomeValues values)
|
|
154 {
|
|
155 return ((double)values.a) + ((double)values.b) + values.p[0] + values.p[1] + values.p[2];
|
|
156 }
|
|
157
|
|
158
|
|
159 DC_DEFINE_TEST_FUNC_BEGIN(testCallStructs)
|
|
160
|
|
161 DCCallVM* pc = dcNewCallVM(4096);
|
|
162 {
|
|
163 FewValues values;
|
|
164 double calledSum, expectedSum;
|
|
165 DCstruct* s = dcNewStruct(3, DEFAULT_ALIGNMENT);
|
|
166 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1);
|
|
167 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1);
|
|
168 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1);
|
|
169 dcCloseStruct(s);
|
|
170
|
|
171 DC_TEST_STRUCT_SIZE(FewValues, s);
|
|
172
|
|
173 values.a = 1;
|
|
174 values.b = 2;
|
|
175 values.c = 3;
|
|
176
|
|
177 dcMode(pc, DC_CALL_C_DEFAULT);
|
|
178 dcReset(pc);
|
|
179 printf("BEFORE dcArgStruct\n");
|
|
180 dcArgStruct(pc, s, &values);
|
|
181 printf("AFTER dcArgStruct\n");
|
|
182 calledSum = dcCallDouble(pc, (DCpointer)&sum_FewValues);
|
|
183 expectedSum = sum_FewValues(values);
|
|
184
|
|
185 DC_TEST_INT_EQUAL(expectedSum, calledSum);
|
|
186 dcFreeStruct(s);
|
|
187 }
|
|
188 {
|
|
189 SomeValues values;
|
|
190 double calledSum, expectedSum;
|
|
191 DCstruct* s = dcNewStruct(3, DEFAULT_ALIGNMENT);
|
|
192 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1);
|
|
193 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1);
|
|
194 dcStructField(s, DC_SIGCHAR_DOUBLE, DEFAULT_ALIGNMENT, 10);
|
|
195 dcCloseStruct(s);
|
|
196
|
|
197 DC_TEST_STRUCT_SIZE(SomeValues, s);
|
|
198
|
|
199 values.a = 1;
|
|
200 values.b = 2;
|
|
201 values.p[0] = 10;
|
|
202 values.p[1] = 11;
|
|
203 values.p[2] = 12;
|
|
204
|
|
205 dcMode(pc, DC_CALL_C_DEFAULT);
|
|
206 dcReset(pc);
|
|
207 dcArgStruct(pc, s, &values);
|
|
208 calledSum = dcCallDouble(pc, (DCpointer) &sum_SomeValues);
|
|
209 expectedSum = sum_SomeValues(values);
|
|
210
|
|
211 DC_TEST_INT_EQUAL(expectedSum, calledSum);
|
|
212 dcFreeStruct(s);
|
|
213 }
|
|
214
|
|
215 dcFree(pc);
|
|
216
|
|
217 DC_DEFINE_TEST_FUNC_END
|
|
218
|