Эх сурвалжийг харах

[ObjC] Don't use unions and instead use memcpy for the type swaps. (#6672)

The code in question hasn't change in a long time so the cause of
https://github.com/firebase/firebase-ios-sdk/issues/3851 still appears to be
an Xcode 11 clang change/bug; but this does appear to be slightly better
code for the work being done.

Cleanup along the way for #6679
Thomas Van Lenten 6 жил өмнө
parent
commit
5846439713

+ 16 - 12
objectivec/GPBUtilities_PackagePrivate.h

@@ -71,27 +71,31 @@ GPB_INLINE void GPBDebugCheckRuntimeVersion() {
 // Conversion functions for de/serializing floating point types.
 
 GPB_INLINE int64_t GPBConvertDoubleToInt64(double v) {
-  union { double f; int64_t i; } u;
-  u.f = v;
-  return u.i;
+  GPBInternalCompileAssert(sizeof(double) == sizeof(int64_t), double_not_64_bits);
+  int64_t result;
+  memcpy(&result, &v, sizeof(result));
+  return result;
 }
 
 GPB_INLINE int32_t GPBConvertFloatToInt32(float v) {
-  union { float f; int32_t i; } u;
-  u.f = v;
-  return u.i;
+  GPBInternalCompileAssert(sizeof(float) == sizeof(int32_t), float_not_32_bits);
+  int32_t result;
+  memcpy(&result, &v, sizeof(result));
+  return result;
 }
 
 GPB_INLINE double GPBConvertInt64ToDouble(int64_t v) {
-  union { double f; int64_t i; } u;
-  u.i = v;
-  return u.f;
+  GPBInternalCompileAssert(sizeof(double) == sizeof(int64_t), double_not_64_bits);
+  double result;
+  memcpy(&result, &v, sizeof(result));
+  return result;
 }
 
 GPB_INLINE float GPBConvertInt32ToFloat(int32_t v) {
-  union { float f; int32_t i; } u;
-  u.i = v;
-  return u.f;
+  GPBInternalCompileAssert(sizeof(float) == sizeof(int32_t), float_not_32_bits);
+  float result;
+  memcpy(&result, &v, sizeof(result));
+  return result;
 }
 
 GPB_INLINE int32_t GPBLogicalRightShift32(int32_t value, int32_t spaces) {