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 }, +}; 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/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..e5a8b6898 100644 --- a/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicPropertyBuffer.swift +++ b/Sources/OpenSwiftUICore/Data/DynamicProperty/DynamicPropertyBuffer.swift @@ -1,9 +1,9 @@ // // DynamicPropertyBuffer.swift -// OpenSwiftUI +// OpenSwiftUICore // // Audited for 6.5.4 -// Status: Blocked by Tracing +// Status: Complete // ID: 68550FF604D39F05971FE35A26EE75B0 (SwiftUI) // ID: F3A89CF4357225EF49A7DD673FDFEE02 (SwiftUICore) @@ -92,7 +92,11 @@ public struct _DynamicPropertyBuffer { } package func destroy() { - // TODO: trace + if Signpost.linkCreate.isEnabled { + for element in contents { + traceLinkDestroy(address: element.address) + } + } contents.destroy() } @@ -107,8 +111,27 @@ 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 + } + traceLinkCreate( + field: fieldsArray[index], + address: element.address, + type: type, + typeLibrary: typeLibrary, + identifier: identifier, + identity: identity + ) + } + } + } } package func update(container: UnsafeMutableRawPointer, phase: ViewPhase) -> Bool { @@ -277,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 } @@ -390,9 +415,34 @@ public struct _DynamicPropertyBuffer { return allocatedBuffer.advanced(by: oldBuffer.distance(to: ptr)) } - package func traceMountedProperties(to value: _GraphValue, fields: DynamicPropertyCache.Fields) { - // TODO: Signpost related - _openSwiftUIUnimplementedWarning() + package func traceMountedProperties( + to value: _GraphValue, + fields: DynamicPropertyCache.Fields + ) { + 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) { @@ -511,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( @@ -543,7 +593,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: elt.address) } return changed } @@ -559,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) { @@ -588,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 } diff --git a/Sources/OpenSwiftUICore/Log/Signpost.swift b/Sources/OpenSwiftUICore/Log/Signpost.swift index 697ff7e4a..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 { @@ -251,6 +268,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) diff --git a/Sources/OpenSwiftUICore/Tracing/Tracing.swift b/Sources/OpenSwiftUICore/Tracing/Tracing.swift index cff612ff4..04ccaaa5c 100644 --- a/Sources/OpenSwiftUICore/Tracing/Tracing.swift +++ b/Sources/OpenSwiftUICore/Tracing/Tracing.swift @@ -115,3 +115,92 @@ 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 } +} + +// 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)] + ) +} 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 - } -} 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 } 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