Skip to content

Commit d45027b

Browse files
committed
adopt the stdlib’s pattern for atomic lazy references
- avoids reliance on a pointer conversion
1 parent 185ebd6 commit d45027b

File tree

1 file changed

+14
-5
lines changed

1 file changed

+14
-5
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 `loweredProgram`.
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

0 commit comments

Comments
 (0)