From 4abcbff45918b31efd0f83a375cfe89a09cc3289 Mon Sep 17 00:00:00 2001 From: Philippe Hausler Date: Tue, 7 Mar 2023 18:08:22 -0800 Subject: [PATCH] Update the SPI entries for SwiftUI for direct tracking access --- .../Observation/ObservationRegistrar.swift | 4 ++-- .../Observation/ObservationTracking.swift | 19 +++++++++++-------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/stdlib/public/Observation/Sources/Observation/ObservationRegistrar.swift b/stdlib/public/Observation/Sources/Observation/ObservationRegistrar.swift index dc6b1667363db..ddee1eab3ce74 100644 --- a/stdlib/public/Observation/Sources/Observation/ObservationRegistrar.swift +++ b/stdlib/public/Observation/Sources/Observation/ObservationRegistrar.swift @@ -80,9 +80,9 @@ extension ObservationRegistrar { keyPath: KeyPath ) { if let trackingPtr = _ThreadLocal.value? - .assumingMemoryBound(to: ObservationTracking.AccessList?.self) { + .assumingMemoryBound(to: ObservationTracking._AccessList?.self) { if trackingPtr.pointee == nil { - trackingPtr.pointee = ObservationTracking.AccessList() + trackingPtr.pointee = ObservationTracking._AccessList() } trackingPtr.pointee?.addAccess(keyPath: keyPath, context: context) } diff --git a/stdlib/public/Observation/Sources/Observation/ObservationTracking.swift b/stdlib/public/Observation/Sources/Observation/ObservationTracking.swift index ea7bf12d0ee51..29b01981c84ea 100644 --- a/stdlib/public/Observation/Sources/Observation/ObservationTracking.swift +++ b/stdlib/public/Observation/Sources/Observation/ObservationTracking.swift @@ -38,10 +38,13 @@ public struct ObservationTracking { } } - struct AccessList { - var entries = [ObjectIdentifier : Entry]() + @_spi(SwiftUI) + public struct _AccessList: Sendable { + internal var entries = [ObjectIdentifier : Entry]() + + internal init() { } - mutating func addAccess( + internal mutating func addAccess( keyPath: PartialKeyPath, context: ObservationRegistrar.Context ) { @@ -53,13 +56,13 @@ public struct ObservationTracking { _ apply: () -> T, onChange: @autoclosure () -> @Sendable () -> Void ) -> T { - var accessList: AccessList? - let result = withUnsafeMutablePointer(to: &accessList) { ptr in + var _AccessList: _AccessList? + let result = withUnsafeMutablePointer(to: &_AccessList) { ptr in _ThreadLocal.value = UnsafeMutableRawPointer(ptr) defer { _ThreadLocal.value = nil } return apply() } - if let list = accessList { + if let list = _AccessList { let state = _ManagedCriticalState([ObjectIdentifier: Int]()) let onChange = onChange() let values = list.entries.mapValues { $0.addObserver { @@ -74,11 +77,11 @@ public struct ObservationTracking { return result } + @_spi(SwiftUI) public static func _installTracking( - _ storage: UnsafeRawPointer, + _ list: _AccessList, onChange: @escaping @Sendable () -> Void ) { - let list = unsafeBitCast(storage, to: AccessList.self) let state = _ManagedCriticalState([ObjectIdentifier: Int]()) let values = list.entries.mapValues { $0.addObserver { onChange()