@@ -1746,6 +1746,7 @@ extension _JSONDecoder : SingleValueDecodingContainer {
17461746// MARK: - Concrete Value Representations
17471747
17481748extension _JSONDecoder {
1749+
17491750 /// Returns the given value unboxed from a container.
17501751 fileprivate func unbox( _ value: Any , as type: Bool . Type ) throws -> Bool ? {
17511752 guard !( value is NSNull ) else { return nil }
@@ -1765,7 +1766,7 @@ extension _JSONDecoder {
17651766 fileprivate func unbox( _ value: Any , as type: Int . Type ) throws -> Int ? {
17661767 guard !( value is NSNull ) else { return nil }
17671768
1768- guard let number = value as? NSNumber else {
1769+ guard let number = value as? NSNumber , number !== kCFBooleanTrue , number !== kCFBooleanFalse else {
17691770 throw DecodingError . _typeMismatch ( at: self . codingPath, expectation: type, reality: value)
17701771 }
17711772
@@ -1780,7 +1781,7 @@ extension _JSONDecoder {
17801781 fileprivate func unbox( _ value: Any , as type: Int8 . Type ) throws -> Int8 ? {
17811782 guard !( value is NSNull ) else { return nil }
17821783
1783- guard let number = value as? NSNumber else {
1784+ guard let number = value as? NSNumber , number !== kCFBooleanTrue , number !== kCFBooleanFalse else {
17841785 throw DecodingError . _typeMismatch ( at: self . codingPath, expectation: type, reality: value)
17851786 }
17861787
@@ -1795,7 +1796,7 @@ extension _JSONDecoder {
17951796 fileprivate func unbox( _ value: Any , as type: Int16 . Type ) throws -> Int16 ? {
17961797 guard !( value is NSNull ) else { return nil }
17971798
1798- guard let number = value as? NSNumber else {
1799+ guard let number = value as? NSNumber , number !== kCFBooleanTrue , number !== kCFBooleanFalse else {
17991800 throw DecodingError . _typeMismatch ( at: self . codingPath, expectation: type, reality: value)
18001801 }
18011802
@@ -1810,7 +1811,7 @@ extension _JSONDecoder {
18101811 fileprivate func unbox( _ value: Any , as type: Int32 . Type ) throws -> Int32 ? {
18111812 guard !( value is NSNull ) else { return nil }
18121813
1813- guard let number = value as? NSNumber else {
1814+ guard let number = value as? NSNumber , number !== kCFBooleanTrue , number !== kCFBooleanFalse else {
18141815 throw DecodingError . _typeMismatch ( at: self . codingPath, expectation: type, reality: value)
18151816 }
18161817
@@ -1825,7 +1826,7 @@ extension _JSONDecoder {
18251826 fileprivate func unbox( _ value: Any , as type: Int64 . Type ) throws -> Int64 ? {
18261827 guard !( value is NSNull ) else { return nil }
18271828
1828- guard let number = value as? NSNumber else {
1829+ guard let number = value as? NSNumber , number !== kCFBooleanTrue , number !== kCFBooleanFalse else {
18291830 throw DecodingError . _typeMismatch ( at: self . codingPath, expectation: type, reality: value)
18301831 }
18311832
@@ -1840,7 +1841,7 @@ extension _JSONDecoder {
18401841 fileprivate func unbox( _ value: Any , as type: UInt . Type ) throws -> UInt ? {
18411842 guard !( value is NSNull ) else { return nil }
18421843
1843- guard let number = value as? NSNumber else {
1844+ guard let number = value as? NSNumber , number !== kCFBooleanTrue , number !== kCFBooleanFalse else {
18441845 throw DecodingError . _typeMismatch ( at: self . codingPath, expectation: type, reality: value)
18451846 }
18461847
@@ -1855,7 +1856,7 @@ extension _JSONDecoder {
18551856 fileprivate func unbox( _ value: Any , as type: UInt8 . Type ) throws -> UInt8 ? {
18561857 guard !( value is NSNull ) else { return nil }
18571858
1858- guard let number = value as? NSNumber else {
1859+ guard let number = value as? NSNumber , number !== kCFBooleanTrue , number !== kCFBooleanFalse else {
18591860 throw DecodingError . _typeMismatch ( at: self . codingPath, expectation: type, reality: value)
18601861 }
18611862
@@ -1870,7 +1871,7 @@ extension _JSONDecoder {
18701871 fileprivate func unbox( _ value: Any , as type: UInt16 . Type ) throws -> UInt16 ? {
18711872 guard !( value is NSNull ) else { return nil }
18721873
1873- guard let number = value as? NSNumber else {
1874+ guard let number = value as? NSNumber , number !== kCFBooleanTrue , number !== kCFBooleanFalse else {
18741875 throw DecodingError . _typeMismatch ( at: self . codingPath, expectation: type, reality: value)
18751876 }
18761877
@@ -1885,7 +1886,7 @@ extension _JSONDecoder {
18851886 fileprivate func unbox( _ value: Any , as type: UInt32 . Type ) throws -> UInt32 ? {
18861887 guard !( value is NSNull ) else { return nil }
18871888
1888- guard let number = value as? NSNumber else {
1889+ guard let number = value as? NSNumber , number !== kCFBooleanTrue , number !== kCFBooleanFalse else {
18891890 throw DecodingError . _typeMismatch ( at: self . codingPath, expectation: type, reality: value)
18901891 }
18911892
@@ -1900,7 +1901,7 @@ extension _JSONDecoder {
19001901 fileprivate func unbox( _ value: Any , as type: UInt64 . Type ) throws -> UInt64 ? {
19011902 guard !( value is NSNull ) else { return nil }
19021903
1903- guard let number = value as? NSNumber else {
1904+ guard let number = value as? NSNumber , number !== kCFBooleanTrue , number !== kCFBooleanFalse else {
19041905 throw DecodingError . _typeMismatch ( at: self . codingPath, expectation: type, reality: value)
19051906 }
19061907
@@ -1915,7 +1916,7 @@ extension _JSONDecoder {
19151916 fileprivate func unbox( _ value: Any , as type: Float . Type ) throws -> Float ? {
19161917 guard !( value is NSNull ) else { return nil }
19171918
1918- if let number = value as? NSNumber {
1919+ if let number = value as? NSNumber , number !== kCFBooleanTrue , number !== kCFBooleanFalse {
19191920 // We are willing to return a Float by losing precision:
19201921 // * If the original value was integral,
19211922 // * and the integral value was > Float.greatestFiniteMagnitude, we will fail
@@ -1961,7 +1962,7 @@ extension _JSONDecoder {
19611962 fileprivate func unbox( _ value: Any , as type: Double . Type ) throws -> Double ? {
19621963 guard !( value is NSNull ) else { return nil }
19631964
1964- if let number = value as? NSNumber {
1965+ if let number = value as? NSNumber , number !== kCFBooleanTrue , number !== kCFBooleanFalse {
19651966 // We are always willing to return the number as a Double:
19661967 // * 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
19671968 // * If it was a Float or Double, you will get back the precise value
0 commit comments