Skip to content

Commit 36b5090

Browse files
authored
Merge pull request #82598 from glessard/rdar153654652-now-available
[stdlib] add `span` properties to the backdeployment library
2 parents d9d4fec + 5d4c445 commit 36b5090

File tree

7 files changed

+76
-28
lines changed

7 files changed

+76
-28
lines changed

stdlib/public/core/Array.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ extension Array {
356356
}
357357

358358
#if INTERNAL_CHECKS_ENABLED && COW_CHECKS_ENABLED
359-
@inlinable
359+
@_alwaysEmitIntoClient
360360
@_semantics("array.make_mutable")
361361
@_effects(notEscaping self.**)
362362
internal mutating func _makeMutableAndUniqueUnchecked() {

stdlib/public/core/ArraySlice.swift

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -169,6 +169,16 @@ extension ArraySlice {
169169
}
170170
}
171171

172+
#if INTERNAL_CHECKS_ENABLED && COW_CHECKS_ENABLED
173+
@_alwaysEmitIntoClient
174+
@_semantics("array.make_mutable")
175+
internal mutating func _makeMutableAndUniqueUnchecked() {
176+
if _slowPath(!_buffer.beginCOWMutationUnchecked()) {
177+
_buffer = _Buffer(copying: _buffer)
178+
}
179+
}
180+
#endif
181+
172182
/// Marks the end of a mutation.
173183
///
174184
/// After a call to `_endMutation` the buffer must not be mutated until a call
@@ -1209,18 +1219,24 @@ extension ArraySlice {
12091219
) throws(E) -> R {
12101220
return try unsafe _buffer.withUnsafeBufferPointer(body)
12111221
}
1222+
}
12121223

1213-
@available(SwiftStdlib 6.2, *)
1224+
@available(SwiftCompatibilitySpan 5.0, *)
1225+
@_originallyDefinedIn(module: "Swift;CompatibilitySpan", SwiftCompatibilitySpan 6.2)
1226+
extension ArraySlice {
1227+
@available(SwiftCompatibilitySpan 5.0, *)
1228+
@_alwaysEmitIntoClient
12141229
public var span: Span<Element> {
12151230
@lifetime(borrow self)
1216-
@_alwaysEmitIntoClient
12171231
borrowing get {
12181232
let (pointer, count) = unsafe (_buffer.firstElementAddress, _buffer.count)
12191233
let span = unsafe Span(_unsafeStart: pointer, count: count)
12201234
return unsafe _overrideLifetime(span, borrowing: self)
12211235
}
12221236
}
1237+
}
12231238

1239+
extension ArraySlice {
12241240
// Superseded by the typed-throws version of this function, but retained
12251241
// for ABI reasons.
12261242
@_semantics("array.withUnsafeMutableBufferPointer")
@@ -1299,8 +1315,11 @@ extension ArraySlice {
12991315
// Invoke the body.
13001316
return try unsafe body(&inoutBufferPointer)
13011317
}
1318+
}
13021319

1303-
@available(SwiftStdlib 6.2, *)
1320+
@available(SwiftCompatibilitySpan 5.0, *)
1321+
@_originallyDefinedIn(module: "Swift;CompatibilitySpan", SwiftCompatibilitySpan 6.2)
1322+
extension ArraySlice {
13041323
@_alwaysEmitIntoClient
13051324
public var mutableSpan: MutableSpan<Element> {
13061325
@lifetime(&self)
@@ -1320,7 +1339,9 @@ extension ArraySlice {
13201339
return unsafe _overrideLifetime(span, mutating: &self)
13211340
}
13221341
}
1342+
}
13231343

