DUK_LOCAL void duk__selftest_double_aliasing(void) { duk__test_double_union a, b; /* This testcase fails when Emscripten-generated code runs on Firefox. * It's not an issue because the failure should only affect packed * duk_tval representation, which is not used with Emscripten. */ #if defined(DUK_USE_NO_DOUBLE_ALIASING_SELFTEST) #if defined(DUK_USE_PACKED_TVAL) #error inconsistent defines: skipping double aliasing selftest when using packed duk_tval #endif return; #endif /* Test signaling NaN and alias assignment in all * endianness combinations. */ /* little endian */ a.c[0] = 0x11; a.c[1] = 0x22; a.c[2] = 0x33; a.c[3] = 0x44; a.c[4] = 0x00; a.c[5] = 0x00; a.c[6] = 0xf1; a.c[7] = 0xff; b = a; DUK__DBLUNION_CMP_TRUE(&a, &b); /* big endian */ a.c[0] = 0xff; a.c[1] = 0xf1; a.c[2] = 0x00; a.c[3] = 0x00; a.c[4] = 0x44; a.c[5] = 0x33; a.c[6] = 0x22; a.c[7] = 0x11; b = a; DUK__DBLUNION_CMP_TRUE(&a, &b); /* mixed endian */ a.c[0] = 0x00; a.c[1] = 0x00; a.c[2] = 0xf1; a.c[3] = 0xff; a.c[4] = 0x11; a.c[5] = 0x22; a.c[6] = 0x33; a.c[7] = 0x44; b = a; DUK__DBLUNION_CMP_TRUE(&a, &b); }
DUK_LOCAL duk_uint_t duk__selftest_double_aliasing(void) { /* This testcase fails when Emscripten-generated code runs on Firefox. * It's not an issue because the failure should only affect packed * duk_tval representation, which is not used with Emscripten. */ #if defined(DUK_USE_PACKED_TVAL) duk_uint_t error_count = 0; duk__test_double_union a, b; /* Test signaling NaN and alias assignment in all endianness combinations. */ /* little endian */ a.x[0] = 0x11; a.x[1] = 0x22; a.x[2] = 0x33; a.x[3] = 0x44; a.x[4] = 0x00; a.x[5] = 0x00; a.x[6] = 0xf1; a.x[7] = 0xff; b = a; DUK__DBLUNION_CMP_TRUE(&a, &b); /* big endian */ a.x[0] = 0xff; a.x[1] = 0xf1; a.x[2] = 0x00; a.x[3] = 0x00; a.x[4] = 0x44; a.x[5] = 0x33; a.x[6] = 0x22; a.x[7] = 0x11; b = a; DUK__DBLUNION_CMP_TRUE(&a, &b); /* mixed endian */ a.x[0] = 0x00; a.x[1] = 0x00; a.x[2] = 0xf1; a.x[3] = 0xff; a.x[4] = 0x11; a.x[5] = 0x22; a.x[6] = 0x33; a.x[7] = 0x44; b = a; DUK__DBLUNION_CMP_TRUE(&a, &b); return error_count; #else DUK_D(DUK_DPRINT("skip double aliasing self test when duk_tval is not packed")); return 0; #endif }