File tree Expand file tree Collapse file tree 1 file changed +22
-5
lines changed
Sources/_StringProcessing/Regex Expand file tree Collapse file tree 1 file changed +22
-5
lines changed Original file line number Diff line number Diff line change @@ -95,12 +95,29 @@ extension Regex {
9595
9696 /// The program for execution with the matching engine.
9797 var loweredProgram : MEProgram {
98- if let loweredObject = _loweredProgramStorage as? ProgramBox {
99- return loweredObject. value
98+ /// Atomically loads the compiled program if it has already been stored.
99+ func loadProgram( ) -> MEProgram ? {
100+ guard let loweredObject = _stdlib_atomicLoadARCRef ( object: & _loweredProgramStorage)
101+ else { return nil }
102+ return unsafeDowncast ( loweredObject, to: ProgramBox . self) . value
100103 }
101- let lowered = try ! Compiler ( tree: tree, compileOptions: compileOptions) . emit ( )
102- _stdlib_atomicInitializeARCRef ( object: & _loweredProgramStorage, desired: ProgramBox ( lowered) )
103- return lowered
104+
105+ // Use the previously compiled program, if available.
106+ if let program = loadProgram ( ) {
107+ return program
108+ }
109+
110+ // Compile the DSLTree into a lowered program and store it atomically.
111+ let compiledProgram = try ! Compiler ( tree: tree, compileOptions: compileOptions) . emit ( )
112+ let storedNewProgram = _stdlib_atomicInitializeARCRef (
113+ object: & _loweredProgramStorage,
114+ desired: ProgramBox ( compiledProgram) )
115+
116+ // Return the winner of the storage race. We're guaranteed at this point
117+ // to have compiled program stored in `_loweredProgramStorage`.
118+ return storedNewProgram
119+ ? compiledProgram
120+ : loadProgram ( ) !
104121 }
105122
106123 init ( ast: AST ) {
You can’t perform that action at this time.
0 commit comments