1344+
extension ArraySlice {
13241345
@inlinable
13251346
public __consuming func _copyContents(
13261347
initializing buffer: UnsafeMutableBufferPointer<Element>

stdlib/public/core/CollectionOfOne.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,20 +159,20 @@ extension CollectionOfOne: RandomAccessCollection, MutableCollection {
159159
}
160160
}
161161

162+
@available(SwiftCompatibilitySpan 5.0, *)
163+
@_originallyDefinedIn(module: "Swift;CompatibilitySpan", SwiftCompatibilitySpan 6.2)
162164
extension CollectionOfOne {
163165

164-
@available(SwiftStdlib 6.2, *)
166+
@_alwaysEmitIntoClient
165167
public var span: Span<Element> {
166168
@lifetime(borrow self)
167-
@_alwaysEmitIntoClient
168169
get {
169170
let pointer = unsafe UnsafePointer<Element>(Builtin.addressOfBorrow(self))
170171
let span = unsafe Span(_unsafeStart: pointer, count: 1)
171172
return unsafe _overrideLifetime(span, borrowing: self)
172173
}
173174
}
174175

175-
@available(SwiftStdlib 6.2, *)
176176
@_alwaysEmitIntoClient
177177
public var mutableSpan: MutableSpan<Element> {
178178
@lifetime(&self)

stdlib/public/core/ContiguousArray.swift

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,16 @@ extension ContiguousArray {
7474
}
7575
}
7676

77+
#if INTERNAL_CHECKS_ENABLED && COW_CHECKS_ENABLED
78+
@_alwaysEmitIntoClient
79+
@_semantics("array.make_mutable")
80+
internal mutating func _makeMutableAndUniqueUnchecked() {
81+
if _slowPath(!_buffer.beginCOWMutationUnchecked()) {
82+
_buffer = _buffer._consumeAndCreateNew()
83+
}
84+
}
85+
#endif
86+
7787
/// Marks the end of an Array mutation.
7888
///
7989
/// After a call to `_endMutation` the buffer must not be mutated until a call
@@ -1151,19 +1161,24 @@ extension ContiguousArray {
11511161
) throws(E) -> R {
11521162
return try unsafe _buffer.withUnsafeBufferPointer(body)
11531163
}
1164+
}
11541165

1155-
@available(SwiftStdlib 6.2, *)
1166+
@available(SwiftCompatibilitySpan 5.0, *)
1167+
@_originallyDefinedIn(module: "Swift;CompatibilitySpan", SwiftCompatibilitySpan 6.2)
1168+
extension ContiguousArray {
1169+
@_alwaysEmitIntoClient
11561170
public var span: Span<Element> {
11571171
@lifetime(borrow self)
1158-
@_alwaysEmitIntoClient
11591172
borrowing get {
11601173
let pointer = unsafe _buffer.firstElementAddress
11611174
let count = _buffer.immutableCount
11621175
let span = unsafe Span(_unsafeStart: pointer, count: count)
11631176
return unsafe _overrideLifetime(span, borrowing: self)
11641177
}
11651178
}
1179+
}
11661180

1181+
extension ContiguousArray {
11671182
// Superseded by the typed-throws version of this function, but retained
11681183
// for ABI reasons.
11691184
@_semantics("array.withUnsafeMutableBufferPointer")
@@ -1241,8 +1256,11 @@ extension ContiguousArray {
12411256
// Invoke the body.
12421257
return try unsafe body(&inoutBufferPointer)
12431258
}
1259+
}
12441260

1245-
@available(SwiftStdlib 6.2, *)
1261+
@available(SwiftCompatibilitySpan 5.0, *)
1262+
@_originallyDefinedIn(module: "Swift;CompatibilitySpan", SwiftCompatibilitySpan 6.2)
1263+
extension ContiguousArray {
12461264
@_alwaysEmitIntoClient
12471265
public var mutableSpan: MutableSpan<Element> {
12481266
@lifetime(&self)
@@ -1262,7 +1280,9 @@ extension ContiguousArray {
12621280
return unsafe _overrideLifetime(span, mutating: &self)
12631281
}
12641282
}
1283+
}
12651284

1285+
extension ContiguousArray {
12661286
@inlinable
12671287
public __consuming func _copyContents(
12681288
initializing buffer: UnsafeMutableBufferPointer<Element>

stdlib/public/core/KeyValuePairs.swift

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -125,12 +125,13 @@ extension KeyValuePairs: RandomAccessCollection {
125125
}
126126
}
127127

128+
@available(SwiftCompatibilitySpan 5.0, *)
129+
@_originallyDefinedIn(module: "Swift;CompatibilitySpan", SwiftCompatibilitySpan 6.2)
128130
extension KeyValuePairs {
129-
130-
@available(SwiftStdlib 6.2, *)
131+
@available(SwiftCompatibilitySpan 5.0, *)
132+
@_alwaysEmitIntoClient
131133
public var span: Span<Element> {
132134
@lifetime(borrow self)
133-
@_alwaysEmitIntoClient
134135
get {
135136
let rp = unsafe UnsafeRawPointer(_elements._buffer.firstElementAddress)
136137
let span = unsafe Span(

stdlib/public/core/UnsafeBufferPointer.swift.gyb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -572,9 +572,12 @@ extension Unsafe${Mutable}BufferPointer where Element: ~Copyable {
572572
public func extracting(_ bounds: UnboundedRange) -> Self {
573573
unsafe self
574574
}
575+
}
575576

577+
@available(SwiftCompatibilitySpan 5.0, *)
578+
@_originallyDefinedIn(module: "Swift;CompatibilitySpan", SwiftCompatibilitySpan 6.2)
579+
extension Unsafe${Mutable}BufferPointer where Element: ~Copyable {
576580
@unsafe
577-
@available(SwiftStdlib 6.2, *)
578581
@_alwaysEmitIntoClient
579582
public var span: Span<Element> {
580583
@lifetime(borrow self)
@@ -586,7 +589,6 @@ extension Unsafe${Mutable}BufferPointer where Element: ~Copyable {
586589
%if Mutable:
587590

588591
@unsafe
589-
@available(SwiftStdlib 6.2, *)
590592
@_alwaysEmitIntoClient
591593
public var mutableSpan: MutableSpan<Element> {
592594
@lifetime(borrow self)

stdlib/public/core/UnsafeRawBufferPointer.swift.gyb

Lines changed: 17 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1162,17 +1162,6 @@ extension Unsafe${Mutable}RawBufferPointer {
11621162
}
11631163
}
11641164

1165-
@unsafe
1166-
@available(SwiftStdlib 6.2, *)
1167-
@_alwaysEmitIntoClient
1168-
public var mutableBytes: MutableRawSpan {
1169-
@lifetime(borrow self)
1170-
@_transparent
1171-
get {
1172-
unsafe MutableRawSpan(_unsafeBytes: self)
1173-
}
1174-
}
1175-
11761165
% end
11771166
@_alwaysEmitIntoClient
11781167
public func withContiguousStorageIfAvailable<R>(
@@ -1182,9 +1171,12 @@ extension Unsafe${Mutable}RawBufferPointer {
11821171
try unsafe body(${ 'UnsafeBufferPointer<Element>($0)' if Mutable else '$0' })
11831172
}
11841173
}
1185-
1174+
}
1175+
1176+
@available(SwiftCompatibilitySpan 5.0, *)
1177+
@_originallyDefinedIn(module: "Swift;CompatibilitySpan", SwiftCompatibilitySpan 6.2)
1178+
extension Unsafe${Mutable}RawBufferPointer {
11861179
@unsafe
1187-
@available(SwiftStdlib 6.2, *)
11881180
@_alwaysEmitIntoClient
11891181
public var bytes: RawSpan {
11901182
@lifetime(borrow self)
@@ -1193,6 +1185,18 @@ extension Unsafe${Mutable}RawBufferPointer {
11931185
unsafe RawSpan(_unsafeBytes: self)
11941186
}
11951187
}
1188+
% if Mutable:
1189+
1190+
@unsafe
1191+
@_alwaysEmitIntoClient
1192+
public var mutableBytes: MutableRawSpan {
1193+
@lifetime(borrow self)
1194+
@_transparent
1195+
get {
1196+
unsafe MutableRawSpan(_unsafeBytes: self)
1197+
}
1198+
}
1199+
% end
11961200
}
11971201

11981202
@_unavailableInEmbedded

0 commit comments

Comments
 (0)