Skip to content

Commit 45fd8ec

Browse files
authored
Merge pull request #691 from glessard/pointer-conversion-restriction
[nfc] Avoid pointer conversions
2 parents 185ebd6 + bc70423 commit 45fd8ec

File tree

2 files changed

+18
-7
lines changed

2 files changed

+18
-7
lines changed

Sources/_StringProcessing/Regex/Core.swift

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,13 @@ extension Regex {
126126
/// A program representation that caches any lowered representation for
127127
/// execution.
128128
internal final class Program {
129+
130+
// This stored property should be stored at offset zero. We perform atomic
131+
// operations on it.
132+
//
133+
/// Do not access this property directly - all accesses must go through `_loweredProgramStoragePtr `.
134+
fileprivate var _loweredProgramStorage: AnyObject? = nil
135+
129136
/// The underlying IR.
130137
///
131138
/// FIXME: If Regex is the unit of composition, then it should be a Node instead,
@@ -141,14 +148,16 @@ extension Regex {
141148
init(_ value: MEProgram) { self.value = value }
142149
}
143150

144-
/// Do not use directly - all accesses must go through `loweredProgram`.
145-
fileprivate var _loweredProgramStorage: AnyObject? = nil
146-
151+
fileprivate var _loweredProgramStoragePtr: UnsafeMutablePointer<AnyObject?> {
152+
_getUnsafePointerToStoredProperties(self)
153+
.assumingMemoryBound(to: Optional<AnyObject>.self)
154+
}
155+
147156
/// The program for execution with the matching engine.
148157
var loweredProgram: MEProgram {
149158
/// Atomically loads the compiled program if it has already been stored.
150159
func loadProgram() -> MEProgram? {
151-
guard let loweredObject = _stdlib_atomicLoadARCRef(object: &_loweredProgramStorage)
160+
guard let loweredObject = _stdlib_atomicLoadARCRef(object: _loweredProgramStoragePtr)
152161
else { return nil }
153162
return unsafeDowncast(loweredObject, to: ProgramBox.self).value
154163
}
@@ -161,7 +170,7 @@ extension Regex {
161170
// Compile the DSLTree into a lowered program and store it atomically.
162171
let compiledProgram = try! Compiler(tree: tree, compileOptions: compileOptions).emit()
163172
let storedNewProgram = _stdlib_atomicInitializeARCRef(
164-
object: &_loweredProgramStorage,
173+
object: _loweredProgramStoragePtr,
165174
desired: ProgramBox(compiledProgram))
166175

167176
// Return the winner of the storage race. We're guaranteed at this point

Sources/_StringProcessing/Unicode/ScalarProps.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,10 @@ extension Unicode.Script {
2929

3030
static func extensions(for scalar: Unicode.Scalar) -> [Unicode.Script] {
3131
var count: UInt8 = 0
32-
let pointer = _swift_string_processing_getScriptExtensions(scalar.value, &count)
33-
32+
let pointer = withUnsafeMutablePointer(to: &count) {
33+
_swift_string_processing_getScriptExtensions(scalar.value, $0)
34+
}
35+
3436
guard let pointer = pointer else {
3537
return [Unicode.Script(scalar)]
3638
}

0 commit comments

Comments
 (0)