@@ -45,15 +45,17 @@ extension String {
45
45
/// - Parameter nullTerminatedUTF8: A pointer to a null-terminated UTF-8 code sequence.
46
46
public init ( cString nullTerminatedUTF8: UnsafePointer < CChar > ) {
47
47
let len = UTF8 . _nullCodeUnitOffset ( in: nullTerminatedUTF8)
48
- self = String . _fromUTF8Repairing (
49
- UnsafeBufferPointer ( start: nullTerminatedUTF8. _asUInt8, count: len) ) . 0
48
+ let buffer = UnsafeBufferPointer ( start: nullTerminatedUTF8, count: len)
49
+ self = buffer. withMemoryRebound ( to: UInt8 . self) {
50
+ String . _fromUTF8Repairing ( $0) . 0
51
+ }
50
52
}
51
53
52
54
@inlinable
53
55
@_alwaysEmitIntoClient
54
56
public init ( cString nullTerminatedUTF8: [ CChar ] ) {
55
- self = nullTerminatedUTF8. withUnsafeBytes {
56
- String ( _checkingCString : $0. assumingMemoryBound ( to: UInt8 . self) )
57
+ self = nullTerminatedUTF8. withUnsafeBufferPointer {
58
+ $0. withMemoryRebound ( to: UInt8 . self, String . init ( _checkingCString : ) )
57
59
}
58
60
}
59
61
@@ -150,8 +152,9 @@ extension String {
150
152
/// - Parameter cString: A pointer to a null-terminated UTF-8 code sequence.
151
153
public init ? ( validatingUTF8 cString: UnsafePointer < CChar > ) {
152
154
let len = UTF8 . _nullCodeUnitOffset ( in: cString)
153
- guard let str = String . _tryFromUTF8 (
154
- UnsafeBufferPointer ( start: cString. _asUInt8, count: len) )
155
+ guard let str = cString. withMemoryRebound ( to: UInt8 . self, capacity: len, {
156
+ String . _tryFromUTF8 ( UnsafeBufferPointer ( start: $0, count: len) )
157
+ } )
155
158
else { return nil }
156
159
157
160
self = str
@@ -165,9 +168,10 @@ extension String {
165
168
" input of String.init(validatingUTF8:) must be null-terminated "
166
169
)
167
170
}
168
- guard let string = cString. prefix ( length) . withUnsafeBytes ( {
169
- String . _tryFromUTF8 ( $0. assumingMemoryBound ( to: UInt8 . self) )
170
- } ) else { return nil }
171
+ guard let string = cString. prefix ( length) . withUnsafeBufferPointer ( {
172
+ $0. withMemoryRebound ( to: UInt8 . self, String . _tryFromUTF8 ( _: ) )
173
+ } )
174
+ else { return nil }
171
175
172
176
self = string
173
177
}
@@ -244,14 +248,18 @@ extension String {
244
248
guard let cPtr = cString else { return nil }
245
249
246
250
if _fastPath ( encoding == Unicode . UTF8. self) {
247
- let ptr = UnsafeRawPointer ( cPtr) . assumingMemoryBound ( to: UInt8 . self)
248
- let len = UTF8 . _nullCodeUnitOffset ( in: ptr)
249
- let codeUnits = UnsafeBufferPointer ( start: ptr, count: len)
250
- if isRepairing {
251
- return String . _fromUTF8Repairing ( codeUnits)
252
- } else {
253
- guard let str = String . _tryFromUTF8 ( codeUnits) else { return nil }
254
- return ( str, false )
251
+ let len = UTF8 . _nullCodeUnitOffset (
252
+ in: UnsafeRawPointer ( cPtr) . assumingMemoryBound ( to: UInt8 . self)
253
+ )
254
+ let bytes = UnsafeBufferPointer ( start: cPtr, count: len)
255
+ return bytes. withMemoryRebound ( to: UInt8 . self) { codeUnits in
256
+ if isRepairing {
257
+ return String . _fromUTF8Repairing ( codeUnits)
258
+ }
259
+ else if let str = String . _tryFromUTF8 ( codeUnits) {
260
+ return ( str, false )
261
+ }
262
+ return nil
255
263
}
256
264
}
257
265
@@ -279,16 +287,17 @@ extension String {
279
287
}
280
288
281
289
if _fastPath ( encoding == Unicode . UTF8. self) {
282
- return cString. prefix ( length) . withUnsafeBytes {
283
- buf -> ( result: String , repairsMade: Bool ) ? in
284
- let codeUnits = buf. assumingMemoryBound ( to: UInt8 . self)
285
- if isRepairing {
286
- return String . _fromUTF8Repairing ( codeUnits)
290
+ return cString. prefix ( length) . withUnsafeBufferPointer {
291
+ buffer -> ( result: String , repairsMade: Bool ) ? in
292
+ return buffer. withMemoryRebound ( to: UInt8 . self) { codeUnits in
293
+ if isRepairing {
294
+ return String . _fromUTF8Repairing ( codeUnits)
295
+ }
296
+ else if let str = String . _tryFromUTF8 ( codeUnits) {
297
+ return ( str, false )
298
+ }
299
+ return nil
287
300
}
288
- else if let str = String . _tryFromUTF8 ( codeUnits) {
289
- return ( str, false )
290
- }
291
- return nil
292
301
}
293
302
}
294
303
0 commit comments