From cc45ff168d9f1dd7e8c4e04c06b3f84bac910278 Mon Sep 17 00:00:00 2001 From: Jeremy Schonfeld Date: Wed, 29 May 2024 11:58:25 -0700 Subject: [PATCH 1/2] Add upcall for FoundationEssentials to initialize NSNumbers --- Sources/Foundation/NSNumber.swift | 16 ++++++++++++++++ Tests/Foundation/TestFileManager.swift | 11 +++++++++++ 2 files changed, 27 insertions(+) diff --git a/Sources/Foundation/NSNumber.swift b/Sources/Foundation/NSNumber.swift index a68361e6dd..cd55f0023a 100644 --- a/Sources/Foundation/NSNumber.swift +++ b/Sources/Foundation/NSNumber.swift @@ -9,6 +9,7 @@ @_implementationOnly import _CoreFoundation +@_spi(SwiftCorelibsFoundation) @_exported import FoundationEssentials internal let kCFNumberSInt8Type = CFNumberType.sInt8Type internal let kCFNumberSInt16Type = CFNumberType.sInt16Type @@ -1172,3 +1173,18 @@ protocol _NSNumberCastingWithoutBridging { } extension NSNumber: _NSNumberCastingWithoutBridging {} + +// Called by FoundationEssentials +internal final class _FoundationNSNumberInitializer : _NSNumberInitializer { + public static func initialize(value: some BinaryInteger) -> Any { + if let int64 = Int64(exactly: value) { + return NSNumber(value: int64) + } else { + return NSNumber(value: UInt64(value)) + } + } + + public static func initialize(value: Bool) -> Any { + NSNumber(value: value) + } +} diff --git a/Tests/Foundation/TestFileManager.swift b/Tests/Foundation/TestFileManager.swift index 1f55939532..f7d2631641 100644 --- a/Tests/Foundation/TestFileManager.swift +++ b/Tests/Foundation/TestFileManager.swift @@ -1785,6 +1785,17 @@ class TestFileManager : XCTestCase { } } + func testNSNumberUpcall() throws { + let url = writableTestDirectoryURL.appending(component: "foo", directoryHint: .notDirectory) + try FileManager.default.createDirectory(at: writableTestDirectoryURL, withIntermediateDirectories: true) + XCTAssertTrue(FileManager.default.createFile(atPath: url.path, contents: Data("foo".utf8))) + let attrs = try FileManager.default.attributesOfItem(atPath: url.path) + let size = attrs[.size] + XCTAssertNotNil(size as? NSNumber) + XCTAssertNotNil(size as? UInt64) + XCTAssertNotNil(size as? Double) // Ensure implicit conversion to unexpected types works + } + // ----- var writableTestDirectoryURL: URL! From 354d59f68cd70b35ff6ce8d656179d943f52eb70 Mon Sep 17 00:00:00 2001 From: Jeremy Schonfeld Date: Wed, 29 May 2024 14:08:15 -0700 Subject: [PATCH 2/2] Update swift-foundation commit hash --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index a0a1881c38..3d8d20b094 100644 --- a/Package.swift +++ b/Package.swift @@ -82,7 +82,7 @@ let package = Package( ), .package( url: "https://github.com/apple/swift-foundation", - revision: "db63ab39bb4f07eeb3ccf19fa7a9f928a7ca3972" + revision: "3297fb33b49ba2d1161ba12757891c7b91c73a3e" ), ], targets: [