8#if defined(DUK_USE_SELF_TESTS)
17} duk__test_double_union;
19#define DUK__DBLUNION_CMP_TRUE(a,b) do { \
20 if (DUK_MEMCMP((const void *) (a), (const void *) (b), sizeof(duk__test_double_union)) != 0) { \
21 DUK_PANIC(DUK_ERR_INTERNAL_ERROR, "self test failed: double union compares false (expected true)"); \
25#define DUK__DBLUNION_CMP_FALSE(a,b) do { \
26 if (DUK_MEMCMP((const void *) (a), (const void *) (b), sizeof(duk__test_double_union)) == 0) { \
27 DUK_PANIC(DUK_ERR_INTERNAL_ERROR, "self test failed: double union compares true (expected false)"); \
41 if (!(
sizeof(duk_int8_t) == 1 &&
42 sizeof(duk_uint8_t) == 1 &&
43 sizeof(duk_int16_t) == 2 &&
44 sizeof(duk_uint16_t) == 2 &&
45 sizeof(duk_int32_t) == 4 &&
46 sizeof(duk_uint32_t) == 4)) {
49#if defined(DUK_USE_64BIT_OPS)
50 if (!(
sizeof(duk_int64_t) == 8 &&
51 sizeof(duk_uint64_t) == 8)) {
71DUK_LOCAL void duk__selftest_packed_tval(
void) {
72#if defined(DUK_USE_PACKED_TVAL)
73 if (
sizeof(
void *) > 4) {
83DUK_LOCAL void duk__selftest_twos_complement(
void) {
90 if (((
volatile duk_uint8_t *) &test)[0] != (duk_uint8_t) 0xff) {
101DUK_LOCAL void duk__selftest_byte_order(
void) {
102 duk__test_u32_union u1;
103 duk__test_double_union u2;
109#if defined(DUK_USE_INTEGER_LE)
110 u1.c[0] = 0xef; u1.c[1] = 0xbe; u1.c[2] = 0xad; u1.c[3] = 0xde;
111#elif defined(DUK_USE_INTEGER_ME)
112#error integer mixed endian not supported now
113#elif defined(DUK_USE_INTEGER_BE)
114 u1.c[0] = 0xde; u1.c[1] = 0xad; u1.c[2] = 0xbe; u1.c[3] = 0xef;
116#error unknown integer endianness
119#if defined(DUK_USE_DOUBLE_LE)
120 u2.c[0] = 0x00; u2.c[1] = 0x00; u2.c[2] = 0xc4; u2.c[3] = 0x6d;
121 u2.c[4] = 0x7c; u2.c[5] = 0xc1; u2.c[6] = 0x37; u2.c[7] = 0x42;
122#elif defined(DUK_USE_DOUBLE_ME)
123 u2.c[0] = 0x7c; u2.c[1] = 0xc1; u2.c[2] = 0x37; u2.c[3] = 0x42;
124 u2.c[4] = 0x00; u2.c[5] = 0x00; u2.c[6] = 0xc4; u2.c[7] = 0x6d;
125#elif defined(DUK_USE_DOUBLE_BE)
126 u2.c[0] = 0x42; u2.c[1] = 0x37; u2.c[2] = 0xc1; u2.c[3] = 0x7c;
127 u2.c[4] = 0x6d; u2.c[5] = 0xc4; u2.c[6] = 0x00; u2.c[7] = 0x00;
129#error unknown double endianness
132 if (u1.i != (duk_uint32_t) 0xdeadbeefUL) {
136 if (u2.d != (
double) 102030405060.0) {
145DUK_LOCAL void duk__selftest_bswap_macros(
void) {
153 if (x16 != (duk_uint16_t) 0xefbeUL) {
159 if (x32 != (duk_uint32_t) 0xefbeaddeUL) {
167 du.
uc[0] = 0x40; du.
uc[1] = 0x00; du.
uc[2] = 0x11; du.
uc[3] = 0x22;
168 du.
uc[4] = 0x33; du.
uc[5] = 0x44; du.
uc[6] = 0x55; du.
uc[7] = 0x66;
170 du_diff = du.
d - 2.008366013071895;
174 if (du_diff > 1e-15) {
180 DUK_FPRINTF(
DUK_STDERR,
"Result of DUK_DBLUNION_DOUBLE_NTOH: %02x %02x %02x %02x %02x %02x %02x %02x\n",
181 (
unsigned int) du.
uc[0], (
unsigned int) du.
uc[1],
182 (
unsigned int) du.
uc[2], (
unsigned int) du.
uc[3],
183 (
unsigned int) du.
uc[4], (
unsigned int) du.
uc[5],
184 (
unsigned int) du.
uc[6], (
unsigned int) du.
uc[7]);
194DUK_LOCAL void duk__selftest_double_union_size(
void) {
195 if (
sizeof(duk__test_double_union) != 8) {
204DUK_LOCAL void duk__selftest_double_aliasing(
void) {
205 duk__test_double_union
a, b;
211#if !defined(DUK_USE_PACKED_TVAL)
212 DUK_D(
DUK_DPRINT(
"skip double aliasing self test when duk_tval is not packed"));
220 a.c[0] = 0x11;
a.c[1] = 0x22;
a.c[2] = 0x33;
a.c[3] = 0x44;
221 a.c[4] = 0x00;
a.c[5] = 0x00;
a.c[6] = 0xf1;
a.c[7] = 0xff;
223 DUK__DBLUNION_CMP_TRUE(&
a, &b);
226 a.c[0] = 0xff;
a.c[1] = 0xf1;
a.c[2] = 0x00;
a.c[3] = 0x00;
227 a.c[4] = 0x44;
a.c[5] = 0x33;
a.c[6] = 0x22;
a.c[7] = 0x11;
229 DUK__DBLUNION_CMP_TRUE(&
a, &b);
232 a.c[0] = 0x00;
a.c[1] = 0x00;
a.c[2] = 0xf1;
a.c[3] = 0xff;
233 a.c[4] = 0x11;
a.c[5] = 0x22;
a.c[6] = 0x33;
a.c[7] = 0x44;
235 DUK__DBLUNION_CMP_TRUE(&
a, &b);
242DUK_LOCAL void duk__selftest_double_zero_sign(
void) {
243 duk__test_double_union
a, b;
247 DUK__DBLUNION_CMP_FALSE(&
a, &b);
257DUK_LOCAL void duk__selftest_struct_align(
void) {
258#if (DUK_USE_ALIGN_BY == 4)
262#elif (DUK_USE_ALIGN_BY == 8)
266#elif (DUK_USE_ALIGN_BY == 1)
269#error invalid DUK_USE_ALIGN_BY
280DUK_LOCAL void duk__selftest_64bit_arithmetic(
void) {
281#if defined(DUK_USE_64BIT_OPS)
282 volatile duk_int64_t i;
288 if (i != 0x80000000LL) {
300DUK_LOCAL void duk__selftest_cast_double_to_small_uint(
void) {
317 if (!(d1 == 1.0 && u == 1 && d2 == 1.0 && d1 == d2)) {
327 if (!(d1v == 1.0 && uv == 1 && d2v == 1.0 && d1v == d2v)) {
332DUK_LOCAL void duk__selftest_cast_double_to_uint32(
void) {
344 uv = (duk_uint32_t) dv;
346 if (uv != 0xdeadbeefUL) {
356 duk__selftest_types();
357 duk__selftest_packed_tval();
358 duk__selftest_twos_complement();
359 duk__selftest_byte_order();
360 duk__selftest_bswap_macros();
361 duk__selftest_double_union_size();
362 duk__selftest_double_aliasing();
363 duk__selftest_double_zero_sign();
364 duk__selftest_struct_align();
365 duk__selftest_64bit_arithmetic();
366 duk__selftest_cast_double_to_small_uint();
367 duk__selftest_cast_double_to_uint32();
370#undef DUK__DBLUNION_CMP_TRUE
371#undef DUK__DBLUNION_CMP_FALSE
unsigned int duk_small_uint_t
duk_int_fast32_t duk_int_t
duk_uint_fast32_t duk_uint_t
#define DUK_PANIC(code, msg)
#define DUK_DBLUNION_DOUBLE_NTOH(u)
#define DUK_ERR_INTERNAL_ERROR