Skip to content

Commit b962048

Browse files
committed
Switch uninitialized Array inits to call original implementation
This strategy lets us avoid availability constraints on the new public methods, since the original underscored version is part of the permanent ABI.
1 parent 68e8d78 commit b962048

File tree

2 files changed

+30
-38
lines changed

2 files changed

+30
-38
lines changed

stdlib/public/core/Array.swift

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1366,17 +1366,35 @@ extension Array {
13661366
}
13671367

13681368
extension Array {
1369-
@available(swift, deprecated: 5.1, renamed: "init(unsafeUninitializedCapacity:initializingWith:)")
1369+
/// Implementation for Array(unsafeUninitializedCapacity:initializingWith:)
1370+
/// and ContiguousArray(unsafeUninitializedCapacity:initializingWith:)
13701371
@inlinable
1371-
public init(
1372+
internal init(
13721373
_unsafeUninitializedCapacity: Int,
13731374
initializingWith initializer: (
13741375
_ buffer: inout UnsafeMutableBufferPointer<Element>,
13751376
_ initializedCount: inout Int) throws -> Void
13761377
) rethrows {
1377-
try self.init(
1378-
unsafeUninitializedCapacity: _unsafeUninitializedCapacity,
1379-
initializingWith: initializer)
1378+
var firstElementAddress: UnsafeMutablePointer<Element>
1379+
(self, firstElementAddress) =
1380+
Array._allocateUninitialized(_unsafeUninitializedCapacity)
1381+
1382+
var initializedCount = 0
1383+
var buffer = UnsafeMutableBufferPointer<Element>(
1384+
start: firstElementAddress, count: _unsafeUninitializedCapacity)
1385+
defer {
1386+
// Update self.count even if initializer throws an error.
1387+
_precondition(
1388+
initializedCount <= _unsafeUninitializedCapacity,
1389+
"Initialized count set to greater than specified capacity."
1390+
)
1391+
_precondition(
1392+
buffer.baseAddress == firstElementAddress,
1393+
"Can't reassign buffer in Array(unsafeUninitializedCapacity:initializingWith:)"
1394+
)
1395+
self._buffer.count = initializedCount
1396+
}
1397+
try initializer(&buffer, &initializedCount)
13801398
}
13811399

13821400
/// Creates an array with the specified capacity, then calls the given
@@ -1404,29 +1422,16 @@ extension Array {
14041422
/// - initializedCount: The count of initialized elements in the array,
14051423
/// which begins as zero. Set `initializedCount` to the number of
14061424
/// elements you initialize.
1407-
@inlinable
1425+
@_alwaysEmitIntoClient @inlinable
14081426
public init(
14091427
unsafeUninitializedCapacity: Int,
14101428
initializingWith initializer: (
14111429
_ buffer: inout UnsafeMutableBufferPointer<Element>,
14121430
_ initializedCount: inout Int) throws -> Void
14131431
) rethrows {
1414-
var firstElementAddress: UnsafeMutablePointer<Element>
1415-
(self, firstElementAddress) =
1416-
Array._allocateUninitialized(unsafeUninitializedCapacity)
1417-
1418-
var initializedCount = 0
1419-
defer {
1420-
// Update self.count even if initializer throws an error.
1421-
_precondition(
1422-
initializedCount <= unsafeUninitializedCapacity,
1423-
"Initialized count set to greater than specified capacity."
1424-
)
1425-
self._buffer.count = initializedCount
1426-
}
1427-
var buffer = UnsafeMutableBufferPointer<Element>(
1428-
start: firstElementAddress, count: unsafeUninitializedCapacity)
1429-
try initializer(&buffer, &initializedCount)
1432+
self = try Array(
1433+
_unsafeUninitializedCapacity: unsafeUninitializedCapacity,
1434+
initializingWith: initializer)
14301435
}
14311436

14321437
/// Calls a closure with a pointer to the array's contiguous storage.

stdlib/public/core/ContiguousArray.swift

Lines changed: 3 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1017,22 +1017,9 @@ extension ContiguousArray {
10171017
_ buffer: inout UnsafeMutableBufferPointer<Element>,
10181018
_ initializedCount: inout Int) throws -> Void
10191019
) rethrows {
1020-
var firstElementAddress: UnsafeMutablePointer<Element>
1021-
(self, firstElementAddress) =
1022-
ContiguousArray._allocateUninitialized(unsafeUninitializedCapacity)
1023-
1024-
var initializedCount = 0
1025-
defer {
1026-
// Update self.count even if initializer throws an error.
1027-
_precondition(
1028-
initializedCount <= unsafeUninitializedCapacity,
1029-
"Initialized count set to greater than specified capacity."
1030-
)
1031-
self._buffer.count = initializedCount
1032-
}
1033-
var buffer = UnsafeMutableBufferPointer<Element>(
1034-
start: firstElementAddress, count: unsafeUninitializedCapacity)
1035-
try initializer(&buffer, &initializedCount)
1020+
self = try ContiguousArray(Array(
1021+
_unsafeUninitializedCapacity: unsafeUninitializedCapacity,
1022+
initializingWith: initializer))
10361023
}
10371024

10381025
/// Calls a closure with a pointer to the array's contiguous storage.

0 commit comments

Comments
 (0)