Skip to content

Commit 92ae28d

Browse files
authored
Merge pull request #10314 from phausler/swift-4.0-branch-number_bridge_updates
Number bridge updates
2 parents 4fd9846 + 57f0e7c commit 92ae28d

File tree

3 files changed

+142
-22
lines changed

3 files changed

+142
-22
lines changed

stdlib/public/SDK/Foundation/NSNumber.swift

Lines changed: 32 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
import CoreGraphics
1515

1616
extension Int8 : _ObjectiveCBridgeable {
17-
@available(swift, deprecated: 4)
17+
@available(swift, deprecated: 4, renamed: "init(truncating:)")
1818
public init(_ number: NSNumber) {
1919
self = number.int8Value
2020
}
@@ -55,7 +55,7 @@ extension Int8 : _ObjectiveCBridgeable {
5555
}
5656

5757
extension UInt8 : _ObjectiveCBridgeable {
58-
@available(swift, deprecated: 4)
58+
@available(swift, deprecated: 4, renamed: "init(truncating:)")
5959
public init(_ number: NSNumber) {
6060
self = number.uint8Value
6161
}
@@ -96,7 +96,7 @@ extension UInt8 : _ObjectiveCBridgeable {
9696
}
9797

9898
extension Int16 : _ObjectiveCBridgeable {
99-
@available(swift, deprecated: 4)
99+
@available(swift, deprecated: 4, renamed: "init(truncating:)")
100100
public init(_ number: NSNumber) {
101101
self = number.int16Value
102102
}
@@ -137,7 +137,7 @@ extension Int16 : _ObjectiveCBridgeable {
137137
}
138138

139139
extension UInt16 : _ObjectiveCBridgeable {
140-
@available(swift, deprecated: 4)
140+
@available(swift, deprecated: 4, renamed: "init(truncating:)")
141141
public init(_ number: NSNumber) {
142142
self = number.uint16Value
143143
}
@@ -178,7 +178,7 @@ extension UInt16 : _ObjectiveCBridgeable {
178178
}
179179

180180
extension Int32 : _ObjectiveCBridgeable {
181-
@available(swift, deprecated: 4)
181+
@available(swift, deprecated: 4, renamed: "init(truncating:)")
182182
public init(_ number: NSNumber) {
183183
self = number.int32Value
184184
}
@@ -219,7 +219,7 @@ extension Int32 : _ObjectiveCBridgeable {
219219
}
220220

221221
extension UInt32 : _ObjectiveCBridgeable {
222-
@available(swift, deprecated: 4)
222+
@available(swift, deprecated: 4, renamed: "init(truncating:)")
223223
public init(_ number: NSNumber) {
224224
self = number.uint32Value
225225
}
@@ -260,7 +260,7 @@ extension UInt32 : _ObjectiveCBridgeable {
260260
}
261261

262262
extension Int64 : _ObjectiveCBridgeable {
263-
@available(swift, deprecated: 4)
263+
@available(swift, deprecated: 4, renamed: "init(truncating:)")
264264
public init(_ number: NSNumber) {
265265
self = number.int64Value
266266
}
@@ -301,7 +301,7 @@ extension Int64 : _ObjectiveCBridgeable {
301301
}
302302

303303
extension UInt64 : _ObjectiveCBridgeable {
304-
@available(swift, deprecated: 4)
304+
@available(swift, deprecated: 4, renamed: "init(truncating:)")
305305
public init(_ number: NSNumber) {
306306
self = number.uint64Value
307307
}
@@ -342,7 +342,7 @@ extension UInt64 : _ObjectiveCBridgeable {
342342
}
343343

344344
extension Int : _ObjectiveCBridgeable {
345-
@available(swift, deprecated: 4)
345+
@available(swift, deprecated: 4, renamed: "init(truncating:)")
346346
public init(_ number: NSNumber) {
347347
self = number.intValue
348348
}
@@ -383,7 +383,7 @@ extension Int : _ObjectiveCBridgeable {
383383
}
384384

385385
extension UInt : _ObjectiveCBridgeable {
386-
@available(swift, deprecated: 4)
386+
@available(swift, deprecated: 4, renamed: "init(truncating:)")
387387
public init(_ number: NSNumber) {
388388
self = number.uintValue
389389
}
@@ -424,7 +424,7 @@ extension UInt : _ObjectiveCBridgeable {
424424
}
425425

426426
extension Float : _ObjectiveCBridgeable {
427-
@available(swift, deprecated: 4)
427+
@available(swift, deprecated: 4, renamed: "init(truncating:)")
428428
public init(_ number: NSNumber) {
429429
self = number.floatValue
430430
}
@@ -451,8 +451,24 @@ extension Float : _ObjectiveCBridgeable {
451451
}
452452

453453
public static func _conditionallyBridgeFromObjectiveC(_ x: NSNumber, result: inout Float?) -> Bool {
454-
guard let value = Float(exactly: x) else { return false }
455-
result = value
454+
guard let value = Double(exactly: x) else { return false }
455+
guard !value.isNaN else {
456+
result = Float.nan
457+
return true
458+
}
459+
guard !value.isInfinite else {
460+
if value.sign == .minus {
461+
result = -Float.infinity
462+
} else {
463+
result = Float.infinity
464+
}
465+
return true
466+
}
467+
guard Swift.abs(value) <= Double(Float.greatestFiniteMagnitude) else {
468+
return false
469+
}
470+
471+
result = Float(value)
456472
return true
457473
}
458474

@@ -465,7 +481,7 @@ extension Float : _ObjectiveCBridgeable {
465481
}
466482

467483
extension Double : _ObjectiveCBridgeable {
468-
@available(swift, deprecated: 4)
484+
@available(swift, deprecated: 4, renamed: "init(truncating:)")
469485
public init(_ number: NSNumber) {
470486
self = number.doubleValue
471487
}
@@ -513,7 +529,7 @@ extension Double : _ObjectiveCBridgeable {
513529
}
514530

515531
extension Bool : _ObjectiveCBridgeable {
516-
@available(swift, deprecated: 4)
532+
@available(swift, deprecated: 4, renamed: "init(truncating:)")
517533
public init(_ number: NSNumber) {
518534
self = number.boolValue
519535
}
@@ -564,7 +580,7 @@ extension Bool : _ObjectiveCBridgeable {
564580
}
565581

566582
extension CGFloat : _ObjectiveCBridgeable {
567-
@available(swift, deprecated: 4)
583+
@available(swift, deprecated: 4, renamed: "init(truncating:)")
568584
public init(_ number: NSNumber) {
569585
native = CGFloat.NativeType(truncating: number)
570586
}

test/stdlib/TestNSNumberBridging.swift

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,58 @@ import StdlibUnittest
1818
import Foundation
1919
import CoreGraphics
2020

21+
extension Float {
22+
init?(reasonably value: Float) {
23+
self = value
24+
}
25+
26+
init?(reasonably value: Double) {
27+
guard !value.isNaN else {
28+
self = Float.nan
29+
return
30+
}
31+
32+
guard !value.isInfinite else {
33+
if value.sign == .minus {
34+
self = -Float.infinity
35+
} else {
36+
self = Float.infinity
37+
}
38+
return
39+
}
40+
41+
guard abs(value) <= Double(Float.greatestFiniteMagnitude) else {
42+
return nil
43+
}
44+
45+
self = Float(value)
46+
}
47+
}
48+
49+
extension Double {
50+
init?(reasonably value: Float) {
51+
guard !value.isNaN else {
52+
self = Double.nan
53+
return
54+
}
55+
56+
guard !value.isInfinite else {
57+
if value.sign == .minus {
58+
self = -Double.infinity
59+
} else {
60+
self = Double.infinity
61+
}
62+
return
63+
}
64+
65+
self = Double(value)
66+
}
67+
68+
init?(reasonably value: Double) {
69+
self = value
70+
}
71+
}
72+
2173
var nsNumberBridging = TestSuite("NSNumberBridging")
2274

2375
func testFloat(_ lhs: Float?, _ rhs: Float?, file: String = #file, line: UInt = #line) {
@@ -645,7 +697,7 @@ func testNSNumberBridgeFromFloat() {
645697
expectEqual(UInt(exactly: interestingValue), uint)
646698

647699
let float = (number!) as? Float
648-
let expectedFloat = Float(exactly: interestingValue)
700+
let expectedFloat = Float(reasonably: interestingValue)
649701
testFloat(expectedFloat, float)
650702

651703
let double = (number!) as? Double
@@ -685,7 +737,7 @@ func testNSNumberBridgeFromDouble() {
685737
expectEqual(UInt(exactly: interestingValue), uint)
686738

687739
let float = (number!) as? Float
688-
let expectedFloat = Float(exactly: interestingValue)
740+
let expectedFloat = Float(reasonably: interestingValue)
689741
testFloat(expectedFloat, float)
690742

691743
let double = (number!) as? Double
@@ -725,7 +777,7 @@ func testNSNumberBridgeFromCGFloat() {
725777
expectEqual(UInt(exactly: interestingValue.native), uint)
726778

727779
let float = (number!) as? Float
728-
let expectedFloat = Float(exactly: interestingValue.native)
780+
let expectedFloat = Float(reasonably: interestingValue.native)
729781
testFloat(expectedFloat, float)
730782

731783
let double = (number!) as? Double

validation-test/stdlib/ValidationNSNumberBridging.swift

Lines changed: 55 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,58 @@ import StdlibUnittest
1818
import Foundation
1919
import CoreGraphics
2020

21+
extension Float {
22+
init?(reasonably value: Float) {
23+
self = value
24+
}
25+
26+
init?(reasonably value: Double) {
27+
guard !value.isNaN else {
28+
self = Float.nan
29+
return
30+
}
31+
32+
guard !value.isInfinite else {
33+
if value.sign == .minus {
34+
self = -Float.infinity
35+
} else {
36+
self = Float.infinity
37+
}
38+
return
39+
}
40+
41+
guard abs(value) <= Double(Float.greatestFiniteMagnitude) else {
42+
return nil
43+
}
44+
45+
self = Float(value)
46+
}
47+
}
48+
49+
extension Double {
50+
init?(reasonably value: Float) {
51+
guard !value.isNaN else {
52+
self = Double.nan
53+
return
54+
}
55+
56+
guard !value.isInfinite else {
57+
if value.sign == .minus {
58+
self = -Double.infinity
59+
} else {
60+
self = Double.infinity
61+
}
62+
return
63+
}
64+
65+
self = Double(value)
66+
}
67+
68+
init?(reasonably value: Double) {
69+
self = value
70+
}
71+
}
72+
2173
var nsNumberBridging = TestSuite("NSNumberBridgingValidation")
2274

2375
func testFloat(_ lhs: Float?, _ rhs: Float?, file: String = #file, line: UInt = #line) {
@@ -645,7 +697,7 @@ func testNSNumberBridgeFromFloat() {
645697
expectEqual(UInt(exactly: interestingValue), uint)
646698

647699
let float = (number!) as? Float
648-
let expectedFloat = Float(exactly: interestingValue)
700+
let expectedFloat = Float(reasonably: interestingValue)
649701
testFloat(expectedFloat, float)
650702

651703
let double = (number!) as? Double
@@ -685,7 +737,7 @@ func testNSNumberBridgeFromDouble() {
685737
expectEqual(UInt(exactly: interestingValue), uint)
686738

687739
let float = (number!) as? Float
688-
let expectedFloat = Float(exactly: interestingValue)
740+
let expectedFloat = Float(reasonably: interestingValue)
689741
testFloat(expectedFloat, float)
690742

691743
let double = (number!) as? Double
@@ -725,7 +777,7 @@ func testNSNumberBridgeFromCGFloat() {
725777
expectEqual(UInt(exactly: interestingValue.native), uint)
726778

727779
let float = (number!) as? Float
728-
let expectedFloat = Float(exactly: interestingValue.native)
780+
let expectedFloat = Float(reasonably: interestingValue.native)
729781
testFloat(expectedFloat, float)
730782

731783
let double = (number!) as? Double

0 commit comments

Comments
 (0)