Skip to content

Commit

Permalink
[ObjC] Don't use unions and instead use memcpy for the type swaps.
Browse files Browse the repository at this point in the history
The code in question hasn't change in a long time so the cause of
firebase/firebase-ios-sdk#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.
  • Loading branch information
thomasvl committed Sep 19, 2019
1 parent 3782317 commit 84782b8
Showing 1 changed file with 16 additions and 12 deletions.
28 changes: 16 additions & 12 deletions objectivec/GPBUtilities_PackagePrivate.h
Expand Up @@ -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) {
Expand Down

0 comments on commit 84782b8

Please sign in to comment.