Skip to content

Commit c4c9383

Browse files
committed
[span] borrow pointer or buffer initializer parameters
1 parent eaf74ac commit c4c9383

File tree

2 files changed

+32
-30
lines changed

2 files changed

+32
-30
lines changed

stdlib/public/core/Span/RawSpan.swift

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,10 @@ public struct RawSpan: ~Escapable, Copyable, BitwiseCopyable {
2929
@_alwaysEmitIntoClient
3030
@lifetime(immortal)
3131
internal init(
32-
_unchecked pointer: UnsafeRawPointer?,
32+
_unchecked pointer: borrowing UnsafeRawPointer?,
3333
byteCount: Int
3434
) {
35-
_pointer = pointer
35+
_pointer = copy pointer
3636
_count = byteCount
3737
}
3838
}
@@ -58,7 +58,7 @@ extension RawSpan {
5858
@_alwaysEmitIntoClient
5959
@lifetime(immortal)
6060
public init(
61-
_unsafeBytes buffer: UnsafeRawBufferPointer
61+
_unsafeBytes buffer: borrowing UnsafeRawBufferPointer
6262
) {
6363
self.init(
6464
_unchecked: buffer.baseAddress, byteCount: buffer.count
@@ -69,7 +69,7 @@ extension RawSpan {
6969
@_alwaysEmitIntoClient
7070
@lifetime(immortal)
7171
public init(
72-
_unsafeBytes buffer: Slice<UnsafeRawBufferPointer>
72+
_unsafeBytes buffer: borrowing Slice<UnsafeRawBufferPointer>
7373
) {
7474
self.init(_unsafeBytes: UnsafeRawBufferPointer(rebasing: buffer))
7575
}
@@ -87,7 +87,7 @@ extension RawSpan {
8787
@_alwaysEmitIntoClient
8888
@lifetime(immortal)
8989
public init(
90-
_unsafeBytes buffer: UnsafeMutableRawBufferPointer
90+
_unsafeBytes buffer: borrowing UnsafeMutableRawBufferPointer
9191
) {
9292
self.init(_unsafeBytes: UnsafeRawBufferPointer(buffer))
9393
}
@@ -96,7 +96,7 @@ extension RawSpan {
9696
@_alwaysEmitIntoClient
9797
@lifetime(immortal)
9898
public init(
99-
_unsafeBytes buffer: Slice<UnsafeMutableRawBufferPointer>
99+
_unsafeBytes buffer: borrowing Slice<UnsafeMutableRawBufferPointer>
100100
) {
101101
self.init(_unsafeBytes: UnsafeRawBufferPointer(rebasing: buffer))
102102
}
@@ -116,11 +116,11 @@ extension RawSpan {
116116
@_alwaysEmitIntoClient
117117
@lifetime(immortal)
118118
public init(
119-
_unsafeStart pointer: UnsafeRawPointer,
119+
_unsafeStart pointer: borrowing UnsafeRawPointer,
120120
byteCount: Int
121121
) {
122122
_precondition(byteCount >= 0, "Count must not be negative")
123-
self.init(_unchecked: pointer, byteCount: byteCount)
123+
self.init(_unchecked: copy pointer, byteCount: byteCount)
124124
}
125125

126126
/// Unsafely create a `RawSpan` over initialized memory.
@@ -136,7 +136,7 @@ extension RawSpan {
136136
@_alwaysEmitIntoClient
137137
@lifetime(immortal)
138138
public init<T: BitwiseCopyable>(
139-
_unsafeElements buffer: UnsafeBufferPointer<T>
139+
_unsafeElements buffer: borrowing UnsafeBufferPointer<T>
140140
) {
141141
self.init(_unsafeBytes: UnsafeRawBufferPointer(buffer))
142142
}
@@ -172,7 +172,7 @@ extension RawSpan {
172172
@_alwaysEmitIntoClient
173173
@lifetime(immortal)
174174
public init<T: BitwiseCopyable>(
175-
_unsafeElements buffer: UnsafeMutableBufferPointer<T>
175+
_unsafeElements buffer: borrowing UnsafeMutableBufferPointer<T>
176176
) {
177177
self.init(_unsafeElements: UnsafeBufferPointer(buffer))
178178
}
@@ -210,12 +210,12 @@ extension RawSpan {
210210
@_alwaysEmitIntoClient
211211
@lifetime(immortal)
212212
public init<T: BitwiseCopyable>(
213-
_unsafeStart pointer: UnsafePointer<T>,
213+
_unsafeStart pointer: borrowing UnsafePointer<T>,
214214
count: Int
215215
) {
216216
_precondition(count >= 0, "Count must not be negative")
217217
self.init(
218-
_unchecked: pointer, byteCount: count * MemoryLayout<T>.stride
218+
_unchecked: copy pointer, byteCount: count * MemoryLayout<T>.stride
219219
)
220220
}
221221

stdlib/public/core/Span/Span.swift

Lines changed: 20 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ public struct Span<Element: ~Copyable & ~Escapable>
3030
@_alwaysEmitIntoClient
3131
@lifetime(immortal)
3232
internal init(
33-
_unchecked pointer: UnsafeRawPointer?,
33+
_unchecked pointer: borrowing UnsafeRawPointer?,
3434
count: Int
3535
) {
36-
_pointer = pointer
36+
_pointer = copy pointer
3737
_count = count
3838
}
3939
}
@@ -59,14 +59,15 @@ extension Span where Element: ~Copyable {
5959
@_alwaysEmitIntoClient
6060
@lifetime(immortal)
6161
public init(
62-
_unsafeElements buffer: UnsafeBufferPointer<Element>
62+
_unsafeElements buffer: borrowing UnsafeBufferPointer<Element>
6363
) {
64+
let baseAddress = buffer.baseAddress //FIXME: rdar://138665760
6465
_precondition(
65-
((Int(bitPattern: buffer.baseAddress) &
66+
((Int(bitPattern: baseAddress) &
6667
(MemoryLayout<Element>.alignment &- 1)) == 0),
6768
"baseAddress must be properly aligned to access Element"
6869
)
69-
self.init(_unchecked: buffer.baseAddress, count: buffer.count)
70+
self.init(_unchecked: baseAddress, count: buffer.count)
7071
}
7172

7273
/// Unsafely creates a `Span` over initialized memory.
@@ -82,7 +83,7 @@ extension Span where Element: ~Copyable {
8283
@_alwaysEmitIntoClient
8384
@lifetime(immortal)
8485
public init(
85-
_unsafeElements buffer: UnsafeMutableBufferPointer<Element>
86+
_unsafeElements buffer: borrowing UnsafeMutableBufferPointer<Element>
8687
) {
8788
self.init(_unsafeElements: UnsafeBufferPointer(buffer))
8889
}
@@ -102,11 +103,11 @@ extension Span where Element: ~Copyable {
102103
@_alwaysEmitIntoClient
103104
@lifetime(immortal)
104105
public init(
105-
_unsafeStart pointer: UnsafePointer<Element>,
106+
_unsafeStart pointer: borrowing UnsafePointer<Element>,
106107
count: Int
107108
) {
108109
_precondition(count >= 0, "Count must not be negative")
109-
self.init(_unsafeElements: .init(start: pointer, count: count))
110+
self.init(_unsafeElements: .init(start: copy pointer, count: count))
110111
}
111112
}
112113

@@ -127,7 +128,7 @@ extension Span {
127128
@_alwaysEmitIntoClient
128129
@lifetime(immortal)
129130
public init(
130-
_unsafeElements buffer: Slice<UnsafeBufferPointer<Element>>
131+
_unsafeElements buffer: borrowing Slice<UnsafeBufferPointer<Element>>
131132
) {
132133
self.init(_unsafeElements: UnsafeBufferPointer(rebasing: buffer))
133134
}
@@ -145,7 +146,7 @@ extension Span {
145146
@_alwaysEmitIntoClient
146147
@lifetime(immortal)
147148
public init(
148-
_unsafeElements buffer: Slice<UnsafeMutableBufferPointer<Element>>
149+
_unsafeElements buffer: borrowing Slice<UnsafeMutableBufferPointer<Element>>
149150
) {
150151
self.init(_unsafeElements: UnsafeBufferPointer(rebasing: buffer))
151152
}
@@ -173,10 +174,11 @@ extension Span where Element: BitwiseCopyable {
173174
@_alwaysEmitIntoClient
174175
@lifetime(immortal)
175176
public init(
176-
_unsafeBytes buffer: UnsafeRawBufferPointer
177+
_unsafeBytes buffer: borrowing UnsafeRawBufferPointer
177178
) {
179+
let baseAddress = buffer.baseAddress //FIXME: rdar://138665760
178180
_precondition(
179-
((Int(bitPattern: buffer.baseAddress) &
181+
((Int(bitPattern: baseAddress) &
180182
(MemoryLayout<Element>.alignment &- 1)) == 0),
181183
"baseAddress must be properly aligned to access Element"
182184
)
@@ -185,7 +187,7 @@ extension Span where Element: BitwiseCopyable {
185187
_precondition(
186188
remainder == 0, "Span must contain a whole number of elements"
187189
)
188-
self.init(_unchecked: buffer.baseAddress, count: count)
190+
self.init(_unchecked: baseAddress, count: count)
189191
}
190192

191193
/// Unsafely creates a `Span` over initialized memory.
@@ -206,7 +208,7 @@ extension Span where Element: BitwiseCopyable {
206208
@_alwaysEmitIntoClient
207209
@lifetime(immortal)
208210
public init(
209-
_unsafeBytes buffer: UnsafeMutableRawBufferPointer
211+
_unsafeBytes buffer: borrowing UnsafeMutableRawBufferPointer
210212
) {
211213
self.init(_unsafeBytes: UnsafeRawBufferPointer(buffer))
212214
}
@@ -230,11 +232,11 @@ extension Span where Element: BitwiseCopyable {
230232
@_alwaysEmitIntoClient
231233
@lifetime(immortal)
232234
public init(
233-
_unsafeStart pointer: UnsafeRawPointer,
235+
_unsafeStart pointer: borrowing UnsafeRawPointer,
234236
byteCount: Int
235237
) {
236238
_precondition(byteCount >= 0, "Count must not be negative")
237-
self.init(_unsafeBytes: .init(start: pointer, count: byteCount))
239+
self.init(_unsafeBytes: .init(start: copy pointer, count: byteCount))
238240
}
239241

240242
/// Unsafely creates a `Span` over initialized memory.
@@ -255,7 +257,7 @@ extension Span where Element: BitwiseCopyable {
255257
@_alwaysEmitIntoClient
256258
@lifetime(immortal)
257259
public init(
258-
_unsafeBytes buffer: Slice<UnsafeRawBufferPointer>
260+
_unsafeBytes buffer: borrowing Slice<UnsafeRawBufferPointer>
259261
) {
260262
self.init(_unsafeBytes: UnsafeRawBufferPointer(rebasing: buffer))
261263
}
@@ -278,7 +280,7 @@ extension Span where Element: BitwiseCopyable {
278280
@_alwaysEmitIntoClient
279281
@lifetime(immortal)
280282
public init(
281-
_unsafeBytes buffer: Slice<UnsafeMutableRawBufferPointer>
283+
_unsafeBytes buffer: borrowing Slice<UnsafeMutableRawBufferPointer>
282284
) {
283285
self.init(_unsafeBytes: UnsafeRawBufferPointer(rebasing: buffer))
284286
}

0 commit comments

Comments
 (0)