Skip to content

Commit 3a963a6

Browse files
committed
[stdlib] generalize Array(unsafeUninitializedCapacity:initializingWith:)
1 parent 858383c commit 3a963a6

File tree

3 files changed

+32
-11
lines changed

3 files changed

+32
-11
lines changed

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

0 commit comments

Comments
 (0)