@@ -46,6 +46,7 @@ public struct RawSpan: ~Escapable, Copyable, BitwiseCopyable {
46
46
internal let _count : Int
47
47
48
48
/// FIXME: Remove once supported old compilers can recognize lifetime dependence
49
+ @unsafe
49
50
@_unsafeNonescapableResult
50
51
@_alwaysEmitIntoClient
51
52
@inline ( __always)
@@ -67,6 +68,7 @@ public struct RawSpan: ~Escapable, Copyable, BitwiseCopyable {
67
68
/// - Parameters:
68
69
/// - pointer: a pointer to the first initialized byte.
69
70
/// - byteCount: the number of initialized bytes in the span.
71
+ @unsafe
70
72
@_alwaysEmitIntoClient
71
73
@inline ( __always)
72
74
@lifetime ( borrow pointer)
@@ -93,13 +95,14 @@ extension RawSpan {
93
95
///
94
96
/// - Parameters:
95
97
/// - buffer: an `UnsafeRawBufferPointer` to initialized memory.
98
+ @unsafe
96
99
@_alwaysEmitIntoClient
97
100
@lifetime ( borrow buffer)
98
101
public init (
99
102
_unsafeBytes buffer: UnsafeRawBufferPointer
100
103
) {
101
104
let baseAddress = buffer. baseAddress
102
- let span = RawSpan ( _unchecked: baseAddress, byteCount: buffer. count)
105
+ let span = unsafe RawSpan( _unchecked: baseAddress, byteCount: buffer. count)
103
106
// As a trivial value, 'baseAddress' does not formally depend on the
104
107
// lifetime of 'buffer'. Make the dependence explicit.
105
108
self = unsafe _override Lifetime ( span, borrowing: buffer)
@@ -113,13 +116,14 @@ extension RawSpan {
113
116
///
114
117
/// - Parameters:
115
118
/// - buffer: an `UnsafeRawBufferPointer` to initialized memory.
119
+ @unsafe
116
120
@_alwaysEmitIntoClient
117
121
@lifetime ( borrow buffer)
118
122
public init (
119
123
_unsafeBytes buffer: borrowing Slice < UnsafeRawBufferPointer >
120
124
) {
121
125
let rawBuffer = unsafe UnsafeRawBufferPointer( rebasing: buffer)
122
- let span = RawSpan ( _unsafeBytes: rawBuffer)
126
+ let span = unsafe RawSpan( _unsafeBytes: rawBuffer)
123
127
// As a trivial value, 'rawBuffer' does not formally depend on the
124
128
// lifetime of 'buffer'. Make the dependence explicit.
125
129
self = unsafe _override Lifetime ( span, borrowing: buffer)
@@ -133,18 +137,28 @@ extension RawSpan {
133
137
///
134
138
/// - Parameters:
135
139
/// - buffer: an `UnsafeRawBufferPointer` to initialized memory.
140
+ @unsafe
136
141
@_alwaysEmitIntoClient
137
142
@lifetime ( borrow buffer)
138
143
public init (
139
144
_unsafeBytes buffer: UnsafeMutableRawBufferPointer
140
145
) {
141
146
let rawBuffer = UnsafeRawBufferPointer ( buffer)
142
- let span = RawSpan ( _unsafeBytes: rawBuffer)
147
+ let span = unsafe RawSpan( _unsafeBytes: rawBuffer)
143
148
// As a trivial value, 'rawBuffer' does not formally depend on the
144
149
// lifetime of 'buffer'. Make the dependence explicit.
145
150
self = unsafe _override Lifetime ( span, borrowing: buffer)
146
151
}
147
152
153
+ /// Unsafely create a `RawSpan` over initialized memory.
154
+ ///
155
+ /// The memory in `buffer` must remain valid, initialized and immutable
156
+ /// throughout the lifetime of the newly-created `RawSpan`.
157
+ /// Failure to maintain this invariant results in undefined behaviour.
158
+ ///
159
+ /// - Parameters:
160
+ /// - buffer: an `UnsafeRawBufferPointer` to initialized memory.
161
+ @unsafe
148
162
@_alwaysEmitIntoClient
149
163
@lifetime ( borrow buffer)
150
164
public init (
@@ -153,7 +167,7 @@ extension RawSpan {
153
167
let rawBuffer = UnsafeRawBufferPointer (
154
168
unsafe UnsafeMutableRawBufferPointer( rebasing: buffer)
155
169
)
156
- let span = RawSpan ( _unsafeBytes: rawBuffer)
170
+ let span = unsafe RawSpan( _unsafeBytes: rawBuffer)
157
171
// As a trivial value, 'rawBuffer' does not formally depend on the
158
172
// lifetime of 'buffer'. Make the dependence explicit.
159
173
self = unsafe _override Lifetime ( span, borrowing: buffer)
@@ -169,14 +183,15 @@ extension RawSpan {
169
183
/// - Parameters:
170
184
/// - pointer: a pointer to the first initialized byte.
171
185
/// - byteCount: the number of initialized bytes in the span.
186
+ @unsafe
172
187
@_alwaysEmitIntoClient
173
188
@lifetime ( borrow pointer)
174
189
public init (
175
190
_unsafeStart pointer: UnsafeRawPointer ,
176
191
byteCount: Int
177
192
) {
178
193
_precondition ( byteCount >= 0 , " Count must not be negative " )
179
- self . init ( _unchecked: pointer, byteCount: byteCount)
194
+ unsafe self. init ( _unchecked: pointer, byteCount: byteCount)
180
195
}
181
196
182
197
/// Unsafely create a `RawSpan` over initialized memory.
@@ -187,13 +202,14 @@ extension RawSpan {
187
202
///
188
203
/// - Parameters:
189
204
/// - buffer: an `UnsafeRawBufferPointer` to initialized memory.
205
+ @unsafe
190
206
@_alwaysEmitIntoClient
191
207
@lifetime ( borrow buffer)
192
208
public init < T: BitwiseCopyable > (
193
209
_unsafeElements buffer: UnsafeBufferPointer < T >
194
210
) {
195
211
let rawBuffer = UnsafeRawBufferPointer ( buffer)
196
- let span = RawSpan ( _unsafeBytes: rawBuffer)
212
+ let span = unsafe RawSpan( _unsafeBytes: rawBuffer)
197
213
// As a trivial value, 'rawBuffer' does not formally depend on the
198
214
// lifetime of 'buffer'. Make the dependence explicit.
199
215
self = unsafe _override Lifetime ( span, borrowing: buffer)
@@ -207,13 +223,14 @@ extension RawSpan {
207
223
///
208
224
/// - Parameters:
209
225
/// - buffer: an `UnsafeRawBufferPointer` to initialized memory.
226
+ @unsafe
210
227
@_alwaysEmitIntoClient
211
228
@lifetime ( borrow buffer)
212
229
public init < T: BitwiseCopyable > (
213
230
_unsafeElements buffer: borrowing Slice < UnsafeBufferPointer < T > >
214
231
) {
215
232
let rawBuffer = UnsafeRawBufferPointer ( unsafe . init ( rebasing: buffer) )
216
- let span = RawSpan ( _unsafeBytes: rawBuffer)
233
+ let span = unsafe RawSpan( _unsafeBytes: rawBuffer)
217
234
// As a trivial value, 'rawBuffer' does not formally depend on the
218
235
// lifetime of 'buffer'. Make the dependence explicit.
219
236
self = unsafe _override Lifetime ( span, borrowing: buffer)
@@ -227,13 +244,14 @@ extension RawSpan {
227
244
///
228
245
/// - Parameters:
229
246
/// - buffer: an `UnsafeRawBufferPointer` to initialized memory.
247
+ @unsafe
230
248
@_alwaysEmitIntoClient
231
249
@lifetime ( borrow buffer)
232
250
public init < T: BitwiseCopyable > (
233
251
_unsafeElements buffer: UnsafeMutableBufferPointer < T >
234
252
) {
235
253
let rawBuffer = UnsafeRawBufferPointer ( buffer)
236
- let span = RawSpan ( _unsafeBytes: rawBuffer)
254
+ let span = unsafe RawSpan( _unsafeBytes: rawBuffer)
237
255
// As a trivial value, 'rawBuffer' does not formally depend on the
238
256
// lifetime of 'buffer'. Make the dependence explicit.
239
257
self = unsafe _override Lifetime ( span, borrowing: buffer)
@@ -247,6 +265,7 @@ extension RawSpan {
247
265
///
248
266
/// - Parameters:
249
267
/// - buffer: an `UnsafeRawBufferPointer` to initialized memory.
268
+ @unsafe
250
269
@_alwaysEmitIntoClient
251
270
@lifetime ( borrow buffer)
252
271
public init < T: BitwiseCopyable > (
@@ -255,7 +274,7 @@ extension RawSpan {
255
274
let rawBuffer = UnsafeRawBufferPointer (
256
275
unsafe UnsafeMutableBufferPointer( rebasing: buffer)
257
276
)
258
- let span = RawSpan ( _unsafeBytes: rawBuffer)
277
+ let span = unsafe RawSpan( _unsafeBytes: rawBuffer)
259
278
// As a trivial value, 'rawBuffer' does not formally depend on the
260
279
// lifetime of 'buffer'. Make the dependence explicit.
261
280
self = unsafe _override Lifetime ( span, borrowing: buffer)
@@ -271,14 +290,15 @@ extension RawSpan {
271
290
/// - Parameters:
272
291
/// - pointer: a pointer to the first initialized byte.
273
292
/// - byteCount: the number of initialized bytes in the span.
293
+ @unsafe
274
294
@_alwaysEmitIntoClient
275
295
@lifetime ( borrow pointer)
276
296
public init < T: BitwiseCopyable > (
277
297
_unsafeStart pointer: UnsafePointer < T > ,
278
298
count: Int
279
299
) {
280
300
_precondition ( count >= 0 , " Count must not be negative " )
281
- self . init (
301
+ unsafe self. init (
282
302
_unchecked: pointer, byteCount: count * MemoryLayout< T> . stride
283
303
)
284
304
}
@@ -293,7 +313,7 @@ extension RawSpan {
293
313
public init < Element: BitwiseCopyable > (
294
314
_elements span: borrowing Span < Element >
295
315
) {
296
- self . init (
316
+ unsafe self. init (
297
317
_unchecked: span. _pointer,
298
318
byteCount: span. count &* MemoryLayout< Element> . stride
299
319
)
@@ -376,7 +396,7 @@ extension RawSpan {
376
396
@lifetime ( self )
377
397
public func _extracting( unchecked bounds: Range < Int > ) -> Self {
378
398
let newStart = unsafe _pointer? . advanced ( by: bounds. lowerBound)
379
- let newSpan = RawSpan ( _unchecked: newStart, byteCount: bounds. count)
399
+ let newSpan = unsafe RawSpan( _unchecked: newStart, byteCount: bounds. count)
380
400
return unsafe _override Lifetime ( newSpan, copying: self )
381
401
}
382
402
@@ -494,7 +514,7 @@ extension RawSpan {
494
514
as type: T . Type
495
515
) -> Span < T > {
496
516
let rawBuffer = unsafe UnsafeRawBufferPointer( start: _pointer, count: _count)
497
- let newSpan = Span < T > ( _unsafeBytes: rawBuffer)
517
+ let newSpan = unsafe Span< T > ( _unsafeBytes: rawBuffer)
498
518
// As a trivial value, 'rawBuffer' does not formally depend on the
499
519
// lifetime of 'self'. Make the dependence explicit.
500
520
return unsafe _override Lifetime ( newSpan, copying: self )
@@ -673,7 +693,7 @@ extension RawSpan {
673
693
public func _extracting( first maxLength: Int ) -> Self {
674
694
_precondition ( maxLength >= 0 , " Can't have a prefix of negative length " )
675
695
let newCount = min ( maxLength, byteCount)
676
- return Self ( _unchecked: _pointer, byteCount: newCount)
696
+ return unsafe Self( _unchecked: _pointer, byteCount: newCount)
677
697
}
678
698
679
699
/// Returns a span over all but the given number of trailing bytes.
@@ -695,7 +715,8 @@ extension RawSpan {
695
715
public func _extracting( droppingLast k: Int ) -> Self {
696
716
_precondition ( k >= 0 , " Can't drop a negative number of bytes " )
697
717
let droppedCount = min ( k, byteCount)
698
- return Self ( _unchecked: _pointer, byteCount: byteCount &- droppedCount)
718
+ let count = byteCount &- droppedCount
719
+ return unsafe Self( _unchecked: _pointer, byteCount: count)
699
720
}
700
721
701
722
/// Returns a span containing the trailing bytes of the span,
@@ -719,7 +740,7 @@ extension RawSpan {
719
740
_precondition ( maxLength >= 0 , " Can't have a suffix of negative length " )
720
741
let newCount = min ( maxLength, byteCount)
721
742
let newStart = unsafe _pointer? . advanced ( by: byteCount &- newCount)
722
- let newSpan = Self ( _unchecked: newStart, byteCount: newCount)
743
+ let newSpan = unsafe Self( _unchecked: newStart, byteCount: newCount)
723
744
// As a trivial value, 'newStart' does not formally depend on the
724
745
// lifetime of 'self'. Make the dependence explicit.
725
746
return unsafe _override Lifetime ( newSpan, copying: self )
@@ -743,9 +764,10 @@ extension RawSpan {
743
764
@lifetime ( self )
744
765
public func _extracting( droppingFirst k: Int ) -> Self {
745
766
_precondition ( k >= 0 , " Can't drop a negative number of bytes " )
746
- let dropped = min ( k, byteCount)
747
- let newStart = unsafe _pointer? . advanced ( by: dropped)
748
- let newSpan = Self ( _unchecked: newStart, byteCount: byteCount &- dropped)
767
+ let droppedCount = min ( k, byteCount)
768
+ let newStart = unsafe _pointer? . advanced ( by: droppedCount)
769
+ let newCount = byteCount &- droppedCount
770
+ let newSpan = unsafe Self( _unchecked: newStart, byteCount: newCount)
749
771
// As a trivial value, 'newStart' does not formally depend on the
750
772
// lifetime of 'self'. Make the dependence explicit.
751
773
return unsafe _override Lifetime ( newSpan, copying: self )
0 commit comments