Skip to content

Commit d7eae91

Browse files
committed
UTF-8 repairing ASCII fast-path
1 parent bc7be13 commit d7eae91

File tree

2 files changed

+22
-1
lines changed

2 files changed

+22
-1
lines changed

stdlib/public/core/Character.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -205,13 +205,15 @@ extension String {
205205

206206
extension Character : Equatable {
207207
@inlinable @inline(__always)
208+
@_effects(readonly)
208209
public static func == (lhs: Character, rhs: Character) -> Bool {
209210
return lhs._str == rhs._str
210211
}
211212
}
212213

213214
extension Character : Comparable {
214215
@inlinable @inline(__always)
216+
@_effects(readonly)
215217
public static func < (lhs: Character, rhs: Character) -> Bool {
216218
return lhs._str < rhs._str
217219
}

stdlib/public/core/StringCreate.swift

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,11 @@ extension String {
6565
@usableFromInline
6666
internal static func _fromUTF8Repairing(
6767
_ input: UnsafeBufferPointer<UInt8>
68-
) -> (String, Bool) {
68+
) -> (result: String, repairsMade: Bool) {
69+
if _allASCII(input) {
70+
return (String._uncheckedFromUTF8(input, asciiPreScanResult: true), false)
71+
}
72+
6973
// TODO(UTF8 perf): More efficient validation
7074

7175
// TODO(UTF8 perf): Skip intermediary array
@@ -95,6 +99,21 @@ extension String {
9599
return storage.asString
96100
}
97101

102+
// If we've already pre-scanned for ASCII, just supply the result
103+
@usableFromInline
104+
internal static func _uncheckedFromUTF8(
105+
_ input: UnsafeBufferPointer<UInt8>, asciiPreScanResult: Bool
106+
) -> String {
107+
if let smol = _SmallString(input) {
108+
return String(_StringGuts(smol))
109+
}
110+
111+
let isASCII = asciiPreScanResult
112+
let storage = _StringStorage.create(
113+
initializingFrom: input, isASCII: isASCII)
114+
return storage.asString
115+
}
116+
98117
@usableFromInline
99118
internal static func _uncheckedFromUTF16(
100119
_ input: UnsafeBufferPointer<UInt16>

0 commit comments

Comments
 (0)