Skip to content

Commit b23ca90

Browse files
committed
Merge branch 'master' of github.com:apple/swift-corelibs-foundation into json-encoder
2 parents 43e0e4a + ee845e3 commit b23ca90

File tree

7 files changed

+2117
-345
lines changed

7 files changed

+2117
-345
lines changed

CoreFoundation/NumberDate.subproj/CFNumber.c

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1107,6 +1107,13 @@ static inline void _CFNumberInit(CFNumberRef result, CFNumberType type, const vo
11071107
__CFBitfieldSetValue(((struct __CFNumber *)result)->_base._cfinfo[CF_INFO_BITS], 4, 0, (uint8_t)__CFNumberTypeTable[type].canonicalType);
11081108
}
11091109

1110+
void _CFNumberInitInt128(CFNumberRef result, int64_t value) {
1111+
CFSInt128Struct int128value;
1112+
int128value.high = 0;
1113+
int128value.low = value;
1114+
_CFNumberInit(result, kCFNumberSInt128Type, &int128value);
1115+
}
1116+
11101117
void _CFNumberInitBool(CFNumberRef result, Boolean value) {
11111118
_CFNumberInit(result, kCFNumberCharType, &value);
11121119
}
@@ -1116,39 +1123,70 @@ void _CFNumberInitInt8(CFNumberRef result, int8_t value) {
11161123
}
11171124

11181125
void _CFNumberInitUInt8(CFNumberRef result, uint8_t value) {
1119-
_CFNumberInit(result, kCFNumberCharType, &value);
1126+
if (value > INT8_MAX) {
1127+
_CFNumberInitInt16(result, value);
1128+
} else {
1129+
_CFNumberInit(result, kCFNumberCharType, &value);
1130+
}
11201131
}
11211132

11221133
void _CFNumberInitInt16(CFNumberRef result, int16_t value) {
11231134
_CFNumberInit(result, kCFNumberShortType, &value);
11241135
}
11251136

11261137
void _CFNumberInitUInt16(CFNumberRef result, uint16_t value) {
1127-
_CFNumberInit(result, kCFNumberShortType, &value);
1138+
if (value > INT16_MAX) {
1139+
_CFNumberInitInt32(result, value);
1140+
} else {
1141+
_CFNumberInit(result, kCFNumberShortType, &value);
1142+
}
11281143
}
11291144

11301145
void _CFNumberInitInt32(CFNumberRef result, int32_t value) {
11311146
_CFNumberInit(result, kCFNumberIntType, &value);
11321147
}
11331148

11341149
void _CFNumberInitUInt32(CFNumberRef result, uint32_t value) {
1135-
_CFNumberInit(result, kCFNumberIntType, &value);
1150+
if (value > INT32_MAX) {
1151+
_CFNumberInitInt64(result, value);
1152+
} else {
1153+
_CFNumberInit(result, kCFNumberIntType, &value);
1154+
}
11361155
}
11371156

11381157
void _CFNumberInitInt(CFNumberRef result, long value) {
11391158
_CFNumberInit(result, kCFNumberLongType, &value);
11401159
}
11411160

11421161
void _CFNumberInitUInt(CFNumberRef result, unsigned long value) {
1143-
_CFNumberInit(result, kCFNumberLongType, &value);
1162+
if (value > LONG_MAX) {
1163+
switch (sizeof(unsigned long)) {
1164+
case 4:
1165+
_CFNumberInitInt64(result, value);
1166+
break;
1167+
1168+
case 8:
1169+
_CFNumberInitInt128(result, value);
1170+
break;
1171+
1172+
default:
1173+
CFAssert1(false, __kCFLogAssertion, "Unexpected unsigned long type size: %d", sizeof(unsigned long));
1174+
}
1175+
} else {
1176+
_CFNumberInit(result, kCFNumberLongType, &value);
1177+
}
11441178
}
11451179

11461180
void _CFNumberInitInt64(CFNumberRef result, int64_t value) {
11471181
_CFNumberInit(result, kCFNumberLongLongType, &value);
11481182
}
11491183

11501184
void _CFNumberInitUInt64(CFNumberRef result, uint64_t value) {
1151-
_CFNumberInit(result, kCFNumberLongLongType, &value);
1185+
if (value > INT64_MAX) {
1186+
_CFNumberInitInt128(result, value);
1187+
} else {
1188+
_CFNumberInit(result, kCFNumberLongLongType, &value);
1189+
}
11521190
}
11531191

11541192
void _CFNumberInitFloat(CFNumberRef result, float value) {

0 commit comments

Comments
 (0)