Skip to content

Commit f3658e4

Browse files
committed
SR-7017: Update boolean check to match Foundation overlay method.
1 parent 2f130da commit f3658e4

File tree

1 file changed

+12
-30
lines changed

1 file changed

+12
-30
lines changed

Foundation/JSONEncoder.swift

Lines changed: 12 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1747,12 +1747,6 @@ extension _JSONDecoder : SingleValueDecodingContainer {
17471747

17481748
extension _JSONDecoder {
17491749

1750-
private func _checkNotBoolean(_ number: NSNumber, type: Any.Type) throws {
1751-
guard number._cfTypeID != CFBooleanGetTypeID() else {
1752-
throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: Bool())
1753-
}
1754-
}
1755-
17561750
/// Returns the given value unboxed from a container.
17571751
fileprivate func unbox(_ value: Any, as type: Bool.Type) throws -> Bool? {
17581752
guard !(value is NSNull) else { return nil }
@@ -1772,11 +1766,10 @@ extension _JSONDecoder {
17721766
fileprivate func unbox(_ value: Any, as type: Int.Type) throws -> Int? {
17731767
guard !(value is NSNull) else { return nil }
17741768

1775-
guard let number = value as? NSNumber else {
1769+
guard let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse else {
17761770
throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value)
17771771
}
17781772

1779-
try _checkNotBoolean(number, type: type)
17801773
let int = number.intValue
17811774
guard NSNumber(value: int) == number else {
17821775
throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed JSON number <\(number)> does not fit in \(type)."))
@@ -1788,11 +1781,10 @@ extension _JSONDecoder {
17881781
fileprivate func unbox(_ value: Any, as type: Int8.Type) throws -> Int8? {
17891782
guard !(value is NSNull) else { return nil }
17901783

1791-
guard let number = value as? NSNumber else {
1784+
guard let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse else {
17921785
throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value)
17931786
}
17941787

1795-
try _checkNotBoolean(number, type: type)
17961788
let int8 = number.int8Value
17971789
guard NSNumber(value: int8) == number else {
17981790
throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed JSON number <\(number)> does not fit in \(type)."))
@@ -1804,11 +1796,10 @@ extension _JSONDecoder {
18041796
fileprivate func unbox(_ value: Any, as type: Int16.Type) throws -> Int16? {
18051797
guard !(value is NSNull) else { return nil }
18061798

1807-
guard let number = value as? NSNumber else {
1799+
guard let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse else {
18081800
throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value)
18091801
}
18101802

1811-
try _checkNotBoolean(number, type: type)
18121803
let int16 = number.int16Value
18131804
guard NSNumber(value: int16) == number else {
18141805
throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed JSON number <\(number)> does not fit in \(type)."))
@@ -1820,11 +1811,10 @@ extension _JSONDecoder {
18201811
fileprivate func unbox(_ value: Any, as type: Int32.Type) throws -> Int32? {
18211812
guard !(value is NSNull) else { return nil }
18221813

1823-
guard let number = value as? NSNumber else {
1814+
guard let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse else {
18241815
throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value)
18251816
}
18261817

1827-
try _checkNotBoolean(number, type: type)
18281818
let int32 = number.int32Value
18291819
guard NSNumber(value: int32) == number else {
18301820
throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed JSON number <\(number)> does not fit in \(type)."))
@@ -1836,11 +1826,10 @@ extension _JSONDecoder {
18361826
fileprivate func unbox(_ value: Any, as type: Int64.Type) throws -> Int64? {
18371827
guard !(value is NSNull) else { return nil }
18381828

1839-
guard let number = value as? NSNumber else {
1829+
guard let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse else {
18401830
throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value)
18411831
}
18421832

1843-
try _checkNotBoolean(number, type: type)
18441833
let int64 = number.int64Value
18451834
guard NSNumber(value: int64) == number else {
18461835
throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed JSON number <\(number)> does not fit in \(type)."))
@@ -1852,11 +1841,10 @@ extension _JSONDecoder {
18521841
fileprivate func unbox(_ value: Any, as type: UInt.Type) throws -> UInt? {
18531842
guard !(value is NSNull) else { return nil }
18541843

1855-
guard let number = value as? NSNumber else {
1844+
guard let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse else {
18561845
throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value)
18571846
}
18581847

1859-
try _checkNotBoolean(number, type: type)
18601848
let uint = number.uintValue
18611849
guard NSNumber(value: uint) == number else {
18621850
throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed JSON number <\(number)> does not fit in \(type)."))
@@ -1868,11 +1856,10 @@ extension _JSONDecoder {
18681856
fileprivate func unbox(_ value: Any, as type: UInt8.Type) throws -> UInt8? {
18691857
guard !(value is NSNull) else { return nil }
18701858

1871-
guard let number = value as? NSNumber else {
1859+
guard let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse else {
18721860
throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value)
18731861
}
18741862

1875-
try _checkNotBoolean(number, type: type)
18761863
let uint8 = number.uint8Value
18771864
guard NSNumber(value: uint8) == number else {
18781865
throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed JSON number <\(number)> does not fit in \(type)."))
@@ -1884,11 +1871,10 @@ extension _JSONDecoder {
18841871
fileprivate func unbox(_ value: Any, as type: UInt16.Type) throws -> UInt16? {
18851872
guard !(value is NSNull) else { return nil }
18861873

1887-
guard let number = value as? NSNumber else {
1874+
guard let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse else {
18881875
throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value)
18891876
}
18901877

1891-
try _checkNotBoolean(number, type: type)
18921878
let uint16 = number.uint16Value
18931879
guard NSNumber(value: uint16) == number else {
18941880
throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed JSON number <\(number)> does not fit in \(type)."))
@@ -1900,11 +1886,10 @@ extension _JSONDecoder {
19001886
fileprivate func unbox(_ value: Any, as type: UInt32.Type) throws -> UInt32? {
19011887
guard !(value is NSNull) else { return nil }
19021888

1903-
guard let number = value as? NSNumber else {
1889+
guard let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse else {
19041890
throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value)
19051891
}
19061892

1907-
try _checkNotBoolean(number, type: type)
19081893
let uint32 = number.uint32Value
19091894
guard NSNumber(value: uint32) == number else {
19101895
throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed JSON number <\(number)> does not fit in \(type)."))
@@ -1916,11 +1901,10 @@ extension _JSONDecoder {
19161901
fileprivate func unbox(_ value: Any, as type: UInt64.Type) throws -> UInt64? {
19171902
guard !(value is NSNull) else { return nil }
19181903

1919-
guard let number = value as? NSNumber else {
1904+
guard let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse else {
19201905
throw DecodingError._typeMismatch(at: self.codingPath, expectation: type, reality: value)
19211906
}
19221907

1923-
try _checkNotBoolean(number, type: type)
19241908
let uint64 = number.uint64Value
19251909
guard NSNumber(value: uint64) == number else {
19261910
throw DecodingError.dataCorrupted(DecodingError.Context(codingPath: self.codingPath, debugDescription: "Parsed JSON number <\(number)> does not fit in \(type)."))
@@ -1932,8 +1916,7 @@ extension _JSONDecoder {
19321916
fileprivate func unbox(_ value: Any, as type: Float.Type) throws -> Float? {
19331917
guard !(value is NSNull) else { return nil }
19341918

1935-
if let number = value as? NSNumber {
1936-
try _checkNotBoolean(number, type: type)
1919+
if let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse {
19371920
// We are willing to return a Float by losing precision:
19381921
// * If the original value was integral,
19391922
// * and the integral value was > Float.greatestFiniteMagnitude, we will fail
@@ -1979,8 +1962,7 @@ extension _JSONDecoder {
19791962
fileprivate func unbox(_ value: Any, as type: Double.Type) throws -> Double? {
19801963
guard !(value is NSNull) else { return nil }
19811964

1982-
if let number = value as? NSNumber {
1983-
try _checkNotBoolean(number, type: type)
1965+
if let number = value as? NSNumber, number !== kCFBooleanTrue, number !== kCFBooleanFalse {
19841966
// We are always willing to return the number as a Double:
19851967
// * If the original value was integral, it is guaranteed to fit in a Double; we are willing to lose precision past 2^53 if you encoded a UInt64 but requested a Double
19861968
// * If it was a Float or Double, you will get back the precise value

0 commit comments

Comments
 (0)