Skip to content

Commit bf80c2f

Browse files
authored
Merge pull request #83160 from glessard/typedThrows-array-init
[stdlib] Generalize `Array(unsafeUninitializedCapacity:initializingWith:)` for typed throws
2 parents c21c9b0 + 8b0bde8 commit bf80c2f

File tree

6 files changed

+44
-11
lines changed

6 files changed

+44
-11
lines changed

stdlib/public/SwiftOnoneSupport/SwiftOnoneSupport.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ import Swift
1919
// actual generic function name. The "prespecialize" annotation forces
2020
// the actual generic function to be specialized based on the argument
2121
// types passed to the proxy function.
22+
//
23+
// The list of symbols generated by prespecialization can be found at the path
24+
// "lib/SILOptimizer/Utils/OnonePrespecializations.def"
2225
// =============================================================================
2326

2427
extension Collection {

stdlib/public/core/Array.swift

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1509,15 +1509,34 @@ extension Array {
15091509
}
15101510

15111511
extension Array {
1512-
/// Implementation for Array(unsafeUninitializedCapacity:initializingWith:)
1512+
/// Implementation preserved (for ABI reasons) for:
1513+
/// Array(unsafeUninitializedCapacity:initializingWith:)
15131514
/// and ContiguousArray(unsafeUninitializedCapacity:initializingWith:)
1514-
@inlinable
1515+
/*@_spi(SwiftStdlibLegacyABI)*/ @available(swift, obsoleted: 1)
1516+
@inlinable // inlinable is necessary for prespecialization
15151517
internal init(
15161518
_unsafeUninitializedCapacity: Int,
15171519
initializingWith initializer: (
15181520
_ buffer: inout UnsafeMutableBufferPointer<Element>,
15191521
_ initializedCount: inout Int) throws -> Void
15201522
) rethrows {
1523+
try unsafe self.init(
1524+
_unsafeUninitializedCapacity: _unsafeUninitializedCapacity,
1525+
initializingWithTypedThrowsInitializer: initializer
1526+
)
1527+
}
1528+
1529+
/// Implementation for:
1530+
/// Array(unsafeUninitializedCapacity:initializingWith:)
1531+
/// and ContiguousArray(unsafeUninitializedCapacity:initializingWith:)
1532+
@_alwaysEmitIntoClient
1533+
internal init<E: Error>(
1534+
_unsafeUninitializedCapacity: Int,
1535+
initializingWithTypedThrowsInitializer initializer: (
1536+
_ buffer: inout UnsafeMutableBufferPointer<Element>,
1537+
_ initializedCount: inout Int
1538+
) throws(E) -> Void
1539+
) throws(E) {
15211540
var firstElementAddress: UnsafeMutablePointer<Element>
15221541
unsafe (self, firstElementAddress) =
15231542
unsafe Array._allocateUninitialized(_unsafeUninitializedCapacity)
@@ -1567,15 +1586,17 @@ extension Array {
15671586
/// which begins as zero. Set `initializedCount` to the number of
15681587
/// elements you initialize.
15691588
@_alwaysEmitIntoClient @inlinable
1570-
public init(
1589+
public init<E: Error>(
15711590
unsafeUninitializedCapacity: Int,
15721591
initializingWith initializer: (
15731592
_ buffer: inout UnsafeMutableBufferPointer<Element>,
1574-
_ initializedCount: inout Int) throws -> Void
1575-
) rethrows {
1593+
_ initializedCount: inout Int
1594+
) throws(E) -> Void
1595+
) throws(E) {
15761596
self = try unsafe Array(
15771597
_unsafeUninitializedCapacity: unsafeUninitializedCapacity,
1578-
initializingWith: initializer)
1598+
initializingWithTypedThrowsInitializer: initializer
1599+
)
15791600
}
15801601

15811602
// Superseded by the typed-throws version of this function, but retained

stdlib/public/core/ContiguousArray.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1105,15 +1105,15 @@ extension ContiguousArray {
11051105
/// which begins as zero. Set `initializedCount` to the number of
11061106
/// elements you initialize.
11071107
@_alwaysEmitIntoClient @inlinable
1108-
public init(
1108+
public init<E>(
11091109
unsafeUninitializedCapacity: Int,
11101110
initializingWith initializer: (
11111111
_ buffer: inout UnsafeMutableBufferPointer<Element>,
1112-
_ initializedCount: inout Int) throws -> Void
1113-
) rethrows {
1112+
_ initializedCount: inout Int) throws(E) -> Void
1113+
) throws(E) {
11141114
self = try unsafe ContiguousArray(Array(
11151115
_unsafeUninitializedCapacity: unsafeUninitializedCapacity,
1116-
initializingWith: initializer))
1116+
initializingWithTypedThrowsInitializer: initializer))
11171117
}
11181118

11191119
// Superseded by the typed-throws version of this function, but retained

stdlib/public/core/Sort.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -675,7 +675,7 @@ extension UnsafeMutableBufferPointer {
675675
//
676676
// There's no need to set the initialized count within the initializing
677677
// closure, since the buffer is guaranteed to be uninitialized at exit.
678-
_ = try unsafe Array<Element>(_unsafeUninitializedCapacity: count / 2) {
678+
_ = try unsafe Array<Element>(unsafeUninitializedCapacity: count / 2) {
679679
buffer, _ in
680680
var runs: [Range<Index>] = []
681681

test/api-digester/Outputs/stability-stdlib-source-base.swift.expected

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,12 @@ Func withUnsafeBytes(of:_:) is now without rethrows
4646
Func withUnsafeMutableBytes(of:_:) is now without rethrows
4747
Func withoutActuallyEscaping(_:do:) has generic signature change from <ClosureType, ResultType> to <ClosureType, ResultType, Failure where Failure : Swift.Error>
4848
Func withoutActuallyEscaping(_:do:) is now without rethrows
49+
Constructor Array.init(unsafeUninitializedCapacity:initializingWith:) has generic signature change from <Element> to <Element, E where E : Swift.Error>
50+
Constructor Array.init(unsafeUninitializedCapacity:initializingWith:) has parameter 1 type change from (inout Swift.UnsafeMutableBufferPointer<Element>, inout Swift.Int) throws -> Swift.Void to (inout Swift.UnsafeMutableBufferPointer<Element>, inout Swift.Int) throws(E) -> Swift.Void
51+
Constructor Array.init(unsafeUninitializedCapacity:initializingWith:) is now without rethrows
52+
Constructor ContiguousArray.init(unsafeUninitializedCapacity:initializingWith:) has generic signature change from <Element> to <Element, E where E : Swift.Error>
53+
Constructor ContiguousArray.init(unsafeUninitializedCapacity:initializingWith:) has parameter 1 type change from (inout Swift.UnsafeMutableBufferPointer<Element>, inout Swift.Int) throws -> Swift.Void to (inout Swift.UnsafeMutableBufferPointer<Element>, inout Swift.Int) throws(E) -> Swift.Void
54+
Constructor ContiguousArray.init(unsafeUninitializedCapacity:initializingWith:) is now without rethrows
4955

5056
Protocol SIMDScalar has generic signature change from <Self == Self.SIMD16Storage.Scalar, Self.SIMD16Storage : Swift.SIMDStorage, Self.SIMD2Storage : Swift.SIMDStorage, Self.SIMD32Storage : Swift.SIMDStorage, Self.SIMD4Storage : Swift.SIMDStorage, Self.SIMD64Storage : Swift.SIMDStorage, Self.SIMD8Storage : Swift.SIMDStorage, Self.SIMDMaskScalar : Swift.FixedWidthInteger, Self.SIMDMaskScalar : Swift.SIMDScalar, Self.SIMDMaskScalar : Swift.SignedInteger, Self.SIMD16Storage.Scalar == Self.SIMD2Storage.Scalar, Self.SIMD2Storage.Scalar == Self.SIMD32Storage.Scalar, Self.SIMD32Storage.Scalar == Self.SIMD4Storage.Scalar, Self.SIMD4Storage.Scalar == Self.SIMD64Storage.Scalar, Self.SIMD64Storage.Scalar == Self.SIMD8Storage.Scalar> to <Self : Swift.BitwiseCopyable, Self == Self.SIMD16Storage.Scalar, Self.SIMD16Storage : Swift.SIMDStorage, Self.SIMD2Storage : Swift.SIMDStorage, Self.SIMD32Storage : Swift.SIMDStorage, Self.SIMD4Storage : Swift.SIMDStorage, Self.SIMD64Storage : Swift.SIMDStorage, Self.SIMD8Storage : Swift.SIMDStorage, Self.SIMDMaskScalar : Swift.FixedWidthInteger, Self.SIMDMaskScalar : Swift.SIMDScalar, Self.SIMDMaskScalar : Swift.SignedInteger, Self.SIMDMaskScalar == Self.SIMDMaskScalar.SIMDMaskScalar, Self.SIMD16Storage.Scalar == Self.SIMD2Storage.Scalar, Self.SIMD2Storage.Scalar == Self.SIMD32Storage.Scalar, Self.SIMD32Storage.Scalar == Self.SIMD4Storage.Scalar, Self.SIMD4Storage.Scalar == Self.SIMD64Storage.Scalar, Self.SIMD64Storage.Scalar == Self.SIMD8Storage.Scalar>
5157

test/api-digester/stability-stdlib-abi-without-asserts.test

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -822,6 +822,9 @@ Func _SliceBuffer.withUnsafeBufferPointer(_:) has mangled name changing from 'Sw
822822
Func _SliceBuffer.withUnsafeMutableBufferPointer(_:) has been renamed to Func __abi_withUnsafeMutableBufferPointer(_:)
823823
Func _SliceBuffer.withUnsafeMutableBufferPointer(_:) has mangled name changing from 'Swift._SliceBuffer.withUnsafeMutableBufferPointer<A>((Swift.UnsafeMutableBufferPointer<A>) throws -> A1) throws -> A1' to 'Swift._SliceBuffer.__abi_withUnsafeMutableBufferPointer<A>((Swift.UnsafeMutableBufferPointer<A>) throws -> A1) throws -> A1'
824824

825+
// Functions changed for typed throws
826+
Constructor Array.init(_unsafeUninitializedCapacity:initializingWith:) has been removed
827+
825828
Struct String.Index has added a conformance to an existing protocol CustomDebugStringConvertible
826829

827830
Struct CollectionOfOne is now with @_addressableForDependencies

0 commit comments

Comments
 (0)