Skip to content

Commit ab86b7a

Browse files
committed
JSONSerialization: Improve number parsing for JSON
- Add _JSONNumber and _NSJSONNumber, an internal subclass of NSNumber, to provide lazy parsing of numbers at time of use. This avoids parsing numbers as Decimal when later bridged to Double/Float and vice-versa which has accuracy issues if converted from one to the other. - Add test cases for SR-7054 and SR-12244
1 parent 883dfb8 commit ab86b7a

15 files changed

+1305
-272
lines changed

Foundation.xcodeproj/project.pbxproj

+17-1
Original file line numberDiff line numberDiff line change
@@ -398,11 +398,15 @@
398398
B910957B1EEF237800A71930 /* NSString-UTF16-BE-data.txt in Resources */ = {isa = PBXBuildFile; fileRef = B91095791EEF237800A71930 /* NSString-UTF16-BE-data.txt */; };
399399
B91161AA2429860900BD2907 /* DataURLProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B91161A82429857D00BD2907 /* DataURLProtocol.swift */; };
400400
B91161AD242A363900BD2907 /* TestDataURLProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B91161AB242A350D00BD2907 /* TestDataURLProtocol.swift */; };
401+
B9292465258E75DD00E24DA5 /* JSONNumber.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9292464258E75DD00E24DA5 /* JSONNumber.swift */; };
402+
B929246F258E772B00E24DA5 /* CMakeLists.txt in Resources */ = {isa = PBXBuildFile; fileRef = B929246E258E772B00E24DA5 /* CMakeLists.txt */; };
401403
B933A79E1F3055F700FE6846 /* NSString-UTF32-BE-data.txt in Resources */ = {isa = PBXBuildFile; fileRef = B933A79C1F3055F600FE6846 /* NSString-UTF32-BE-data.txt */; };
402404
B933A79F1F3055F700FE6846 /* NSString-UTF32-LE-data.txt in Resources */ = {isa = PBXBuildFile; fileRef = B933A79D1F3055F600FE6846 /* NSString-UTF32-LE-data.txt */; };
403405
B940492D223B146800FB4384 /* TestProgressFraction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B940492C223B146800FB4384 /* TestProgressFraction.swift */; };
404406
B94B063C23FDE2BD00B244E8 /* SwiftFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B5D885D1BBC938800234F36 /* SwiftFoundation.framework */; };
405407
B951B5EC1F4E2A2000D8B332 /* TestNSLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = B951B5EB1F4E2A2000D8B332 /* TestNSLock.swift */; };
408+
B959016E25970BE300CACAE3 /* TestNSJSONNumber.swift in Sources */ = {isa = PBXBuildFile; fileRef = B959016D25970BE300CACAE3 /* TestNSJSONNumber.swift */; };
409+
B95901922597102000CACAE3 /* CMakeLists.txt in Resources */ = {isa = PBXBuildFile; fileRef = B95901912597102000CACAE3 /* CMakeLists.txt */; };
406410
B95FC97622B84B0A005DEA0A /* TestNSSortDescriptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 152EF3932283457B001E1269 /* TestNSSortDescriptor.swift */; };
407411
B96C10F625BA1EFD00985A32 /* NSURLComponents.swift in Sources */ = {isa = PBXBuildFile; fileRef = B96C10F525BA1EFD00985A32 /* NSURLComponents.swift */; };
408412
B96C110025BA20A600985A32 /* NSURLQueryItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B96C10FF25BA20A600985A32 /* NSURLQueryItem.swift */; };
@@ -1109,10 +1113,14 @@
11091113
B91095791EEF237800A71930 /* NSString-UTF16-BE-data.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "NSString-UTF16-BE-data.txt"; sourceTree = "<group>"; };
11101114
B91161A82429857D00BD2907 /* DataURLProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataURLProtocol.swift; sourceTree = "<group>"; };
11111115
B91161AB242A350D00BD2907 /* TestDataURLProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestDataURLProtocol.swift; sourceTree = "<group>"; };
1116+
B9292464258E75DD00E24DA5 /* JSONNumber.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = JSONNumber.swift; sourceTree = "<group>"; };
1117+
B929246E258E772B00E24DA5 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
11121118
B933A79C1F3055F600FE6846 /* NSString-UTF32-BE-data.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = "NSString-UTF32-BE-data.txt"; sourceTree = "<group>"; };
11131119
B933A79D1F3055F600FE6846 /* NSString-UTF32-LE-data.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = "NSString-UTF32-LE-data.txt"; sourceTree = "<group>"; };
11141120
B940492C223B146800FB4384 /* TestProgressFraction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestProgressFraction.swift; sourceTree = "<group>"; };
11151121
B951B5EB1F4E2A2000D8B332 /* TestNSLock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestNSLock.swift; sourceTree = "<group>"; };
1122+
B959016D25970BE300CACAE3 /* TestNSJSONNumber.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestNSJSONNumber.swift; sourceTree = "<group>"; };
1123+
B95901912597102000CACAE3 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
11161124
B95FC97222AF0050005DEA0A /* SwiftXCTest.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SwiftXCTest.framework; sourceTree = BUILT_PRODUCTS_DIR; };
11171125
B95FC97422AF051B005DEA0A /* xcode-build.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "xcode-build.sh"; sourceTree = "<group>"; };
11181126
B96C10F525BA1EFD00985A32 /* NSURLComponents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSURLComponents.swift; sourceTree = "<group>"; };
@@ -1777,6 +1785,7 @@
17771785
F023071023F0976B0023DBEC /* Foundation */ = {
17781786
isa = PBXGroup;
17791787
children = (
1788+
B95901912597102000CACAE3 /* CMakeLists.txt */,
17801789
155D3BBB22401D1100B0D38E /* FixtureValues.swift */,
17811790
616068F2225DE5C2004FCC54 /* FTPServer.swift */,
17821791
1520469A1D8AEABE00D02E36 /* HTTPServer.swift */,
@@ -1836,6 +1845,7 @@
18361845
EA66F63D1BF1619600136161 /* TestNSDictionary.swift */,
18371846
CD1C7F7C1E303B47008E331C /* TestNSError.swift */,
18381847
88D28DE61C13AE9000494606 /* TestNSGeometry.swift */,
1848+
B959016D25970BE300CACAE3 /* TestNSJSONNumber.swift */,
18391849
D3A597F11C33C68E00295652 /* TestNSKeyedArchiver.swift */,
18401850
D3A597EF1C33A9E500295652 /* TestNSKeyedUnarchiver.swift */,
18411851
61A395F91C2484490029B337 /* TestNSLocale.swift */,
@@ -2042,6 +2052,7 @@
20422052
F023072323F0A6E50023DBEC /* Foundation */ = {
20432053
isa = PBXGroup;
20442054
children = (
2055+
B929246E258E772B00E24DA5 /* CMakeLists.txt */,
20452056
F023072523F0B4890023DBEC /* Headers */,
20462057
F023072423F0B4140023DBEC /* Resources */,
20472058
EADE0B4D1BD09E0800C49C64 /* AffineTransform.swift */,
@@ -2081,6 +2092,7 @@
20812092
5B8BA1611D0B773A00938C27 /* IndexSet.swift */,
20822093
63DCE9D11EAA430100E9CB02 /* ISO8601DateFormatter.swift */,
20832094
3EDCE5091EF04D8100C2EC04 /* JSONEncoder.swift */,
2095+
B9292464258E75DD00E24DA5 /* JSONNumber.swift */,
20842096
EADE0B641BD15DFF00C49C64 /* JSONSerialization.swift */,
20852097
49D55FA025E84FE5007BD3B3 /* JSONSerialization+Parser.swift */,
20862098
EADE0B661BD15DFF00C49C64 /* LengthFormatter.swift */,
@@ -2100,6 +2112,7 @@
21002112
5BDC3FCD1BCF17D300ED97BB /* NSCFDictionary.swift */,
21012113
5BDC3FCF1BCF17E600ED97BB /* NSCFSet.swift */,
21022114
5BDC3FCB1BCF177E00ED97BB /* NSCFString.swift */,
2115+
15CA750924F8336A007DF6C1 /* NSCFTypeShims.swift */,
21032116
5BDC3F311BCC5DCB00ED97BB /* NSCharacterSet.swift */,
21042117
5BDC3F321BCC5DCB00ED97BB /* NSCoder.swift */,
21052118
EADE0B551BD15DFF00C49C64 /* NSComparisonPredicate.swift */,
@@ -2122,7 +2135,6 @@
21222135
D3BCEB9F1C2F6DDB00295652 /* NSKeyedCoderOldStyleArray.swift */,
21232136
D39A14001C2D6E0A00295652 /* NSKeyedUnarchiver.swift */,
21242137
5BDC3F3B1BCC5DCB00ED97BB /* NSLocale.swift */,
2125-
15CA750924F8336A007DF6C1 /* NSCFTypeShims.swift */,
21262138
5BDC3F3C1BCC5DCB00ED97BB /* NSLock.swift */,
21272139
D3BCEB9D1C2EDED800295652 /* NSLog.swift */,
21282140
5BECBA391D1CAE9A00B39B1F /* NSMeasurement.swift */,
@@ -2713,6 +2725,7 @@
27132725
isa = PBXResourcesBuildPhase;
27142726
buildActionMask = 2147483647;
27152727
files = (
2728+
B929246F258E772B00E24DA5 /* CMakeLists.txt in Resources */,
27162729
F023072623F0B4890023DBEC /* Headers in Resources */,
27172730
B983E32C23F0C69600D9C402 /* Docs in Resources */,
27182731
B983E32E23F0C6E200D9C402 /* CONTRIBUTING.md in Resources */,
@@ -2743,6 +2756,7 @@
27432756
D3A597F71C3415CC00295652 /* NSKeyedUnarchiver-ArrayTest.plist in Resources */,
27442757
CE19A88C1C23AA2300B4CB6A /* NSStringTestData.txt in Resources */,
27452758
E1A03F361C4828650023AF4D /* PropertyList-1.0.dtd in Resources */,
2759+
B95901922597102000CACAE3 /* CMakeLists.txt in Resources */,
27462760
E1A3726F1C31EBFB0023AF4D /* NSXMLDocumentTestData.xml in Resources */,
27472761
E1A03F381C482C730023AF4D /* NSXMLDTDTestData.xml in Resources */,
27482762
D3A598041C349E6A00295652 /* NSKeyedUnarchiver-OrderedSetTest.plist in Resources */,
@@ -2888,6 +2902,7 @@
28882902
5BF7AEC01BCD51F9008F214A /* NSUUID.swift in Sources */,
28892903
5BF7AEB01BCD51F9008F214A /* NSLocale.swift in Sources */,
28902904
EADE0BA31BD15E0000C49C64 /* NSKeyedArchiver.swift in Sources */,
2905+
B9292465258E75DD00E24DA5 /* JSONNumber.swift in Sources */,
28912906
5BF7AEAD1BCD51F9008F214A /* NSError.swift in Sources */,
28922907
EADE0BB61BD15E0000C49C64 /* NSSortDescriptor.swift in Sources */,
28932908
5BF7AEA41BCD51F9008F214A /* Bundle.swift in Sources */,
@@ -3104,6 +3119,7 @@
31043119
90E645DF1E4C89A400D0D47C /* TestNSCache.swift in Sources */,
31053120
5B13B34A1C582D4C00651CE2 /* TestURL.swift in Sources */,
31063121
EA54A6FB1DB16D53009E0809 /* TestObjCRuntime.swift in Sources */,
3122+
B959016E25970BE300CACAE3 /* TestNSJSONNumber.swift in Sources */,
31073123
BB3D7558208A1E500085CFDC /* Imports.swift in Sources */,
31083124
5B13B34D1C582D4C00651CE2 /* TestNSUUID.swift in Sources */,
31093125
15F10CDC218909BF00D88114 /* TestNSCalendar.swift in Sources */,

Sources/Foundation/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ add_library(Foundation
3636
IndexSet.swift
3737
ISO8601DateFormatter.swift
3838
JSONEncoder.swift
39+
JSONNumber.swift
3940
JSONSerialization.swift
4041
JSONSerialization+Parser.swift
4142
LengthFormatter.swift

0 commit comments

Comments
 (0)