From cdde9015b4b3b67f5db9e081fd4ee2222db78e0f Mon Sep 17 00:00:00 2001 From: Kyle Date: Fri, 3 Oct 2025 18:08:53 +0800 Subject: [PATCH 1/9] Implement traceMountedProperties --- .../DynamicProperty/DynamicProperty.swift | 2 +- .../DynamicPropertyBuffer.swift | 41 +++++++++++++++++-- 2 files changed, 39 insertions(+), 4 deletions(-) diff --git a/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicProperty.swift b/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicProperty.swift index d2b83a8d0..08c82f6ae 100644 --- a/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicProperty.swift +++ b/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicProperty.swift @@ -183,7 +183,7 @@ package struct DynamicPropertyCache { } struct Field { - var type: DynamicProperty.Type + var type: any DynamicProperty.Type var offset: Int var name: UnsafePointer? } diff --git a/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicPropertyBuffer.swift b/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicPropertyBuffer.swift index 0fb75b742..e5fec5691 100644 --- a/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicPropertyBuffer.swift +++ b/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicPropertyBuffer.swift @@ -92,7 +92,16 @@ public struct _DynamicPropertyBuffer { } package func destroy() { - // TODO: trace + if Signpost.linkCreate.isEnabled { + for element in contents { + Signpost.linkDestroy.traceEvent( + type: .event, + object: nil, + "Detached: [ %p ]", + [UInt(bitPattern: element.address)] + ) + } + } contents.destroy() } @@ -107,8 +116,34 @@ public struct _DynamicPropertyBuffer { to graphValue: _GraphValue, fields: DynamicPropertyCache.Fields ) { - // TODO: trace - _openSwiftUIUnimplementedWarning() + if Signpost.linkCreate.isEnabled { + let type = String(describing: T.self) + let typeLibrary = Tracing.libraryName(defining: T.self) + let identifier = graphValue.value.identifier.rawValue + let identity = graphValue.value.graph.graphIdentity() + if case let .product(fieldsArray) = fields.layout { + for (index, element) in contents.enumerated() { + guard index != fieldsArray.count else { + return + } + let field = fieldsArray[index] + Signpost.linkCreate.traceEvent( + type: .event, + object: nil, + "Attached: %{public}@ [ %p ] to %{public}@ (in %{public}@) at offset +%d [%d] (%p)", + [ + "\(field.type)", // %{public}@ + UInt(bitPattern: element.address), // %p + type, // %{public}@ + typeLibrary, // %{public}@ + field.offset, // %d + identifier, // %d + identity // %p + ] + ) + } + } + } } package func update(container: UnsafeMutableRawPointer, phase: ViewPhase) -> Bool { From b437a9da6d6ca41a087b54ba68a195755a5a1f22 Mon Sep 17 00:00:00 2001 From: Kyle Date: Fri, 3 Oct 2025 18:39:30 +0800 Subject: [PATCH 2/9] Update linkValueDescription --- .../Data/Binding/Binding.swift | 4 +- .../DynamicPropertyBuffer.swift | 17 ++++++- Sources/OpenSwiftUICore/Tracing/Tracing.swift | 38 ++++++++++++++ .../Util/DescriptiveDynamicProperty.swift | 50 ------------------- 4 files changed, 56 insertions(+), 53 deletions(-) delete mode 100644 Sources/OpenSwiftUICore/Util/DescriptiveDynamicProperty.swift diff --git a/Sources/OpenSwiftUICore/Data/Binding/Binding.swift b/Sources/OpenSwiftUICore/Data/Binding/Binding.swift index c6d7a0bbc..f98d32755 100644 --- a/Sources/OpenSwiftUICore/Data/Binding/Binding.swift +++ b/Sources/OpenSwiftUICore/Data/Binding/Binding.swift @@ -65,8 +65,10 @@ public struct Binding { /// The transaction captures the information needed to update the view when /// the binding value changes. public var transaction: Transaction + package var location: AnyLocation - private var _value: Value + + var _value: Value /// Creates a binding with closures that read and write the binding value. /// diff --git a/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicPropertyBuffer.swift b/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicPropertyBuffer.swift index e5fec5691..26878216a 100644 --- a/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicPropertyBuffer.swift +++ b/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicPropertyBuffer.swift @@ -425,7 +425,10 @@ public struct _DynamicPropertyBuffer { return allocatedBuffer.advanced(by: oldBuffer.distance(to: ptr)) } - package func traceMountedProperties(to value: _GraphValue, fields: DynamicPropertyCache.Fields) { + package func traceMountedProperties( + to value: _GraphValue, + fields: DynamicPropertyCache.Fields + ) { // TODO: Signpost related _openSwiftUIUnimplementedWarning() } @@ -578,7 +581,17 @@ private class BoxVTable: BoxVTableBase { let propertyPointer = property.assumingMemoryBound(to: Box.Property.self) let changed = boxPointer.pointee.update(property: &propertyPointer.pointee, phase: phase) if changed { - // TODO: OSSignpost + let property = propertyPointer.pointee + Signpost.linkUpdate.traceEvent( + type: .event, + object: nil, + "Updated: %{public}@ [ %p ] - %@", + [ + String(describing: type(of: property)), // %{public}@ + UInt(bitPattern: elt.address), // %p + property.linkValueDescription, // %@ + ] + ) } return changed } diff --git a/Sources/OpenSwiftUICore/Tracing/Tracing.swift b/Sources/OpenSwiftUICore/Tracing/Tracing.swift index cff612ff4..358292749 100644 --- a/Sources/OpenSwiftUICore/Tracing/Tracing.swift +++ b/Sources/OpenSwiftUICore/Tracing/Tracing.swift @@ -115,3 +115,41 @@ extension ViewGraph { graph.graphIdentity() } } + +// MARK: - DescriptiveDynamicProperty [6.5.4] + +package protocol DescriptiveDynamicProperty { + var _linkValue: Any { get } +} + +extension DescriptiveDynamicProperty { + fileprivate var linkValueDescription: String { + if let descriptiveDynamicProperty = _linkValue as? DescriptiveDynamicProperty { + descriptiveDynamicProperty.linkValueDescription + } else { + String(describing: _linkValue) + } + } +} + +extension DynamicProperty { + fileprivate var linkValueDescription: String { + if let descriptiveDynamicProperty = self as? DescriptiveDynamicProperty { + descriptiveDynamicProperty.linkValueDescription + } else { + String(describing: self) + } + } +} + +extension State: DescriptiveDynamicProperty { + package var _linkValue: Any { _value } +} + +extension Environment: DescriptiveDynamicProperty { + package var _linkValue: Any { wrappedValue } +} + +extension Binding: DescriptiveDynamicProperty { + package var _linkValue: Any { _value } +} diff --git a/Sources/OpenSwiftUICore/Util/DescriptiveDynamicProperty.swift b/Sources/OpenSwiftUICore/Util/DescriptiveDynamicProperty.swift deleted file mode 100644 index 51a296ef2..000000000 --- a/Sources/OpenSwiftUICore/Util/DescriptiveDynamicProperty.swift +++ /dev/null @@ -1,50 +0,0 @@ -// -// DescriptiveDynamicProperty.swift -// OpenSwiftUI -// -// Created by Kyle on 2024/9/22. -// - -// MARK: - DescriptiveDynamicProperty - -private protocol DescriptiveDynamicProperty { - var _linkValue: Any { get } -} - -extension DescriptiveDynamicProperty { - var linkValueDescription: String { - if let descriptiveDynamicProperty = _linkValue as? DescriptiveDynamicProperty { - descriptiveDynamicProperty.linkValueDescription - } else { - String(describing: _linkValue) - } - } -} - -extension DynamicProperty { - fileprivate var linkValueDescription: String { - if let descriptiveDynamicProperty = self as? DescriptiveDynamicProperty { - descriptiveDynamicProperty.linkValueDescription - } else { - String(describing: self) - } - } -} - -extension State: DescriptiveDynamicProperty { - fileprivate var _linkValue: Any { - projectedValue.wrappedValue - } -} - -extension Binding: DescriptiveDynamicProperty { - fileprivate var _linkValue: Any { - wrappedValue - } -} - -extension Environment: DescriptiveDynamicProperty { - fileprivate var _linkValue: Any { - wrappedValue - } -} From a4fbb9247eca02b6faeb2420bdd18d0d1d1410af Mon Sep 17 00:00:00 2001 From: Kyle Date: Fri, 3 Oct 2025 18:48:34 +0800 Subject: [PATCH 3/9] Update Tracing.swift --- .../DynamicPropertyBuffer.swift | 40 ++++----------- Sources/OpenSwiftUICore/Tracing/Tracing.swift | 51 +++++++++++++++++++ 2 files changed, 60 insertions(+), 31 deletions(-) diff --git a/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicPropertyBuffer.swift b/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicPropertyBuffer.swift index 26878216a..89c0ffcf4 100644 --- a/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicPropertyBuffer.swift +++ b/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicPropertyBuffer.swift @@ -94,12 +94,7 @@ public struct _DynamicPropertyBuffer { package func destroy() { if Signpost.linkCreate.isEnabled { for element in contents { - Signpost.linkDestroy.traceEvent( - type: .event, - object: nil, - "Detached: [ %p ]", - [UInt(bitPattern: element.address)] - ) + traceLinkDestroy(address: element.address) } } contents.destroy() @@ -126,20 +121,13 @@ public struct _DynamicPropertyBuffer { guard index != fieldsArray.count else { return } - let field = fieldsArray[index] - Signpost.linkCreate.traceEvent( - type: .event, - object: nil, - "Attached: %{public}@ [ %p ] to %{public}@ (in %{public}@) at offset +%d [%d] (%p)", - [ - "\(field.type)", // %{public}@ - UInt(bitPattern: element.address), // %p - type, // %{public}@ - typeLibrary, // %{public}@ - field.offset, // %d - identifier, // %d - identity // %p - ] + traceLinkCreate( + field: fieldsArray[index], + address: element.address, + type: type, + typeLibrary: typeLibrary, + identifier: identifier, + identity: identity ) } } @@ -581,17 +569,7 @@ private class BoxVTable: BoxVTableBase { let propertyPointer = property.assumingMemoryBound(to: Box.Property.self) let changed = boxPointer.pointee.update(property: &propertyPointer.pointee, phase: phase) if changed { - let property = propertyPointer.pointee - Signpost.linkUpdate.traceEvent( - type: .event, - object: nil, - "Updated: %{public}@ [ %p ] - %@", - [ - String(describing: type(of: property)), // %{public}@ - UInt(bitPattern: elt.address), // %p - property.linkValueDescription, // %@ - ] - ) + traceLinkUpdate(property: propertyPointer.pointee, address: elt.address) } return changed } diff --git a/Sources/OpenSwiftUICore/Tracing/Tracing.swift b/Sources/OpenSwiftUICore/Tracing/Tracing.swift index 358292749..04ccaaa5c 100644 --- a/Sources/OpenSwiftUICore/Tracing/Tracing.swift +++ b/Sources/OpenSwiftUICore/Tracing/Tracing.swift @@ -153,3 +153,54 @@ extension Environment: DescriptiveDynamicProperty { extension Binding: DescriptiveDynamicProperty { package var _linkValue: Any { _value } } + +// MARK: - Trace + Link [6.5.4] + +@inline(__always) +func traceLinkCreate( + field: DynamicPropertyCache.Field, + address: UnsafeRawPointer, + type: String, + typeLibrary: String, + identifier: UInt32, + identity: UInt +) { + Signpost.linkCreate.traceEvent( + type: .event, + object: nil, + "Attached: %{public}@ [ %p ] to %{public}@ (in %{public}@) at offset +%d [%d] (%p)", + [ + "\(field.type)", // %{public}@ + UInt(bitPattern: address), // %p + type, // %{public}@ + typeLibrary, // %{public}@ + field.offset, // %d + identifier, // %d + identity // %p + ] + ) +} + +@inline(__always) +func traceLinkUpdate(property: some DynamicProperty, address: UnsafeRawPointer) { + Signpost.linkUpdate.traceEvent( + type: .event, + object: nil, + "Updated: %{public}@ [ %p ] - %@", + [ + String(describing: type(of: property)), // %{public}@ + UInt(bitPattern: address), // %p + property.linkValueDescription, // %@ + ] + ) +} + +@inline(__always) +func traceLinkDestroy(address: UnsafeRawPointer) { + Signpost.linkDestroy.traceEvent( + type: .event, + object: nil, + "Detached: [ %p ]", + [UInt(bitPattern: address)] + ) +} From a9c7dd2dd54ae08f5ce3c2c6ae84f8a1708fd1e6 Mon Sep 17 00:00:00 2001 From: Kyle Date: Fri, 3 Oct 2025 19:01:17 +0800 Subject: [PATCH 4/9] Add tracing for legacy implementation --- .../DynamicPropertyBuffer.swift | 38 +++++++++++++++---- 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicPropertyBuffer.swift b/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicPropertyBuffer.swift index 89c0ffcf4..278b83996 100644 --- a/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicPropertyBuffer.swift +++ b/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicPropertyBuffer.swift @@ -3,7 +3,7 @@ // OpenSwiftUI // // Audited for 6.5.4 -// Status: Blocked by Tracing +// Status: Complete // ID: 68550FF604D39F05971FE35A26EE75B0 (SwiftUI) // ID: F3A89CF4357225EF49A7DD673FDFEE02 (SwiftUICore) @@ -300,8 +300,10 @@ public struct _DynamicPropertyBuffer { while count > 0 { let itemPointer = pointer.assumingMemoryBound(to: Item.self) let boxPointer = pointer.advanced(by: MemoryLayout.size) + if Signpost.linkDestroy.isEnabled { + traceLinkDestroy(address: boxPointer) + } itemPointer.pointee.vtable.deinitialize(ptr: boxPointer) - // TODO: OSSignpost pointer += Int(itemPointer.pointee.size) count &-= 1 } @@ -417,8 +419,30 @@ public struct _DynamicPropertyBuffer { to value: _GraphValue, fields: DynamicPropertyCache.Fields ) { - // TODO: Signpost related - _openSwiftUIUnimplementedWarning() + if Signpost.linkCreate.isEnabled { + let type = String(describing: Value.self) + let typeLibrary = Tracing.libraryName(defining: Value.self) + let identifier = value.value.identifier.rawValue + let identity = value.value.graph.graphIdentity() + if case let .product(fieldsArray) = fields.layout { + var index = 0 + var pointer = buf + while index < _count && index < fieldsArray.count { + let itemPointer = pointer.assumingMemoryBound(to: Item.self) + let boxPointer = pointer.advanced(by: MemoryLayout.size) + traceLinkCreate( + field: fieldsArray[index], + address: boxPointer, + type: type, + typeLibrary: typeLibrary, + identifier: identifier, + identity: identity + ) + pointer += Int(itemPointer.pointee.size) + index &+= 1 + } + } + } } package func applyChanged(to body: (Int) -> Void) { @@ -537,7 +561,7 @@ private class BoxVTableBase { #if OPENSWIFTUI_SUPPORT_2024_API -// MARK: - BoxVTable [6.5.4] [WIP] +// MARK: - BoxVTable [6.5.4] private class BoxVTable: BoxVTableBase { override class func moveInitialize( @@ -585,7 +609,7 @@ private class BoxVTable: BoxVTableBase { #else -// MARK: - BoxVTable [3.5.2] [WIP] +// MARK: - BoxVTable [3.5.2] private class BoxVTable: BoxVTableBase { override class func moveInitialize(ptr destination: UnsafeMutableRawPointer, from: UnsafeMutableRawPointer) { @@ -614,7 +638,7 @@ private class BoxVTable: BoxVTableBase { let propertyPointer = property.assumingMemoryBound(to: Box.Property.self) let changed = boxPointer.pointee.update(property: &propertyPointer.pointee, phase: phase) if changed { - // TODO: OSSignpost + traceLinkUpdate(property: propertyPointer.pointee, address: ptr) } return changed } From a1667964f3633ff6f0f8c84e806587b7444916ce Mon Sep 17 00:00:00 2001 From: Kyle Date: Fri, 3 Oct 2025 19:06:10 +0800 Subject: [PATCH 5/9] Fix warning --- .../Data/DynamicProperty/UnsafeHeterogeneousBufferTestsStub.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Sources/OpenSwiftUISymbolDualTestsSupport/Data/DynamicProperty/UnsafeHeterogeneousBufferTestsStub.c b/Sources/OpenSwiftUISymbolDualTestsSupport/Data/DynamicProperty/UnsafeHeterogeneousBufferTestsStub.c index 81d0fae34..e6d294420 100644 --- a/Sources/OpenSwiftUISymbolDualTestsSupport/Data/DynamicProperty/UnsafeHeterogeneousBufferTestsStub.c +++ b/Sources/OpenSwiftUISymbolDualTestsSupport/Data/DynamicProperty/UnsafeHeterogeneousBufferTestsStub.c @@ -14,7 +14,6 @@ DEFINE_SL_STUB_SLF(OpenSwiftUITestStub_UnsafeHeterogeneousBuffer_Init, SwiftUI, DEFINE_SL_STUB_SLF(OpenSwiftUITestStub_UnsafeHeterogeneousBuffer_Destroy, SwiftUI, $s7SwiftUI25UnsafeHeterogeneousBufferV7destroyyyF); DEFINE_SL_STUB_SLF(OpenSwiftUITestStub_UnsafeHeterogeneousBuffer_Append, SwiftUI, $s7SwiftUI25UnsafeHeterogeneousBufferV6append_6vtableAC5IndexVx_AA01_cdE7_VTableCmtlF); DEFINE_SL_STUB_SLF(OpenSwiftUITestStub_UnsafeHeterogeneousBuffer_IsEmpty, SwiftUI, $s7SwiftUI25UnsafeHeterogeneousBufferV7isEmptySbvg); -DEFINE_SL_STUB_SLF(OpenSwiftUITestStub_UnsafeHeterogeneousBuffer_IndexAtOffset, SwiftUI, $s7SwiftUI26UnsafeHeterogeneousBufferV7indexAtE5offsetySi_tF); DEFINE_SL_STUB_SLF(OpenSwiftUITestStub_UnsafeHeterogeneousBuffer_Subscript, SwiftUI, $s7SwiftUI25UnsafeHeterogeneousBufferVyAA01_cdE8_ElementVAC5IndexVcig); #endif From 118ca8016129486c36df7375177ce41f60a1376f Mon Sep 17 00:00:00 2001 From: Kyle Date: Fri, 3 Oct 2025 19:38:16 +0800 Subject: [PATCH 6/9] Fix signpost crash issue --- Sources/OpenSwiftUICore/Log/Signpost.swift | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Sources/OpenSwiftUICore/Log/Signpost.swift b/Sources/OpenSwiftUICore/Log/Signpost.swift index 697ff7e4a..4bf763210 100644 --- a/Sources/OpenSwiftUICore/Log/Signpost.swift +++ b/Sources/OpenSwiftUICore/Log/Signpost.swift @@ -251,6 +251,22 @@ extension OSSignpostID { } } } + +@inline(__always) +func os_signpost( + _ type: OSSignpostType, + dso: UnsafeRawPointer = #dsohandle, + log: OSLog, + name: StaticString, + signpostID: OSSignpostID = .exclusive, + _ format: StaticString, + _ arguments: [any CVarArg] +) { + unsafeBitCast( + os_signpost as (OSSignpostType, UnsafeRawPointer, OSLog, StaticString, OSSignpostID, StaticString, CVarArg...) -> Void, + to: ((OSSignpostType, UnsafeRawPointer, OSLog, StaticString, OSSignpostID, StaticString, [CVarArg]) -> Void).self + )(type, dso, log, name, signpostID, format, arguments) +} #endif #if canImport(Darwin) From 50df91412a3bc0d8a27e26c9d15a0b0e7948a6f7 Mon Sep 17 00:00:00 2001 From: Kyle Date: Fri, 3 Oct 2025 20:41:55 +0800 Subject: [PATCH 7/9] Add kdebug_interpose.c in Example --- Example/Example.xcodeproj/project.pbxproj | 22 +++++++++++++++- Example/SharedExample/kdebug_interpose.c | 31 +++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) create mode 100644 Example/SharedExample/kdebug_interpose.c diff --git a/Example/Example.xcodeproj/project.pbxproj b/Example/Example.xcodeproj/project.pbxproj index 1f086dfe0..e5483f05f 100644 --- a/Example/Example.xcodeproj/project.pbxproj +++ b/Example/Example.xcodeproj/project.pbxproj @@ -59,6 +59,13 @@ /* End PBXFileReference section */ /* Begin PBXFileSystemSynchronizedBuildFileExceptionSet section */ + 27240CFE2E8FFBC900E9DABD /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = { + isa = PBXFileSystemSynchronizedBuildFileExceptionSet; + membershipExceptions = ( + kdebug_interpose.c, + ); + target = 27CD0B482AFC8D37003665EB /* Example */; + }; 275751CC2DEE136C003E467C /* PBXFileSystemSynchronizedBuildFileExceptionSet */ = { isa = PBXFileSystemSynchronizedBuildFileExceptionSet; membershipExceptions = ( @@ -88,7 +95,7 @@ 275751F62DEE1456003E467C /* OpenSwiftUIUITests */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = OpenSwiftUIUITests; sourceTree = ""; }; 279FEC572DF450D200320390 /* ReferenceImages */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = ReferenceImages; sourceTree = ""; }; 27E6C4F62D2842D80010502F /* Configurations */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); name = Configurations; path = ../Configurations; sourceTree = ""; }; - 27FFF0422E08850C0060A4DA /* SharedExample */ = {isa = PBXFileSystemSynchronizedRootGroup; explicitFileTypes = {}; explicitFolders = (); path = SharedExample; sourceTree = ""; }; + 27FFF0422E08850C0060A4DA /* SharedExample */ = {isa = PBXFileSystemSynchronizedRootGroup; exceptions = (27240CFE2E8FFBC900E9DABD /* PBXFileSystemSynchronizedBuildFileExceptionSet */, ); explicitFileTypes = {}; explicitFolders = (); path = SharedExample; sourceTree = ""; }; /* End PBXFileSystemSynchronizedRootGroup section */ /* Begin PBXFrameworksBuildPhase section */ @@ -310,6 +317,7 @@ }; 27D49DF72BA604FB00F6E2E2 = { CreatedOnToolsVersion = 15.2; + LastSwiftMigration = 1640; }; }; }; @@ -508,6 +516,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; @@ -529,6 +538,8 @@ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 6.0; TARGETED_DEVICE_FAMILY = "1,2,7"; XROS_DEPLOYMENT_TARGET = 2.0; }; @@ -915,6 +926,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; @@ -936,6 +948,8 @@ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 6.0; TARGETED_DEVICE_FAMILY = "1,2,7"; XROS_DEPLOYMENT_TARGET = 2.0; }; @@ -1040,6 +1054,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; @@ -1061,6 +1076,8 @@ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 6.0; TARGETED_DEVICE_FAMILY = "1,2,7"; XROS_DEPLOYMENT_TARGET = 2.0; }; @@ -1255,6 +1272,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_MODULES = YES; CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = ""; GENERATE_INFOPLIST_FILE = YES; @@ -1276,6 +1294,8 @@ SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 6.0; TARGETED_DEVICE_FAMILY = "1,2,7"; XROS_DEPLOYMENT_TARGET = 2.0; }; diff --git a/Example/SharedExample/kdebug_interpose.c b/Example/SharedExample/kdebug_interpose.c new file mode 100644 index 000000000..01f514e0e --- /dev/null +++ b/Example/SharedExample/kdebug_interpose.c @@ -0,0 +1,31 @@ +// +// kdebug_interpose.c +// SharedExample +// +// Created by Kyle on 2025/10/3. +// + +// Interpose kdebug_is_enabled to always return true to perform Signpost testing with Instruments + +#include +#include +#include + +// Forward declare the original +extern bool kdebug_is_enabled(uint32_t debugid); + +// Our replacement +static bool my_kdebug_is_enabled(uint32_t debugid) { + return true; +} + +// Interpose using Mach-O section +typedef struct interpose_s { + const void *replacement; + const void *original; +} interpose_t; + +__attribute__((used)) static const interpose_t interposers[] + __attribute__((section("__DATA, __interpose"))) = { + { (const void *)my_kdebug_is_enabled, (const void *)kdebug_is_enabled }, +}; From 88d7ba096668049373a0e9f4f9a0064ad49584bc Mon Sep 17 00:00:00 2001 From: Kyle Date: Fri, 3 Oct 2025 21:10:55 +0800 Subject: [PATCH 8/9] Fix buffer.traceMountedProperties's graphValue --- .../Data/DynamicProperty/DynamicPropertyBuffer.swift | 2 +- Sources/OpenSwiftUICore/View/CustomView.swift | 7 ++++--- Sources/OpenSwiftUICore/View/Style/ViewStyle.swift | 10 ++-------- Sources/OpenSwiftUICore/View/VariadicView.swift | 6 +++--- 4 files changed, 10 insertions(+), 15 deletions(-) diff --git a/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicPropertyBuffer.swift b/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicPropertyBuffer.swift index 278b83996..e5a8b6898 100644 --- a/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicPropertyBuffer.swift +++ b/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicPropertyBuffer.swift @@ -1,6 +1,6 @@ // // DynamicPropertyBuffer.swift -// OpenSwiftUI +// OpenSwiftUICore // // Audited for 6.5.4 // Status: Complete diff --git a/Sources/OpenSwiftUICore/View/CustomView.swift b/Sources/OpenSwiftUICore/View/CustomView.swift index 7ee20a4bf..92a57b6ed 100644 --- a/Sources/OpenSwiftUICore/View/CustomView.swift +++ b/Sources/OpenSwiftUICore/View/CustomView.swift @@ -30,9 +30,10 @@ extension View { var inputs = inputs let (body, buffer) = makeBody(view: view, inputs: &inputs.base, fields: fields) if let buffer { - buffer.traceMountedProperties(to: body, fields: fields) + buffer.traceMountedProperties(to: view, fields: fields) } - return Body.makeDebuggableView(view: body, inputs: inputs) + let outputs = Body.makeDebuggableView(view: body, inputs: inputs) + return outputs } nonisolated package static func makeViewList(view: _GraphValue, inputs: _ViewListInputs) -> _ViewListOutputs { @@ -41,7 +42,7 @@ extension View { let (body, buffer) = makeBody(view: view, inputs: &inputs.base, fields: fields) let outputs = Body.makeDebuggableViewList(view: body, inputs: inputs) if let buffer { - buffer.traceMountedProperties(to: body, fields: fields) + buffer.traceMountedProperties(to: view, fields: fields) } return outputs } diff --git a/Sources/OpenSwiftUICore/View/Style/ViewStyle.swift b/Sources/OpenSwiftUICore/View/Style/ViewStyle.swift index 6cf0f9c19..d4ccfafb7 100644 --- a/Sources/OpenSwiftUICore/View/Style/ViewStyle.swift +++ b/Sources/OpenSwiftUICore/View/Style/ViewStyle.swift @@ -266,10 +266,7 @@ private struct StyleModifierType: AnyStyleModifierType where M: StyleModifier inputs: inputs ) if let buffer { - buffer.traceMountedProperties( - to: view, - fields: fields - ) + buffer.traceMountedProperties(to: view, fields: fields) } return outputs } @@ -316,10 +313,7 @@ private struct StyleModifierType: AnyStyleModifierType where M: StyleModifier inputs: inputs ) if let buffer { - buffer.traceMountedProperties( - to: view, - fields: fields - ) + buffer.traceMountedProperties(to: view, fields: fields) } return outputs } diff --git a/Sources/OpenSwiftUICore/View/VariadicView.swift b/Sources/OpenSwiftUICore/View/VariadicView.swift index fdb711e7a..b3aeaa61f 100644 --- a/Sources/OpenSwiftUICore/View/VariadicView.swift +++ b/Sources/OpenSwiftUICore/View/VariadicView.swift @@ -245,7 +245,7 @@ extension _VariadicView.MultiViewRoot { let implicitRootBodyInputs = inputs.implicitRootBodyInputs let outputs = Body.makeDebuggableViewList(view: body, inputs: implicitRootBodyInputs) if let buffer { - buffer.traceMountedProperties(to: body, fields: fields) + buffer.traceMountedProperties(to: root, fields: fields) } return outputs } @@ -320,7 +320,7 @@ extension _VariadicView.ViewRoot { let (body, buffer) = makeBody(root: root, list: list, inputs: &inputs.base, fields: fields) let outputs = Body.makeDebuggableView(view: body, inputs: inputs) if let buffer { - buffer.traceMountedProperties(to: body, fields: fields) + buffer.traceMountedProperties(to: root, fields: fields) } return outputs } @@ -337,7 +337,7 @@ extension _VariadicView.ViewRoot { let (body, buffer) = makeBody(root: root, list: list, inputs: &inputs.base, fields: fields) let outputs = Body.makeDebuggableViewList(view: body, inputs: inputs) if let buffer { - buffer.traceMountedProperties(to: body, fields: fields) + buffer.traceMountedProperties(to: root, fields: fields) } return outputs } From cc5fe78e1b0267cba3cfa5984983a3535b856d85 Mon Sep 17 00:00:00 2001 From: Kyle Date: Fri, 3 Oct 2025 21:24:04 +0800 Subject: [PATCH 9/9] Fix non-Darwin build issue --- Sources/OpenSwiftUICore/Log/Signpost.swift | 23 +++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/Sources/OpenSwiftUICore/Log/Signpost.swift b/Sources/OpenSwiftUICore/Log/Signpost.swift index 4bf763210..f7a58ff57 100644 --- a/Sources/OpenSwiftUICore/Log/Signpost.swift +++ b/Sources/OpenSwiftUICore/Log/Signpost.swift @@ -11,6 +11,24 @@ import OpenSwiftUI_SPI import OpenAttributeGraphShims #if canImport(os) package import os.signpost +#else +public struct OSSignpostType: Hashable, Equatable, RawRepresentable { + public init(_ rawValue: UInt8) { + self.rawValue = rawValue + } + + public init(rawValue: UInt8) { + self.rawValue = rawValue + } + + public var rawValue: UInt8 +} + +extension OSSignpostType { + public static let event: OSSignpostType = .init(0) + public static let begin: OSSignpostType = .init(1) + public static let end: OSSignpostType = .init(2) +} #endif extension Signpost { @@ -179,7 +197,6 @@ package struct Signpost { #endif } - #if canImport(Darwin) @_transparent package func traceEvent( type: OSSignpostType, @@ -190,6 +207,7 @@ package struct Signpost { guard isEnabled else { return } + #if canImport(Darwin) let id = OSSignpostID.makeExclusiveID(object) let args = args() switch style { @@ -198,12 +216,11 @@ package struct Signpost { case let .os_log(name): os_signpost(type, log: _signpostLog, name: name, signpostID: id, message, args) } + #endif } - #endif #if canImport(Darwin) - @inline(__always) private var styleCode: UInt8 { switch style {