Skip to content

Commit 95dc229

Browse files
committed
[stdlib] Fix age property and update case mappings
Using &foo.0 is not a suitable shortcut for getting a mutable pointer to the first element of a tuple.
1 parent f06af77 commit 95dc229

File tree

1 file changed

+37
-28
lines changed

1 file changed

+37
-28
lines changed

stdlib/public/core/UnicodeScalarProperties.swift

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -115,20 +115,23 @@ extension Unicode.Scalar {
115115
var utf16 = _utf16CodeUnits
116116
var scratchBuffer = _Normalization._SegmentOutputBuffer(allZeros: ())
117117
let count = scratchBuffer.withUnsafeMutableBufferPointer { bufPtr -> Int in
118-
return withUnsafePointer(to: &utf16.0) { utf16Pointer in
119-
var err = __swift_stdlib_U_ZERO_ERROR
120-
let correctSize = u_strTo(
121-
bufPtr.baseAddress._unsafelyUnwrappedUnchecked,
122-
Int32(bufPtr.count),
123-
utf16Pointer,
124-
Int32(utf16Length),
125-
"",
126-
&err)
127-
guard err.isSuccess ||
128-
err == __swift_stdlib_U_BUFFER_OVERFLOW_ERROR else {
129-
fatalError("Unexpected error case-converting Unicode scalar.")
118+
return withUnsafePointer(to: &utf16) { tuplePtr in
119+
return tuplePtr.withMemoryRebound(to: UInt16.self, capacity: 2) {
120+
utf16Pointer in
121+
var err = __swift_stdlib_U_ZERO_ERROR
122+
let correctSize = u_strTo(
123+
bufPtr.baseAddress._unsafelyUnwrappedUnchecked,
124+
Int32(bufPtr.count),
125+
utf16Pointer,
126+
Int32(utf16Length),
127+
"",
128+
&err)
129+
guard err.isSuccess ||
130+
err == __swift_stdlib_U_BUFFER_OVERFLOW_ERROR else {
131+
fatalError("Unexpected error case-converting Unicode scalar.")
132+
}
133+
return Int(correctSize)
130134
}
131-
return Int(correctSize)
132135
}
133136
}
134137
if _fastPath(count <= scratchBuffer.count) {
@@ -137,19 +140,22 @@ extension Unicode.Scalar {
137140
}
138141
var array = Array<UInt16>(repeating: 0, count: count)
139142
array.withUnsafeMutableBufferPointer { bufPtr in
140-
withUnsafePointer(to: &utf16.0) { utf16Pointer in
141-
var err = __swift_stdlib_U_ZERO_ERROR
142-
let correctSize = u_strTo(
143-
bufPtr.baseAddress._unsafelyUnwrappedUnchecked,
144-
Int32(bufPtr.count),
145-
utf16Pointer,
146-
Int32(utf16Length),
147-
"",
148-
&err)
149-
guard err.isSuccess else {
150-
fatalError("Unexpected error case-converting Unicode scalar.")
143+
withUnsafePointer(to: &utf16) { tuplePtr in
144+
tuplePtr.withMemoryRebound(to: UInt16.self, capacity: 2) {
145+
utf16Pointer in
146+
var err = __swift_stdlib_U_ZERO_ERROR
147+
let correctSize = u_strTo(
148+
bufPtr.baseAddress._unsafelyUnwrappedUnchecked,
149+
Int32(bufPtr.count),
150+
utf16Pointer,
151+
Int32(utf16Length),
152+
"",
153+
&err)
154+
guard err.isSuccess else {
155+
fatalError("Unexpected error case-converting Unicode scalar.")
156+
}
157+
_sanityCheck(count == correctSize, "inconsistent ICU behavior")
151158
}
152-
_sanityCheck(count == correctSize, "inconsistent ICU behavior")
153159
}
154160
}
155161
return String._fromWellFormedUTF16CodeUnits(array[..<count])
@@ -796,11 +802,14 @@ extension Unicode.Scalar.Properties {
796802
/// [Unicode Standard](http://www.unicode.org/versions/latest/).
797803
public var age: Unicode.Version? {
798804
var versionInfo: __swift_stdlib_UVersionInfo = (0, 0, 0, 0)
799-
withUnsafeMutablePointer(to: &versionInfo.0) { versionInfoPointer in
800-
__swift_stdlib_u_charAge(_value, versionInfoPointer)
805+
withUnsafeMutablePointer(to: &versionInfo) { tuplePtr in
806+
tuplePtr.withMemoryRebound(to: UInt8.self, capacity: 4) {
807+
versionInfoPtr in
808+
__swift_stdlib_u_charAge(_value, versionInfoPtr)
809+
}
801810
}
802811
guard versionInfo.0 != 0 else { return nil }
803-
return (major: Int(versionInfo.0), Int(versionInfo.1))
812+
return (major: Int(versionInfo.0), minor: Int(versionInfo.1))
804813
}
805814
}
806815

0 commit comments

Comments
 (0)