Skip to content

Commit def84d9

Browse files
committed
Merge pull request swiftlang#52 from argon/hotfix/repair-NSNumber
[SR-71] Repair NSNumber behaviour
2 parents 0bfcd82 + a1aa91b commit def84d9

File tree

2 files changed

+68
-1
lines changed

2 files changed

+68
-1
lines changed

CoreFoundation/NumberDate.subproj/CFNumber.c

+1
Original file line numberDiff line numberDiff line change
@@ -1099,6 +1099,7 @@ static inline void _CFNumberInit(CFNumberRef result, CFNumberType type, const vo
10991099
case kCFNumberFloat32Type: memmove((void *)&result->_pad, valuePtr, 4); break;
11001100
case kCFNumberFloat64Type: memmove((void *)&result->_pad, valuePtr, 8); break;
11011101
}
1102+
__CFBitfieldSetValue(((struct __CFNumber *)result)->_base._cfinfo[CF_INFO_BITS], 4, 0, (uint8_t)__CFNumberTypeTable[type].canonicalType);
11021103
}
11031104

11041105
CF_EXPORT void _CFNumberInitBool(CFNumberRef result, Boolean value) {

TestFoundation/TestNSNumber.swift

+67-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,9 @@ class TestNSNumber : XCTestCase {
2323
("test_NumberWithBool", test_NumberWithBool ),
2424
("test_numberWithChar", test_numberWithChar ),
2525
("test_numberWithUnsignedChar", test_numberWithUnsignedChar ),
26-
("test_numberWithShort", test_numberWithShort ),
26+
("test_numberWithShort", test_numberWithShort ),
27+
("test_numberWithFloat", test_numberWithFloat ),
28+
("test_numberWithDouble", test_numberWithDouble ),
2729
]
2830
}
2931

