Skip to content

Commit 33f03a6

Browse files
author
rposts
committed
Fix case index on Big Endian
1 parent 99337fc commit 33f03a6

File tree

1 file changed

+11
-6
lines changed

1 file changed

+11
-6
lines changed

stdlib/public/runtime/EnumImpl.h

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -110,16 +110,19 @@ inline unsigned getEnumTagSinglePayloadImpl(
110110
unsigned caseIndexFromExtraTagBits =
111111
payloadSize >= 4 ? 0 : (extraTagBits - 1U) << (payloadSize * 8U);
112112

113+
#if defined(__BIG_ENDIAN__)
114+
// On BE high order bytes contain the index
115+
unsigned long caseIndexFromValue = 0;
116+
unsigned numPayloadTagBytes = std::min(size_t(8), payloadSize);
117+
if (numPayloadTagBytes)
118+
memcpy(reinterpret_cast<uint8_t *>(&caseIndexFromValue) + 8 -
119+
numPayloadTagBytes,
120+
valueAddr, numPayloadTagBytes);
121+
#else
113122
// In practice we should need no more than four bytes from the payload
114123
// area.
115124
unsigned caseIndexFromValue = 0;
116125
unsigned numPayloadTagBytes = std::min(size_t(4), payloadSize);
117-
#if defined(__BIG_ENDIAN__)
118-
if (numPayloadTagBytes)
119-
small_memcpy(reinterpret_cast<uint8_t *>(&caseIndexFromValue) + 4 -
120-
numPayloadTagBytes,
121-
valueAddr, numPayloadTagBytes, true);
122-
#else
123126
if (numPayloadTagBytes)
124127
small_memcpy(&caseIndexFromValue, valueAddr,
125128
numPayloadTagBytes, true);
@@ -192,6 +195,8 @@ inline void storeEnumTagSinglePayloadImpl(
192195
reinterpret_cast<uint8_t *>(&payloadIndex) + 4 -
193196
numPayloadTagBytes,
194197
numPayloadTagBytes, true);
198+
if (payloadSize > 4)
199+
memset(valueAddr + 4, 0, payloadSize - 4);
195200
if (numExtraTagBytes)
196201
small_memcpy(extraTagBitAddr,
197202
reinterpret_cast<uint8_t *>(&extraTagIndex) + 4 -

0 commit comments

Comments
 (0)