Skip to content

Commit 7a310cd

Browse files
committed
JSONSerialization: Improve number parsing for JSON
- Add _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 931dd5f commit 7a310cd

12 files changed

+1275
-273
lines changed

Foundation.xcodeproj/project.pbxproj

+17-1
Original file line numberDiff line numberDiff line change
@@ -397,11 +397,15 @@
397397
B910957B1EEF237800A71930 /* NSString-UTF16-BE-data.txt in Resources */ = {isa = PBXBuildFile; fileRef = B91095791EEF237800A71930 /* NSString-UTF16-BE-data.txt */; };
398398
B91161AA2429860900BD2907 /* DataURLProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B91161A82429857D00BD2907 /* DataURLProtocol.swift */; };
399399
B91161AD242A363900BD2907 /* TestDataURLProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = B91161AB242A350D00BD2907 /* TestDataURLProtocol.swift */; };
400+
B9292465258E75DD00E24DA5 /* NSJSONNumber.swift in Sources */ = {isa = PBXBuildFile; fileRef = B9292464258E75DD00E24DA5 /* NSJSONNumber.swift */; };
401+
B929246F258E772B00E24DA5 /* CMakeLists.txt in Resources */ = {isa = PBXBuildFile; fileRef = B929246E258E772B00E24DA5 /* CMakeLists.txt */; };
400402
B933A79E1F3055F700FE6846 /* NSString-UTF32-BE-data.txt in Resources */ = {isa = PBXBuildFile; fileRef = B933A79C1F3055F600FE6846 /* NSString-UTF32-BE-data.txt */; };
401403
B933A79F1F3055F700FE6846 /* NSString-UTF32-LE-data.txt in Resources */ = {isa = PBXBuildFile; fileRef = B933A79D1F3055F600FE6846 /* NSString-UTF32-LE-data.txt */; };
402404
B940492D223B146800FB4384 /* TestProgressFraction.swift in Sources */ = {isa = PBXBuildFile; fileRef = B940492C223B146800FB4384 /* TestProgressFraction.swift */; };
403405
B94B063C23FDE2BD00B244E8 /* SwiftFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5B5D885D1BBC938800234F36 /* SwiftFoundation.framework */; };
404406
B951B5EC1F4E2A2000D8B332 /* TestNSLock.swift in Sources */ = {isa = PBXBuildFile; fileRef = B951B5EB1F4E2A2000D8B332 /* TestNSLock.swift */; };
407+
B959016E25970BE300CACAE3 /* TestNSJSONNumber.swift in Sources */ = {isa = PBXBuildFile; fileRef = B959016D25970BE300CACAE3 /* TestNSJSONNumber.swift */; };
408+
B95901922597102000CACAE3 /* CMakeLists.txt in Resources */ = {isa = PBXBuildFile; fileRef = B95901912597102000CACAE3 /* CMakeLists.txt */; };
405409
B95FC97622B84B0A005DEA0A /* TestNSSortDescriptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 152EF3932283457B001E1269 /* TestNSSortDescriptor.swift */; };
406410
B96C10F625BA1EFD00985A32 /* NSURLComponents.swift in Sources */ = {isa = PBXBuildFile; fileRef = B96C10F525BA1EFD00985A32 /* NSURLComponents.swift */; };
407411
B96C110025BA20A600985A32 /* NSURLQueryItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = B96C10FF25BA20A600985A32 /* NSURLQueryItem.swift */; };
@@ -1107,10 +1111,14 @@
11071111
B91095791EEF237800A71930 /* NSString-UTF16-BE-data.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "NSString-UTF16-BE-data.txt"; sourceTree = "<group>"; };
11081112
B91161A82429857D00BD2907 /* DataURLProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DataURLProtocol.swift; sourceTree = "<group>"; };
11091113
B91161AB242A350D00BD2907 /* TestDataURLProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestDataURLProtocol.swift; sourceTree = "<group>"; };
1114+
B9292464258E75DD00E24DA5 /* NSJSONNumber.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSJSONNumber.swift; sourceTree = "<group>"; };
1115+
B929246E258E772B00E24DA5 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
11101116
B933A79C1F3055F600FE6846 /* NSString-UTF32-BE-data.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = "NSString-UTF32-BE-data.txt"; sourceTree = "<group>"; };
11111117
B933A79D1F3055F600FE6846 /* NSString-UTF32-LE-data.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = "NSString-UTF32-LE-data.txt"; sourceTree = "<group>"; };
11121118
B940492C223B146800FB4384 /* TestProgressFraction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestProgressFraction.swift; sourceTree = "<group>"; };
11131119
B951B5EB1F4E2A2000D8B332 /* TestNSLock.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestNSLock.swift; sourceTree = "<group>"; };
1120+
B959016D25970BE300CACAE3 /* TestNSJSONNumber.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestNSJSONNumber.swift; sourceTree = "<group>"; };
1121+
B95901912597102000CACAE3 /* CMakeLists.txt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt; sourceTree = "<group>"; };
11141122
B95FC97222AF0050005DEA0A /* SwiftXCTest.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = SwiftXCTest.framework; sourceTree = BUILT_PRODUCTS_DIR; };
11151123
B95FC97422AF051B005DEA0A /* xcode-build.sh */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.script.sh; path = "xcode-build.sh"; sourceTree = "<group>"; };
11161124
B96C10F525BA1EFD00985A32 /* NSURLComponents.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSURLComponents.swift; sourceTree = "<group>"; };
@@ -1775,6 +1783,7 @@
17751783
F023071023F0976B0023DBEC /* Foundation */ = {
17761784
isa = PBXGroup;
17771785
children = (
1786+
B95901912597102000CACAE3 /* CMakeLists.txt */,
17781787
155D3BBB22401D1100B0D38E /* FixtureValues.swift */,
17791788
616068F2225DE5C2004FCC54 /* FTPServer.swift */,
17801789
1520469A1D8AEABE00D02E36 /* HTTPServer.swift */,
@@ -1834,6 +1843,7 @@
18341843
EA66F63D1BF1619600136161 /* TestNSDictionary.swift */,
18351844
CD1C7F7C1E303B47008E331C /* TestNSError.swift */,
18361845
88D28DE61C13AE9000494606 /* TestNSGeometry.swift */,
1846+
B959016D25970BE300CACAE3 /* TestNSJSONNumber.swift */,
18371847
D3A597F11C33C68E00295652 /* TestNSKeyedArchiver.swift */,
18381848
D3A597EF1C33A9E500295652 /* TestNSKeyedUnarchiver.swift */,
18391849
61A395F91C2484490029B337 /* TestNSLocale.swift */,
@@ -2040,6 +2050,7 @@
20402050
F023072323F0A6E50023DBEC /* Foundation */ = {
20412051
isa = PBXGroup;
20422052
children = (
2053+
B929246E258E772B00E24DA5 /* CMakeLists.txt */,
20432054
F023072523F0B4890023DBEC /* Headers */,
20442055
F023072423F0B4140023DBEC /* Resources */,
20452056
EADE0B4D1BD09E0800C49C64 /* AffineTransform.swift */,
@@ -2097,6 +2108,7 @@
20972108
5BDC3FCD1BCF17D300ED97BB /* NSCFDictionary.swift */,
20982109
5BDC3FCF1BCF17E600ED97BB /* NSCFSet.swift */,
20992110
5BDC3FCB1BCF177E00ED97BB /* NSCFString.swift */,
2111+
15CA750924F8336A007DF6C1 /* NSCFTypeShims.swift */,
21002112
5BDC3F311BCC5DCB00ED97BB /* NSCharacterSet.swift */,
21012113
5BDC3F321BCC5DCB00ED97BB /* NSCoder.swift */,
21022114
EADE0B551BD15DFF00C49C64 /* NSComparisonPredicate.swift */,
@@ -2114,12 +2126,12 @@
21142126
EADE0B5F1BD15DFF00C49C64 /* NSGeometry.swift */,
21152127
EADE0B621BD15DFF00C49C64 /* NSIndexPath.swift */,
21162128
EADE0B631BD15DFF00C49C64 /* NSIndexSet.swift */,
2129+
B9292464258E75DD00E24DA5 /* NSJSONNumber.swift */,
21172130
EADE0B651BD15DFF00C49C64 /* NSKeyedArchiver.swift */,
21182131
EA418C251D57257D005EAD0D /* NSKeyedArchiverHelpers.swift */,
21192132
D3BCEB9F1C2F6DDB00295652 /* NSKeyedCoderOldStyleArray.swift */,
21202133
D39A14001C2D6E0A00295652 /* NSKeyedUnarchiver.swift */,
21212134
5BDC3F3B1BCC5DCB00ED97BB /* NSLocale.swift */,
2122-
15CA750924F8336A007DF6C1 /* NSCFTypeShims.swift */,
21232135
5BDC3F3C1BCC5DCB00ED97BB /* NSLock.swift */,
21242136
D3BCEB9D1C2EDED800295652 /* NSLog.swift */,
21252137
5BECBA391D1CAE9A00B39B1F /* NSMeasurement.swift */,
@@ -2710,6 +2722,7 @@
27102722
isa = PBXResourcesBuildPhase;
27112723
buildActionMask = 2147483647;
27122724
files = (
2725+
B929246F258E772B00E24DA5 /* CMakeLists.txt in Resources */,
27132726
F023072623F0B4890023DBEC /* Headers in Resources */,
27142727
B983E32C23F0C69600D9C402 /* Docs in Resources */,
27152728
B983E32E23F0C6E200D9C402 /* CONTRIBUTING.md in Resources */,
@@ -2740,6 +2753,7 @@
27402753
D3A597F71C3415CC00295652 /* NSKeyedUnarchiver-ArrayTest.plist in Resources */,
27412754
CE19A88C1C23AA2300B4CB6A /* NSStringTestData.txt in Resources */,
27422755
E1A03F361C4828650023AF4D /* PropertyList-1.0.dtd in Resources */,
2756+
B95901922597102000CACAE3 /* CMakeLists.txt in Resources */,
27432757
E1A3726F1C31EBFB0023AF4D /* NSXMLDocumentTestData.xml in Resources */,
27442758
E1A03F381C482C730023AF4D /* NSXMLDTDTestData.xml in Resources */,
27452759
D3A598041C349E6A00295652 /* NSKeyedUnarchiver-OrderedSetTest.plist in Resources */,
@@ -2884,6 +2898,7 @@
28842898
5BF7AEC01BCD51F9008F214A /* NSUUID.swift in Sources */,
28852899
5BF7AEB01BCD51F9008F214A /* NSLocale.swift in Sources */,
28862900
EADE0BA31BD15E0000C49C64 /* NSKeyedArchiver.swift in Sources */,
2901+
B9292465258E75DD00E24DA5 /* NSJSONNumber.swift in Sources */,
28872902
5BF7AEAD1BCD51F9008F214A /* NSError.swift in Sources */,
28882903
EADE0BB61BD15E0000C49C64 /* NSSortDescriptor.swift in Sources */,
28892904
5BF7AEA41BCD51F9008F214A /* Bundle.swift in Sources */,
@@ -3100,6 +3115,7 @@
31003115
90E645DF1E4C89A400D0D47C /* TestNSCache.swift in Sources */,
31013116
5B13B34A1C582D4C00651CE2 /* TestURL.swift in Sources */,
31023117
EA54A6FB1DB16D53009E0809 /* TestObjCRuntime.swift in Sources */,
3118+
B959016E25970BE300CACAE3 /* TestNSJSONNumber.swift in Sources */,
31033119
BB3D7558208A1E500085CFDC /* Imports.swift in Sources */,
31043120
5B13B34D1C582D4C00651CE2 /* TestNSUUID.swift in Sources */,
31053121
15F10CDC218909BF00D88114 /* TestNSCalendar.swift in Sources */,

Sources/Foundation/CMakeLists.txt

+1
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ add_library(Foundation
7272
NSGeometry.swift
7373
NSIndexPath.swift
7474
NSIndexSet.swift
75+
NSJSONNumber.swift
7576
NSKeyedArchiver.swift
7677
NSKeyedArchiverHelpers.swift
7778
NSKeyedCoderOldStyleArray.swift

0 commit comments

Comments
 (0)