@@ -180,4 +182,68 @@ class TestNSNumber : XCTestCase {
180182
XCTAssertEqual(NSNumber(short: Int16(-37)).doubleValue, Double(-37))
181183
XCTAssertEqual(NSNumber(short: Int16(42)).doubleValue, Double(42))
182184
}
185+
186+
func test_numberWithFloat() {
187+
XCTAssertEqual(NSNumber(float: Float(0)).boolValue, false)
188+
XCTAssertEqual(NSNumber(float: Float(0)).charValue, Int8(0))
189+
XCTAssertEqual(NSNumber(float: Float(0)).unsignedCharValue, UInt8(0))
190+
XCTAssertEqual(NSNumber(float: Float(0)).shortValue, Int16(0))
191+
XCTAssertEqual(NSNumber(float: Float(0)).unsignedShortValue, UInt16(0))
192+
XCTAssertEqual(NSNumber(float: Float(0)).intValue, Int32(0))
193+
XCTAssertEqual(NSNumber(float: Float(0)).unsignedIntValue, UInt32(0))
194+
XCTAssertEqual(NSNumber(float: Float(0)).longLongValue, Int64(0))
195+
XCTAssertEqual(NSNumber(float: Float(0)).unsignedLongLongValue, UInt64(0))
196+
XCTAssertEqual(NSNumber(float: Float(-37)).boolValue, true);
197+
XCTAssertEqual(NSNumber(float: Float(-37)).charValue, Int8(-37))
198+
XCTAssertEqual(NSNumber(float: Float(-37)).shortValue, Int16(-37))
199+
XCTAssertEqual(NSNumber(float: Float(-37)).intValue, Int32(-37))
200+
XCTAssertEqual(NSNumber(float: Float(-37)).longLongValue, Int64(-37))
201+
XCTAssertEqual(NSNumber(float: Float(42)).boolValue, true)
202+
XCTAssertEqual(NSNumber(float: Float(42)).charValue, Int8(42))
203+
XCTAssertEqual(NSNumber(float: Float(42)).unsignedCharValue, UInt8(42))
204+
XCTAssertEqual(NSNumber(float: Float(42)).shortValue, Int16(42))
205+
XCTAssertEqual(NSNumber(float: Float(42)).unsignedShortValue, UInt16(42))
206+
XCTAssertEqual(NSNumber(float: Float(42)).intValue, Int32(42))
207+
XCTAssertEqual(NSNumber(float: Float(42)).unsignedIntValue, UInt32(42))
208+
XCTAssertEqual(NSNumber(float: Float(42)).longLongValue, Int64(42))
209+
XCTAssertEqual(NSNumber(float: Float(42)).unsignedLongLongValue, UInt64(42))
210+
XCTAssertEqual(NSNumber(float: Float(0)).floatValue, Float(0))
211+
XCTAssertEqual(NSNumber(float: Float(-37.5)).floatValue, Float(-37.5))
212+
XCTAssertEqual(NSNumber(float: Float(42.1)).floatValue, Float(42.1))
213+
XCTAssertEqual(NSNumber(float: Float(0)).doubleValue, Double(0))
214+
XCTAssertEqual(NSNumber(float: Float(-37.5)).doubleValue, Double(-37.5))
215+
XCTAssertEqual(NSNumber(float: Float(42.5)).doubleValue, Double(42.5))
216+
}
217+
218+
func test_numberWithDouble() {
219+
XCTAssertEqual(NSNumber(double: Double(0)).boolValue, false)
220+
XCTAssertEqual(NSNumber(double: Double(0)).charValue, Int8(0))
221+
XCTAssertEqual(NSNumber(double: Double(0)).unsignedCharValue, UInt8(0))
222+
XCTAssertEqual(NSNumber(double: Double(0)).shortValue, Int16(0))
223+
XCTAssertEqual(NSNumber(double: Double(0)).unsignedShortValue, UInt16(0))
224+
XCTAssertEqual(NSNumber(double: Double(0)).intValue, Int32(0))
225+
XCTAssertEqual(NSNumber(double: Double(0)).unsignedIntValue, UInt32(0))
226+
XCTAssertEqual(NSNumber(double: Double(0)).longLongValue, Int64(0))
227+
XCTAssertEqual(NSNumber(double: Double(0)).unsignedLongLongValue, UInt64(0))
228+
XCTAssertEqual(NSNumber(double: Double(-37)).boolValue, true);
229+
XCTAssertEqual(NSNumber(double: Double(-37)).charValue, Int8(-37))
230+
XCTAssertEqual(NSNumber(double: Double(-37)).shortValue, Int16(-37))
231+
XCTAssertEqual(NSNumber(double: Double(-37)).intValue, Int32(-37))
232+
XCTAssertEqual(NSNumber(double: Double(-37)).longLongValue, Int64(-37))
233+
XCTAssertEqual(NSNumber(double: Double(42)).boolValue, true)
234+
XCTAssertEqual(NSNumber(double: Double(42)).charValue, Int8(42))
235+
XCTAssertEqual(NSNumber(double: Double(42)).unsignedCharValue, UInt8(42))
236+
XCTAssertEqual(NSNumber(double: Double(42)).shortValue, Int16(42))
237+
XCTAssertEqual(NSNumber(double: Double(42)).unsignedShortValue, UInt16(42))
238+
XCTAssertEqual(NSNumber(double: Double(42)).intValue, Int32(42))
239+
XCTAssertEqual(NSNumber(double: Double(42)).unsignedIntValue, UInt32(42))
240+
XCTAssertEqual(NSNumber(double: Double(42)).longLongValue, Int64(42))
241+
XCTAssertEqual(NSNumber(double: Double(42)).unsignedLongLongValue, UInt64(42))
242+
XCTAssertEqual(NSNumber(double: Double(0)).floatValue, Float(0))
243+
XCTAssertEqual(NSNumber(double: Double(-37.5)).floatValue, Float(-37.5))
244+
XCTAssertEqual(NSNumber(double: Double(42.1)).floatValue, Float(42.1))
245+
XCTAssertEqual(NSNumber(double: Double(0)).doubleValue, Double(0))
246+
XCTAssertEqual(NSNumber(double: Double(-37.5)).doubleValue, Double(-37.5))
247+
XCTAssertEqual(NSNumber(double: Double(42.1)).doubleValue, Double(42.1))
248+
}
183249
}

0 commit comments

Comments
 (0)