Skip to content

Commit

Permalink
Merge pull request #6680 from thomasvl/objc_fix
Browse files Browse the repository at this point in the history
Pull the ObjC fixes from #6679 to the 3.9.x branch
  • Loading branch information
TeBoring committed Sep 20, 2019
2 parents 655310c + a0eb83f commit cfee7d8
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 14 deletions.
12 changes: 10 additions & 2 deletions objectivec/GPBCodedInputStream.m
Expand Up @@ -93,14 +93,22 @@ static int8_t ReadRawByte(GPBCodedInputStreamState *state) {

static int32_t ReadRawLittleEndian32(GPBCodedInputStreamState *state) {
CheckSize(state, sizeof(int32_t));
int32_t value = OSReadLittleInt32(state->bytes, state->bufferPos);
// Not using OSReadLittleInt32 because it has undocumented dependency
// on reads being aligned.
int32_t value;
memcpy(&value, state->bytes + state->bufferPos, sizeof(int32_t));
value = OSSwapLittleToHostInt32(value);
state->bufferPos += sizeof(int32_t);
return value;
}

static int64_t ReadRawLittleEndian64(GPBCodedInputStreamState *state) {
CheckSize(state, sizeof(int64_t));
int64_t value = OSReadLittleInt64(state->bytes, state->bufferPos);
// Not using OSReadLittleInt64 because it has undocumented dependency
// on reads being aligned.
int64_t value;
memcpy(&value, state->bytes + state->bufferPos, sizeof(int64_t));
value = OSSwapLittleToHostInt64(value);
state->bufferPos += sizeof(int64_t);
return value;
}
Expand Down
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 cfee7d8

Please sign in to comment.