Skip to content

Commit ff6dbdb

Browse files
committed
[stdlib] less assumingMemoryBound, rebind instead
1 parent f04ed60 commit ff6dbdb

File tree

2 files changed

+43
-33
lines changed

2 files changed

+43
-33
lines changed

stdlib/public/core/CString.swift

Lines changed: 27 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -45,16 +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 = nullTerminatedUTF8.withMemoryRebound(to: UInt8.self, capacity: len) {
49-
String._fromUTF8Repairing(UnsafeBufferPointer(start: $0, count: len)).0
48+
let buffer = UnsafeBufferPointer(start: nullTerminatedUTF8, count: len)
49+
self = buffer.withMemoryRebound(to: UInt8.self) {
50+
String._fromUTF8Repairing($0).0
5051
}
5152
}
5253

5354
@inlinable
5455
@_alwaysEmitIntoClient
5556
public init(cString nullTerminatedUTF8: [CChar]) {
56-
self = nullTerminatedUTF8.withUnsafeBytes {
57-
String(_checkingCString: $0.assumingMemoryBound(to: UInt8.self))
57+
self = nullTerminatedUTF8.withUnsafeBufferPointer {
58+
$0.withMemoryRebound(to: UInt8.self, String.init(_checkingCString:))
5859
}
5960
}
6061

@@ -247,14 +248,18 @@ extension String {
247248
guard let cPtr = cString else { return nil }
248249

249250
if _fastPath(encoding == Unicode.UTF8.self) {
250-
let ptr = UnsafeRawPointer(cPtr).assumingMemoryBound(to: UInt8.self)
251-
let len = UTF8._nullCodeUnitOffset(in: ptr)
252-
let codeUnits = UnsafeBufferPointer(start: ptr, count: len)
253-
if isRepairing {
254-
return String._fromUTF8Repairing(codeUnits)
255-
} else {
256-
guard let str = String._tryFromUTF8(codeUnits) else { return nil }
257-
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
258263
}
259264
}
260265

@@ -282,16 +287,17 @@ extension String {
282287
}
283288

284289
if _fastPath(encoding == Unicode.UTF8.self) {
285-
return cString.prefix(length).withUnsafeBytes {
286-
buf -> (result: String, repairsMade: Bool)? in
287-
let codeUnits = buf.assumingMemoryBound(to: UInt8.self)
288-
if isRepairing {
289-
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
290300
}
291-
else if let str = String._tryFromUTF8(codeUnits) {
292-
return (str, false)
293-
}
294-
return nil
295301
}
296302
}
297303

test/stdlib/StringAPICString.swift

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -253,9 +253,10 @@ CStringTests.test("String.cString.with.Array.CChar.input") {
253253
do {
254254
let (u8p, dealloc) = getASCIIUTF8()
255255
defer { dealloc() }
256-
let cstr = UnsafeRawPointer(u8p).assumingMemoryBound(to: CChar.self)
257-
let buffer = UnsafeBufferPointer(start: cstr, count: getUTF8Length(u8p)+1)
258-
let str = String(cString: Array(buffer))
256+
let buffer = UnsafeBufferPointer(start: u8p, count: getUTF8Length(u8p)+1)
257+
let str = buffer.withMemoryRebound(to: CChar.self) {
258+
String(cString: Array($0))
259+
}
259260
str.withCString {
260261
$0.withMemoryRebound(to: UInt8.self, capacity: buffer.count) {
261262
expectEqualCString(u8p, $0)
@@ -318,9 +319,10 @@ CStringTests.test("String.validatingUTF8.with.Array.input") {
318319
do {
319320
let (u8p, dealloc) = getASCIIUTF8()
320321
defer { dealloc() }
321-
let cstr = UnsafeRawPointer(u8p).assumingMemoryBound(to: CChar.self)
322-
let buffer = UnsafeBufferPointer(start: cstr, count: getUTF8Length(u8p)+1)
323-
let str = String(validatingUTF8: Array(buffer))
322+
let buffer = UnsafeBufferPointer(start: u8p, count: getUTF8Length(u8p)+1)
323+
let str = buffer.withMemoryRebound(to: CChar.self) {
324+
String(validatingUTF8: Array($0))
325+
}
324326
expectNotNil(str)
325327
str?.withCString {
326328
$0.withMemoryRebound(to: UInt8.self, capacity: buffer.count) {
@@ -373,9 +375,10 @@ CStringTests.test("String.decodeCString.with.Array.input") {
373375
do {
374376
let (u8p, dealloc) = getASCIIUTF8()
375377
defer { dealloc() }
376-
let cstr = UnsafeRawPointer(u8p).assumingMemoryBound(to: Unicode.UTF8.CodeUnit.self)
377-
let buffer = UnsafeBufferPointer(start: cstr, count: getUTF8Length(u8p)+1)
378-
let result = String.decodeCString(Array(buffer), as: Unicode.UTF8.self)
378+
let buffer = UnsafeBufferPointer(start: u8p, count: getUTF8Length(u8p)+1)
379+
let result = buffer.withMemoryRebound(to: Unicode.UTF8.CodeUnit.self) {
380+
String.decodeCString(Array($0), as: Unicode.UTF8.self)
381+
}
379382
expectNotNil(result)
380383
expectEqual(result?.repairsMade, false)
381384
result?.result.withCString {
@@ -436,9 +439,10 @@ CStringTests.test("String.init.decodingCString.with.Array.input") {
436439
do {
437440
let (u8p, dealloc) = getASCIIUTF8()
438441
defer { dealloc() }
439-
let cstr = UnsafeRawPointer(u8p).assumingMemoryBound(to: Unicode.UTF8.CodeUnit.self)
440-
let buffer = UnsafeBufferPointer(start: cstr, count: getUTF8Length(u8p)+1)
441-
let str = String(decodingCString: Array(buffer), as: Unicode.UTF8.self)
442+
let buffer = UnsafeBufferPointer(start: u8p, count: getUTF8Length(u8p)+1)
443+
let str = buffer.withMemoryRebound(to: Unicode.UTF8.CodeUnit.self) {
444+
String(decodingCString: Array($0), as: Unicode.UTF8.self)
445+
}
442446
str.withCString {
443447
$0.withMemoryRebound(to: UInt8.self, capacity: buffer.count) {
444448
expectEqualCString(u8p, $0)

0 commit comments

Comments
 (0)