Mercurial > pub > dyncall > dyncall
comparison test/plain/test_structs.c @ 334:1cf6a4a94aca
- better output for plain test's struct size testing (maybe in prep for full struct support)
author | Tassilo Philipp |
---|---|
date | Wed, 27 Nov 2019 20:43:51 +0100 |
parents | dd78bd0152af |
children | 5fe52b7c6e02 |
comparison
equal
deleted
inserted
replaced
333:4e9d3cb9870f | 334:1cf6a4a94aca |
---|---|
29 #include "../../dyncall/dyncall.h" | 29 #include "../../dyncall/dyncall.h" |
30 #include "../../dyncall/dyncall_signature.h" | 30 #include "../../dyncall/dyncall_signature.h" |
31 #include "../../dyncall/dyncall_struct.h" | 31 #include "../../dyncall/dyncall_struct.h" |
32 #include "../common/platformInit.h" | 32 #include "../common/platformInit.h" |
33 | 33 |
34 #define DC_TEST_INT_EQUAL(expected, computed) { \ | 34 #define DC_TEST_STRUCT_SIZE(sig, type, s) { \ |
35 if (expected != computed) \ | 35 DCsize expected = sizeof(type), computed = dcStructSize(s);\ |
36 printf("expected = %d, computed = %d\n\n", (int)expected, (int)computed); \ | 36 printf("struct_%s size: expected = %d, computed = %d: %d\n", sig, (int)expected, (int)computed, (expected == computed)); \ |
37 ret = (expected == computed) && ret; \ | 37 ret = (expected == computed) && ret; \ |
38 } | 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 | 39 |
44 int testStructSizes() | 40 int testStructSizes() |
45 { | 41 { |
46 int ret = 1; | 42 int ret = 1; |
47 | 43 |
48 { | 44 { |
49 typedef struct { | 45 typedef struct { |
46 char a, b; | |
47 } S; | |
48 | |
49 size_t size; | |
50 DCstruct* s = dcNewStruct(2, DEFAULT_ALIGNMENT); | |
51 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); | |
52 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); | |
53 dcCloseStruct(s); | |
54 | |
55 DC_TEST_STRUCT_SIZE("cc", S, s); | |
56 dcFreeStruct(s); | |
57 } | |
58 { | |
59 typedef struct { | |
60 char a, b, c; | |
61 } S; | |
62 | |
63 size_t size; | |
64 DCstruct* s = dcNewStruct(3, DEFAULT_ALIGNMENT); | |
65 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); | |
66 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); | |
67 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); | |
68 dcCloseStruct(s); | |
69 | |
70 DC_TEST_STRUCT_SIZE("ccc", S, s); | |
71 dcFreeStruct(s); | |
72 } | |
73 { | |
74 typedef struct { | |
75 char a; | |
76 short b; | |
77 } S; | |
78 | |
79 size_t size; | |
80 DCstruct* s = dcNewStruct(2, DEFAULT_ALIGNMENT); | |
81 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); | |
82 dcStructField(s, DC_SIGCHAR_SHORT, DEFAULT_ALIGNMENT, 1); | |
83 dcCloseStruct(s); | |
84 | |
85 DC_TEST_STRUCT_SIZE("cs", S, s); | |
86 dcFreeStruct(s); | |
87 } | |
88 { | |
89 typedef struct { | |
50 double a, b, c, d; | 90 double a, b, c, d; |
51 } S; | 91 } S; |
52 | 92 |
53 size_t size; | 93 size_t size; |
54 DCstruct* s = dcNewStruct(4, DEFAULT_ALIGNMENT); | 94 DCstruct* s = dcNewStruct(4, DEFAULT_ALIGNMENT); |
56 dcStructField(s, DC_SIGCHAR_DOUBLE, DEFAULT_ALIGNMENT, 1); | 96 dcStructField(s, DC_SIGCHAR_DOUBLE, DEFAULT_ALIGNMENT, 1); |
57 dcStructField(s, DC_SIGCHAR_DOUBLE, DEFAULT_ALIGNMENT, 1); | 97 dcStructField(s, DC_SIGCHAR_DOUBLE, DEFAULT_ALIGNMENT, 1); |
58 dcStructField(s, DC_SIGCHAR_DOUBLE, DEFAULT_ALIGNMENT, 1); | 98 dcStructField(s, DC_SIGCHAR_DOUBLE, DEFAULT_ALIGNMENT, 1); |
59 dcCloseStruct(s); | 99 dcCloseStruct(s); |
60 | 100 |
61 DC_TEST_STRUCT_SIZE(S, s); | 101 DC_TEST_STRUCT_SIZE("dddd", S, s); |
62 dcFreeStruct(s); | 102 dcFreeStruct(s); |
63 } | 103 } |
64 { | 104 { |
65 typedef struct { | 105 typedef struct { |
66 char a, b; | 106 char a, b; |
72 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); | 112 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); |
73 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); | 113 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); |
74 dcStructField(s, DC_SIGCHAR_POINTER, DEFAULT_ALIGNMENT, 3); | 114 dcStructField(s, DC_SIGCHAR_POINTER, DEFAULT_ALIGNMENT, 3); |
75 dcCloseStruct(s); | 115 dcCloseStruct(s); |
76 | 116 |
77 DC_TEST_STRUCT_SIZE(S, s); | 117 DC_TEST_STRUCT_SIZE("cc[ppp]", S, s); |
78 dcFreeStruct(s); | 118 dcFreeStruct(s); |
79 } | 119 } |
80 { | 120 { |
81 typedef struct { | 121 typedef struct { |
82 short a; | 122 short a; |
96 dcStructField(s, DC_SIGCHAR_POINTER, DEFAULT_ALIGNMENT, 3); | 136 dcStructField(s, DC_SIGCHAR_POINTER, DEFAULT_ALIGNMENT, 3); |
97 dcCloseStruct(s); | 137 dcCloseStruct(s); |
98 dcStructField(s, DC_SIGCHAR_SHORT, DEFAULT_ALIGNMENT, 1); | 138 dcStructField(s, DC_SIGCHAR_SHORT, DEFAULT_ALIGNMENT, 1); |
99 dcCloseStruct(s); | 139 dcCloseStruct(s); |
100 | 140 |
101 DC_TEST_STRUCT_SIZE(S, s); | 141 DC_TEST_STRUCT_SIZE("s{cc[ppp]}s", S, s); |
102 dcFreeStruct(s); | 142 dcFreeStruct(s); |
103 } | 143 } |
104 | 144 |
105 #define TEST_MONO_STRUCT(type, sig) \ | 145 #define TEST_MONO_STRUCT(sig, type, sigchar) \ |
106 { \ | 146 { \ |
107 typedef struct { \ | 147 typedef struct { \ |
108 type v; \ | 148 type v; \ |
109 } S; \ | 149 } S; \ |
110 \ | 150 \ |
111 DCstruct* s = dcNewStruct(1, DEFAULT_ALIGNMENT); \ | 151 DCstruct* s = dcNewStruct(1, DEFAULT_ALIGNMENT); \ |
112 dcStructField(s, sig, DEFAULT_ALIGNMENT, 1); \ | 152 dcStructField(s, sigchar, DEFAULT_ALIGNMENT, 1); \ |
113 dcCloseStruct(s); \ | 153 dcCloseStruct(s); \ |
114 \ | 154 \ |
115 DC_TEST_STRUCT_SIZE(S, s); \ | 155 DC_TEST_STRUCT_SIZE(sig, S, s); \ |
116 dcFreeStruct(s); \ | 156 dcFreeStruct(s); \ |
117 } | 157 } |
118 | 158 |
119 TEST_MONO_STRUCT(char, DC_SIGCHAR_CHAR); | 159 TEST_MONO_STRUCT("c", char, DC_SIGCHAR_CHAR); // 4 on plan 9 | |
120 TEST_MONO_STRUCT(unsigned char, DC_SIGCHAR_UCHAR); | 160 TEST_MONO_STRUCT("C", unsigned char, DC_SIGCHAR_UCHAR); // 4 on plan 9 | |
121 TEST_MONO_STRUCT(short, DC_SIGCHAR_SHORT); | 161 TEST_MONO_STRUCT("s", short, DC_SIGCHAR_SHORT); // 4 on plan 9 | minimal size of a struct, period? |
122 TEST_MONO_STRUCT(unsigned short, DC_SIGCHAR_USHORT); | 162 TEST_MONO_STRUCT("S", unsigned short, DC_SIGCHAR_USHORT); // 4 on plan 9 | |
123 TEST_MONO_STRUCT(int, DC_SIGCHAR_INT); | 163 TEST_MONO_STRUCT("i", int, DC_SIGCHAR_INT); |
124 TEST_MONO_STRUCT(unsigned int, DC_SIGCHAR_UINT); | 164 TEST_MONO_STRUCT("I", unsigned int, DC_SIGCHAR_UINT); |
125 TEST_MONO_STRUCT(long, DC_SIGCHAR_LONG); | 165 TEST_MONO_STRUCT("j", long, DC_SIGCHAR_LONG); |
126 TEST_MONO_STRUCT(unsigned long, DC_SIGCHAR_ULONG); | 166 TEST_MONO_STRUCT("J", unsigned long, DC_SIGCHAR_ULONG); |
127 TEST_MONO_STRUCT(long long, DC_SIGCHAR_LONGLONG); | 167 TEST_MONO_STRUCT("l", long long, DC_SIGCHAR_LONGLONG); |
128 TEST_MONO_STRUCT(unsigned long long, DC_SIGCHAR_ULONGLONG); | 168 TEST_MONO_STRUCT("L", unsigned long long, DC_SIGCHAR_ULONGLONG); |
129 TEST_MONO_STRUCT(void*, DC_SIGCHAR_POINTER); | 169 TEST_MONO_STRUCT("p", void*, DC_SIGCHAR_POINTER); |
130 TEST_MONO_STRUCT(float, DC_SIGCHAR_FLOAT); | 170 TEST_MONO_STRUCT("f", float, DC_SIGCHAR_FLOAT); |
131 TEST_MONO_STRUCT(double, DC_SIGCHAR_DOUBLE); | 171 TEST_MONO_STRUCT("d", double, DC_SIGCHAR_DOUBLE); |
132 | 172 |
133 return ret; | 173 return ret; |
134 } | 174 } |
135 | 175 |
136 | 176 |
157 { | 197 { |
158 return ((double)values.a) + ((double)values.b) + values.p[0] + values.p[1] + values.p[2]; | 198 return ((double)values.a) + ((double)values.b) + values.p[0] + values.p[1] + values.p[2]; |
159 } | 199 } |
160 | 200 |
161 | 201 |
162 int testCallStructs() | 202 /*int testCallStructs() |
163 { | 203 { |
164 int ret = 1; | 204 int ret = 1; |
165 | 205 |
166 DCCallVM* pc = dcNewCallVM(4096); | 206 DCCallVM* pc = dcNewCallVM(4096); |
167 { | 207 { |
171 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); | 211 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); |
172 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); | 212 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); |
173 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); | 213 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); |
174 dcCloseStruct(s); | 214 dcCloseStruct(s); |
175 | 215 |
176 DC_TEST_STRUCT_SIZE(FewValues, s); | 216 DC_TEST_STRUCT_SIZE("ccc", FewValues, s); |
177 | 217 |
178 values.a = 1; | 218 values.a = 1; |
179 values.b = 2; | 219 values.b = 2; |
180 values.c = 3; | 220 values.c = 3; |
181 | 221 |
197 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); | 237 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); |
198 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); | 238 dcStructField(s, DC_SIGCHAR_CHAR, DEFAULT_ALIGNMENT, 1); |
199 dcStructField(s, DC_SIGCHAR_DOUBLE, DEFAULT_ALIGNMENT, 10); | 239 dcStructField(s, DC_SIGCHAR_DOUBLE, DEFAULT_ALIGNMENT, 10); |
200 dcCloseStruct(s); | 240 dcCloseStruct(s); |
201 | 241 |
202 DC_TEST_STRUCT_SIZE(SomeValues, s); | 242 DC_TEST_STRUCT_SIZE("ccd", SomeValues, s); |
203 | 243 |
204 values.a = 1; | 244 values.a = 1; |
205 values.b = 2; | 245 values.b = 2; |
206 values.p[0] = 10; | 246 values.p[0] = 10; |
207 values.p[1] = 11; | 247 values.p[1] = 11; |
218 } | 258 } |
219 | 259 |
220 dcFree(pc); | 260 dcFree(pc); |
221 | 261 |
222 return ret; | 262 return ret; |
223 } | 263 }*/ |
224 | 264 |