Skip to content

Commit d2970cd

Browse files
authored
Merge pull request #42226 from glessard/rdar91343475
[stdlib] remove most uses of _asCChar and _asUInt8
2 parents 78aae7e + 1523531 commit d2970cd

File tree

3 files changed

+52
-40
lines changed

3 files changed

+52
-40
lines changed

stdlib/public/core/CString.swift

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -45,15 +45,17 @@ extension String {
4545
/// - Parameter nullTerminatedUTF8: A pointer to a null-terminated UTF-8 code sequence.
4646
public init(cString nullTerminatedUTF8: UnsafePointer<CChar>) {
4747
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+
}
5052
}
5153

5254
@inlinable
5355
@_alwaysEmitIntoClient
5456
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:))
5759
}
5860
}
5961

@@ -150,8 +152,9 @@ extension String {
150152
/// - Parameter cString: A pointer to a null-terminated UTF-8 code sequence.
151153
public init?(validatingUTF8 cString: UnsafePointer<CChar>) {
152154
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+
})
155158
else { return nil }
156159

157160
self = str
@@ -165,9 +168,10 @@ extension String {
165168
"input of String.init(validatingUTF8:) must be null-terminated"
166169
)
167170
}
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 }
171175

172176
self = string
173177
}
@@ -244,14 +248,18 @@ extension String {
244248
guard let cPtr = cString else { return nil }
245249

246250
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
255263
}
256264
}
257265

@@ -279,16 +287,17 @@ extension String {
279287
}
280288

281289
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
287300
}
288-
else if let str = String._tryFromUTF8(codeUnits) {
289-
return (str, false)
290-
}
291-
return nil
292301
}
293302
}
294303

stdlib/public/core/StringGuts.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -167,8 +167,7 @@ extension _StringGuts {
167167
_ f: (UnsafeBufferPointer<CChar>) throws -> R
168168
) rethrows -> R {
169169
return try self.withFastUTF8 { utf8 in
170-
let ptr = utf8.baseAddress._unsafelyUnwrappedUnchecked._asCChar
171-
return try f(UnsafeBufferPointer(start: ptr, count: utf8.count))
170+
return try utf8.withMemoryRebound(to: CChar.self, f)
172171
}
173172
}
174173
}

test/stdlib/StringAPICString.swift

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -254,9 +254,10 @@ CStringTests.test("String.cString.with.Array.CChar.input") {
254254
do {
255255
let (u8p, dealloc) = getASCIIUTF8()
256256
defer { dealloc() }
257-
let cstr = UnsafeRawPointer(u8p).assumingMemoryBound(to: CChar.self)
258-
let buffer = UnsafeBufferPointer(start: cstr, count: getUTF8Length(u8p)+1)
259-
let str = String(cString: Array(buffer))
257+
let buffer = UnsafeBufferPointer(start: u8p, count: getUTF8Length(u8p)+1)
258+
let str = buffer.withMemoryRebound(to: CChar.self) {
259+
String(cString: Array($0))
260+
}
260261
str.withCString {
261262
$0.withMemoryRebound(to: UInt8.self, capacity: buffer.count) {
262263
expectEqualCString(u8p, $0)
@@ -324,9 +325,10 @@ CStringTests.test("String.validatingUTF8.with.Array.input") {
324325
do {
325326
let (u8p, dealloc) = getASCIIUTF8()
326327
defer { dealloc() }
327-
let cstr = UnsafeRawPointer(u8p).assumingMemoryBound(to: CChar.self)
328-
let buffer = UnsafeBufferPointer(start: cstr, count: getUTF8Length(u8p)+1)
329-
let str = String(validatingUTF8: Array(buffer))
328+
let buffer = UnsafeBufferPointer(start: u8p, count: getUTF8Length(u8p)+1)
329+
let str = buffer.withMemoryRebound(to: CChar.self) {
330+
String(validatingUTF8: Array($0))
331+
}
330332
expectNotNil(str)
331333
str?.withCString {
332334
$0.withMemoryRebound(to: UInt8.self, capacity: buffer.count) {
@@ -382,9 +384,10 @@ CStringTests.test("String.decodeCString.with.Array.input") {
382384
do {
383385
let (u8p, dealloc) = getASCIIUTF8()
384386
defer { dealloc() }
385-
let cstr = UnsafeRawPointer(u8p).assumingMemoryBound(to: Unicode.UTF8.CodeUnit.self)
386-
let buffer = UnsafeBufferPointer(start: cstr, count: getUTF8Length(u8p)+1)
387-
let result = String.decodeCString(Array(buffer), as: Unicode.UTF8.self)
387+
let buffer = UnsafeBufferPointer(start: u8p, count: getUTF8Length(u8p)+1)
388+
let result = buffer.withMemoryRebound(to: Unicode.UTF8.CodeUnit.self) {
389+
String.decodeCString(Array($0), as: Unicode.UTF8.self)
390+
}
388391
expectNotNil(result)
389392
expectEqual(result?.repairsMade, false)
390393
result?.result.withCString {
@@ -448,9 +451,10 @@ CStringTests.test("String.init.decodingCString.with.Array.input") {
448451
do {
449452
let (u8p, dealloc) = getASCIIUTF8()
450453
defer { dealloc() }
451-
let cstr = UnsafeRawPointer(u8p).assumingMemoryBound(to: Unicode.UTF8.CodeUnit.self)
452-
let buffer = UnsafeBufferPointer(start: cstr, count: getUTF8Length(u8p)+1)
453-
let str = String(decodingCString: Array(buffer), as: Unicode.UTF8.self)
454+
let buffer = UnsafeBufferPointer(start: u8p, count: getUTF8Length(u8p)+1)
455+
let str = buffer.withMemoryRebound(to: Unicode.UTF8.CodeUnit.self) {
456+
String(decodingCString: Array($0), as: Unicode.UTF8.self)
457+
}
454458
str.withCString {
455459
$0.withMemoryRebound(to: UInt8.self, capacity: buffer.count) {
456460
expectEqualCString(u8p, $0)

0 commit comments

Comments
 (0)