@@ -1107,6 +1107,13 @@ static inline void _CFNumberInit(CFNumberRef result, CFNumberType type, const vo
1107
1107
__CFBitfieldSetValue (((struct __CFNumber * )result )-> _base ._cfinfo [CF_INFO_BITS ], 4 , 0 , (uint8_t )__CFNumberTypeTable [type ].canonicalType );
1108
1108
}
1109
1109
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
+
1110
1117
void _CFNumberInitBool (CFNumberRef result , Boolean value ) {
1111
1118
_CFNumberInit (result , kCFNumberCharType , & value );
1112
1119
}
@@ -1116,39 +1123,70 @@ void _CFNumberInitInt8(CFNumberRef result, int8_t value) {
1116
1123
}
1117
1124
1118
1125
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
+ }
1120
1131
}
1121
1132
1122
1133
void _CFNumberInitInt16 (CFNumberRef result , int16_t value ) {
1123
1134
_CFNumberInit (result , kCFNumberShortType , & value );
1124
1135
}
1125
1136
1126
1137
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
+ }
1128
1143
}
1129
1144
1130
1145
void _CFNumberInitInt32 (CFNumberRef result , int32_t value ) {
1131
1146
_CFNumberInit (result , kCFNumberIntType , & value );
1132
1147
}
1133
1148
1134
1149
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
+ }
1136
1155
}
1137
1156
1138
1157
void _CFNumberInitInt (CFNumberRef result , long value ) {
1139
1158
_CFNumberInit (result , kCFNumberLongType , & value );
1140
1159
}
1141
1160
1142
1161
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
+ }
1144
1178
}
1145
1179
1146
1180
void _CFNumberInitInt64 (CFNumberRef result , int64_t value ) {
1147
1181
_CFNumberInit (result , kCFNumberLongLongType , & value );
1148
1182
}
1149
1183
1150
1184
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
+ }
1152
1190
}
1153
1191
1154
1192
void _CFNumberInitFloat (CFNumberRef result , float value ) {
0 commit comments