File tree Expand file tree Collapse file tree 2 files changed +23
-13
lines changed
Expand file tree Collapse file tree 2 files changed +23
-13
lines changed Original file line number Diff line number Diff line change @@ -84,6 +84,9 @@ namespace Js
8484
8585 };
8686
87+ typedef uint32 uint32_aliased __attribute__ ((__may_alias__));
88+ typedef double double_aliased __attribute__ ((__may_alias__));
89+
8790 class NumberUtilities : public NumberUtilitiesBase
8891 {
8992 public:
@@ -92,8 +95,8 @@ namespace Js
9295 static uint32 MulLu (uint32 lu1, uint32 lu2, uint32 *pluHi);
9396 static int AddLu (uint32 *plu1, uint32 lu2);
9497
95- static uint32 &LuHiDbl (double &dbl);
96- static uint32 &LuLoDbl (double &dbl);
98+ static uint32_aliased &LuHiDbl (double_aliased &dbl);
99+ static uint32_aliased &LuLoDbl (double_aliased &dbl);
97100 static INT64 TryToInt64 (double d);
98101 static bool IsValidTryToInt64 (__int64 value); // Whether TryToInt64 resulted in a valid value.
99102
Original file line number Diff line number Diff line change 5050
5151namespace Js
5252{
53- NUMBER_UTIL_INLINE uint32 & NumberUtilities::LuHiDbl ( double &dbl)
53+ union DoubleAccessor
5454 {
55+ double d;
56+ struct
57+ {
5558#if defined(__BIG_ENDIAN__)
56- return ((uint32 *)&dbl)[0 ];
57- #else // !BIG_ENDIAN
58- return ((uint32 *)&dbl)[1 ];
59- #endif // !BIG_ENDIAN
59+ uint32 hi;
60+ uint32 lo;
61+ #else
62+ uint32 lo;
63+ uint32 hi;
64+ #endif
65+ } u;
66+ };
67+
68+ NUMBER_UTIL_INLINE uint32_aliased &NumberUtilities::LuHiDbl (double_aliased &dbl)
69+ {
70+ return reinterpret_cast <DoubleAccessor*>(&dbl)->u .hi ;
6071 }
6172
62- NUMBER_UTIL_INLINE uint32 &NumberUtilities::LuLoDbl (double &dbl)
73+ NUMBER_UTIL_INLINE uint32_aliased &NumberUtilities::LuLoDbl (double_aliased &dbl)
6374 {
64- #if defined(__BIG_ENDIAN__)
65- return ((uint32 *)&dbl)[1 ];
66- #else // !BIG_ENDIAN
67- return ((uint32 *)&dbl)[0 ];
68- #endif // !BIG_ENDIAN
75+ return reinterpret_cast <DoubleAccessor*>(&dbl)->u .lo ;
6976 }
7077
7178#if defined(_M_X64) && defined(_MSC_VER) && !defined(__clang__)
You can’t perform that action at this time.
0 commit comments