diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 486bcd46..6778c1cb 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -142,7 +142,7 @@ jobs: run: | toolchain_path="/opt/swiftwasm" ./build-exec mkdir -p "$toolchain_path" - curl -v -L ${{ matrix.development-toolchain-download }} | ./build-exec tar xz --strip-component 1 -C "$toolchain_path" + curl -L ${{ matrix.development-toolchain-download }} | ./build-exec tar xz --strip-component 1 -C "$toolchain_path" echo "toolchain-path=$toolchain_path" >> $GITHUB_OUTPUT ./build-exec "$toolchain_path/usr/bin/swift" sdk install "${{ matrix.wasi-swift-sdk-download }}" --checksum "${{ matrix.wasi-swift-sdk-checksum }}" wasi_sdk_path=$(./build-exec "$toolchain_path/usr/bin/swift" sdk configure --show-configuration "${{ matrix.wasi-swift-sdk-id }}" wasm32-unknown-wasi | grep sdkRootPath: | cut -d: -f2) diff --git a/Package.swift b/Package.swift index 9e37db0a..cc6f66cf 100644 --- a/Package.swift +++ b/Package.swift @@ -4,12 +4,7 @@ import PackageDescription import class Foundation.ProcessInfo -let DarwinPlatforms: [Platform] -#if swift(<5.9) - DarwinPlatforms = [.macOS, .iOS, .watchOS, .tvOS] -#else - DarwinPlatforms = [.macOS, .iOS, .watchOS, .tvOS, .visionOS] -#endif +let DarwinPlatforms: [Platform] = [.macOS, .iOS, .watchOS, .tvOS, .visionOS] let package = Package( name: "WasmKit", @@ -120,8 +115,7 @@ let package = Package( .target(name: "WITExtractor"), .testTarget(name: "WITExtractorTests", dependencies: ["WITExtractor", "WIT"]), - ], - swiftLanguageVersions: [.v5] + ] ) if ProcessInfo.processInfo.environment["SWIFTCI_USE_LOCAL_DEPS"] == nil { diff --git a/Sources/WAT/Location.swift b/Sources/WAT/Location.swift index c6bc387d..91a51df7 100644 --- a/Sources/WAT/Location.swift +++ b/Sources/WAT/Location.swift @@ -1,5 +1,5 @@ /// A location in a WAT source file. -public struct Location: Equatable, CustomDebugStringConvertible { +public struct Location: Equatable, CustomDebugStringConvertible, Sendable { let index: Lexer.Index let source: String.UnicodeScalarView diff --git a/Sources/WAT/WAT.swift b/Sources/WAT/WAT.swift index 9d7c1650..974f3d3f 100644 --- a/Sources/WAT/WAT.swift +++ b/Sources/WAT/WAT.swift @@ -1,7 +1,7 @@ import WasmParser /// Options for encoding a WebAssembly module into a binary format. -public struct EncodeOptions { +public struct EncodeOptions: Sendable { /// Whether to include the name section. public var nameSection: Bool diff --git a/Sources/WIT/AST.swift b/Sources/WIT/AST.swift index 497e4c49..f1ee8685 100644 --- a/Sources/WIT/AST.swift +++ b/Sources/WIT/AST.swift @@ -33,13 +33,13 @@ struct Version: Equatable, Hashable, CustomStringConvertible { } } -public enum ASTItemSyntax: Equatable, Hashable { +public enum ASTItemSyntax: Equatable, Hashable, Sendable { case interface(SyntaxNode) case world(SyntaxNode) case use(SyntaxNode) } -public struct PackageNameSyntax: Equatable, Hashable, CustomStringConvertible { +public struct PackageNameSyntax: Equatable, Hashable, CustomStringConvertible, Sendable { public var namespace: Identifier public var name: Identifier var version: Version? @@ -81,7 +81,7 @@ public struct WorldSyntax: Equatable, Hashable, SyntaxNodeProtocol { public var items: [WorldItemSyntax] } -public enum WorldItemSyntax: Equatable, Hashable { +public enum WorldItemSyntax: Equatable, Hashable, Sendable { case `import`(ImportSyntax) case export(ExportSyntax) case use(SyntaxNode) @@ -89,19 +89,19 @@ public enum WorldItemSyntax: Equatable, Hashable { case include(IncludeSyntax) } -public struct ImportSyntax: Equatable, Hashable { +public struct ImportSyntax: Equatable, Hashable, Sendable { public var documents: DocumentsSyntax public var attributes: [AttributeSyntax] public var kind: ExternKindSyntax } -public struct ExportSyntax: Equatable, Hashable { +public struct ExportSyntax: Equatable, Hashable, Sendable { public var documents: DocumentsSyntax public var attributes: [AttributeSyntax] public var kind: ExternKindSyntax } -public enum ExternKindSyntax: Equatable, Hashable { +public enum ExternKindSyntax: Equatable, Hashable, Sendable { case interface(Identifier, [InterfaceItemSyntax]) case path(UsePathSyntax) case function(Identifier, FunctionSyntax) @@ -131,7 +131,7 @@ public struct TypeDefSyntax: Equatable, Hashable, SyntaxNodeProtocol { public var body: TypeDefBodySyntax } -public enum TypeDefBodySyntax: Equatable, Hashable { +public enum TypeDefBodySyntax: Equatable, Hashable, Sendable { case flags(FlagsSyntax) case resource(ResourceSyntax) case record(RecordSyntax) @@ -141,11 +141,11 @@ public enum TypeDefBodySyntax: Equatable, Hashable { case alias(TypeAliasSyntax) } -public struct TypeAliasSyntax: Equatable, Hashable { +public struct TypeAliasSyntax: Equatable, Hashable, Sendable { public let typeRepr: TypeReprSyntax } -public indirect enum TypeReprSyntax: Equatable, Hashable { +public indirect enum TypeReprSyntax: Equatable, Hashable, Sendable { case bool case u8 case u16 @@ -169,7 +169,7 @@ public indirect enum TypeReprSyntax: Equatable, Hashable { case stream(StreamSyntax) } -public enum HandleSyntax: Equatable, Hashable { +public enum HandleSyntax: Equatable, Hashable, Sendable { case own(resource: Identifier) case borrow(resource: Identifier) @@ -181,65 +181,65 @@ public enum HandleSyntax: Equatable, Hashable { } } -public struct ResourceSyntax: Equatable, Hashable { +public struct ResourceSyntax: Equatable, Hashable, Sendable { var functions: [ResourceFunctionSyntax] } -public enum ResourceFunctionSyntax: Equatable, Hashable { +public enum ResourceFunctionSyntax: Equatable, Hashable, Sendable { case method(SyntaxNode) case `static`(SyntaxNode) case constructor(SyntaxNode) } -public struct RecordSyntax: Equatable, Hashable { +public struct RecordSyntax: Equatable, Hashable, Sendable { public var fields: [FieldSyntax] } -public struct FieldSyntax: Equatable, Hashable { +public struct FieldSyntax: Equatable, Hashable, Sendable { public var documents: DocumentsSyntax public var name: Identifier public var type: TypeReprSyntax var textRange: TextRange } -public struct FlagsSyntax: Equatable, Hashable { +public struct FlagsSyntax: Equatable, Hashable, Sendable { public var flags: [FlagSyntax] } -public struct FlagSyntax: Equatable, Hashable { +public struct FlagSyntax: Equatable, Hashable, Sendable { public var documents: DocumentsSyntax public var name: Identifier } -public struct VariantSyntax: Equatable, Hashable { +public struct VariantSyntax: Equatable, Hashable, Sendable { public var cases: [CaseSyntax] var textRange: TextRange } -public struct CaseSyntax: Equatable, Hashable { +public struct CaseSyntax: Equatable, Hashable, Sendable { public var documents: DocumentsSyntax public var name: Identifier public var type: TypeReprSyntax? var textRange: TextRange } -public struct EnumSyntax: Equatable, Hashable { +public struct EnumSyntax: Equatable, Hashable, Sendable { public var cases: [EnumCaseSyntax] var textRange: TextRange } -public struct EnumCaseSyntax: Equatable, Hashable { +public struct EnumCaseSyntax: Equatable, Hashable, Sendable { public var documents: DocumentsSyntax public var name: Identifier var textRange: TextRange } -public struct ResultSyntax: Equatable, Hashable { +public struct ResultSyntax: Equatable, Hashable, Sendable { public let ok: TypeReprSyntax? public let error: TypeReprSyntax? } -public struct StreamSyntax: Equatable, Hashable { +public struct StreamSyntax: Equatable, Hashable, Sendable { var element: TypeReprSyntax? var end: TypeReprSyntax? } @@ -256,20 +256,20 @@ public struct UnionSyntax: Equatable, Hashable, SyntaxNodeProtocol { var textRange: TextRange } -public struct UnionCaseSyntax: Equatable, Hashable { +public struct UnionCaseSyntax: Equatable, Hashable, Sendable { public var documents: DocumentsSyntax public var type: TypeReprSyntax var textRange: TextRange } -public struct ParameterSyntax: Equatable, Hashable { +public struct ParameterSyntax: Equatable, Hashable, Sendable { public var name: Identifier public var type: TypeReprSyntax var textRange: TextRange } public typealias ParameterList = [ParameterSyntax] -public enum ResultListSyntax: Equatable, Hashable { +public enum ResultListSyntax: Equatable, Hashable, Sendable { case named(ParameterList) case anon(TypeReprSyntax) @@ -281,7 +281,7 @@ public enum ResultListSyntax: Equatable, Hashable { } } -public struct FunctionSyntax: Equatable, Hashable { +public struct FunctionSyntax: Equatable, Hashable, Sendable { public var parameters: ParameterList public var results: ResultListSyntax var textRange: TextRange @@ -293,7 +293,7 @@ public struct UseSyntax: Equatable, Hashable, SyntaxNodeProtocol { public var names: [UseNameSyntax] } -public enum UsePathSyntax: Equatable, Hashable { +public enum UsePathSyntax: Equatable, Hashable, Sendable { case id(Identifier) case package(id: PackageNameSyntax, name: Identifier) @@ -305,23 +305,23 @@ public enum UsePathSyntax: Equatable, Hashable { } } -public struct UseNameSyntax: Equatable, Hashable { +public struct UseNameSyntax: Equatable, Hashable, Sendable { public var name: Identifier public var asName: Identifier? } -public struct IncludeSyntax: Equatable, Hashable { +public struct IncludeSyntax: Equatable, Hashable, Sendable { var attributes: [AttributeSyntax] var from: UsePathSyntax var names: [IncludeNameSyntax] } -public struct IncludeNameSyntax: Equatable, Hashable { +public struct IncludeNameSyntax: Equatable, Hashable, Sendable { var name: Identifier var asName: Identifier } -public struct Identifier: Equatable, Hashable, CustomStringConvertible { +public struct Identifier: Equatable, Hashable, CustomStringConvertible, Sendable { public var text: String var textRange: TextRange @@ -330,28 +330,28 @@ public struct Identifier: Equatable, Hashable, CustomStringConvertible { } } -public struct DocumentsSyntax: Equatable, Hashable { +public struct DocumentsSyntax: Equatable, Hashable, Sendable { var comments: [String] } -public enum AttributeSyntax: Equatable, Hashable { +public enum AttributeSyntax: Equatable, Hashable, Sendable { case since(SinceAttributeSyntax) case unstable(UnstableAttributeSyntax) case deprecated(DeprecatedAttributeSyntax) } -public struct SinceAttributeSyntax: Equatable, Hashable { +public struct SinceAttributeSyntax: Equatable, Hashable, Sendable { let version: Version let feature: Identifier? let textRange: TextRange } -public struct UnstableAttributeSyntax: Equatable, Hashable { +public struct UnstableAttributeSyntax: Equatable, Hashable, Sendable { let textRange: TextRange let feature: Identifier } -public struct DeprecatedAttributeSyntax: Equatable, Hashable { +public struct DeprecatedAttributeSyntax: Equatable, Hashable, Sendable { let textRange: TextRange let version: Version } diff --git a/Sources/WIT/Diagnostics.swift b/Sources/WIT/Diagnostics.swift index 03aae5b5..e93af79e 100644 --- a/Sources/WIT/Diagnostics.swift +++ b/Sources/WIT/Diagnostics.swift @@ -6,7 +6,7 @@ struct DiagnosticError: Error { let diagnostic: Diagnostic } -public struct Diagnostic { +public struct Diagnostic: Sendable { public let message: String var textRange: TextRange? diff --git a/Sources/WIT/PackageResolver.swift b/Sources/WIT/PackageResolver.swift index f54f60cc..cfd1e29a 100644 --- a/Sources/WIT/PackageResolver.swift +++ b/Sources/WIT/PackageResolver.swift @@ -1,7 +1,7 @@ import Foundation /// A unit of WIT package managing a collection of WIT source files -public final class PackageUnit: Hashable, CustomStringConvertible { +public final class PackageUnit: Hashable, CustomStringConvertible, Sendable { public let packageName: PackageNameSyntax public let sourceFiles: [SyntaxNode] diff --git a/Sources/WIT/Semantics/RequestEvaluator.swift b/Sources/WIT/Semantics/RequestEvaluator.swift index ad27e9b6..5ddba2bc 100644 --- a/Sources/WIT/Semantics/RequestEvaluator.swift +++ b/Sources/WIT/Semantics/RequestEvaluator.swift @@ -35,7 +35,7 @@ internal class Evaluator { // Check cyclical request if activeRequestsSet.contains(requestAsHashable) { - throw CyclicalRequestError(activeRequests: activeRequests + [request]) + throw CyclicalRequestError(activeRequestDescriptions: activeRequests.map { "\($0)" } + ["\(request)"]) } // Push the given request as an active request @@ -64,11 +64,11 @@ internal class Evaluator { extension Evaluator { struct CyclicalRequestError: Error, CustomStringConvertible { - let activeRequests: [any EvaluationRequest] + let activeRequestDescriptions: [String] var description: String { var description = "==== Cycle detected! ====\n" - for (index, request) in activeRequests.enumerated() { + for (index, request) in activeRequestDescriptions.enumerated() { let indent = String(repeating: " ", count: index) description += "\(indent)\\- \(request)\n" } diff --git a/Sources/WIT/SyntaxNode.swift b/Sources/WIT/SyntaxNode.swift index f2593b11..01c8a923 100644 --- a/Sources/WIT/SyntaxNode.swift +++ b/Sources/WIT/SyntaxNode.swift @@ -1,10 +1,10 @@ /// An AST node that can be wrapped by ``SyntaxNode`` as a reference -public protocol SyntaxNodeProtocol {} +public protocol SyntaxNodeProtocol: Sendable {} /// An AST node with reference semantics to provide identity of a node. @dynamicMemberLookup -public struct SyntaxNode: Equatable, Hashable { - class Ref { +public struct SyntaxNode: Equatable, Hashable, Sendable { + final class Ref: Sendable { fileprivate let syntax: Syntax init(syntax: Syntax) { self.syntax = syntax diff --git a/Sources/WasmKit/Component/ComponentTypes.swift b/Sources/WasmKit/Component/ComponentTypes.swift index 1f4965d8..90711076 100644 --- a/Sources/WasmKit/Component/ComponentTypes.swift +++ b/Sources/WasmKit/Component/ComponentTypes.swift @@ -1,5 +1,5 @@ /// Error type raised from Component Model operations -public struct ComponentError: Error { +public struct ComponentError: Error { /// The content of the error public let content: Content diff --git a/Sources/WasmKit/Execution/Errors.swift b/Sources/WasmKit/Execution/Errors.swift index 08bd4273..07c1880b 100644 --- a/Sources/WasmKit/Execution/Errors.swift +++ b/Sources/WasmKit/Execution/Errors.swift @@ -3,12 +3,9 @@ import WasmTypes import struct WasmParser.Import /// The backtrace of the trap. -struct Backtrace: CustomStringConvertible { +struct Backtrace: CustomStringConvertible, Sendable { /// A symbol in the backtrace. struct Symbol { - /// The function that the symbol represents. - let function: Function - /// The name of the symbol. let name: String? } diff --git a/Sources/WasmKit/Execution/Execution.swift b/Sources/WasmKit/Execution/Execution.swift index 3702ba72..4f86cb75 100644 --- a/Sources/WasmKit/Execution/Execution.swift +++ b/Sources/WasmKit/Execution/Execution.swift @@ -70,7 +70,6 @@ struct Execution { let symbolName = store.nameRegistry.symbolicate(.wasm(function)) symbols.append( Backtrace.Symbol( - function: Function(handle: .wasm(function), store: store), name: symbolName ) ) diff --git a/Sources/WasmParser/Stream/Stream.swift b/Sources/WasmParser/Stream/Stream.swift index bf457aa4..46225c12 100644 --- a/Sources/WasmParser/Stream/Stream.swift +++ b/Sources/WasmParser/Stream/Stream.swift @@ -1,5 +1,5 @@ @usableFromInline -enum StreamError: Swift.Error, Equatable where Element: Hashable { +enum StreamError: Swift.Error, Equatable where Element: Hashable & Sendable { case unexpectedEnd(expected: Set?) case unexpected(Element, index: Int, expected: Set?) } diff --git a/Sources/WasmParser/WasmParser.swift b/Sources/WasmParser/WasmParser.swift index f1fe12b8..0bca6049 100644 --- a/Sources/WasmParser/WasmParser.swift +++ b/Sources/WasmParser/WasmParser.swift @@ -175,7 +175,7 @@ public struct ExpressionParser { let WASM_MAGIC: [UInt8] = [0x00, 0x61, 0x73, 0x6D] /// Flags for enabling/disabling WebAssembly features -public struct WasmFeatureSet: OptionSet { +public struct WasmFeatureSet: OptionSet, Sendable { /// The raw value of the feature set public let rawValue: Int @@ -206,7 +206,7 @@ public struct WasmFeatureSet: OptionSet { /// An error that occurs during parsing of a WebAssembly binary public struct WasmParserError: Swift.Error { @usableFromInline - struct Message { + struct Message: Sendable { let text: String init(_ text: String) { diff --git a/Sources/WasmParser/WasmTypes.swift b/Sources/WasmParser/WasmTypes.swift index e58ae783..2acd5212 100644 --- a/Sources/WasmParser/WasmTypes.swift +++ b/Sources/WasmParser/WasmTypes.swift @@ -189,7 +189,7 @@ public struct Global: Equatable { /// public struct ElementSegment: Equatable { @usableFromInline - struct Flag: OptionSet { + struct Flag: OptionSet, Sendable { @usableFromInline let rawValue: UInt32 @inlinable diff --git a/Sources/WasmTypes/WasmTypes.swift b/Sources/WasmTypes/WasmTypes.swift index 054e901c..3f0c9c61 100644 --- a/Sources/WasmTypes/WasmTypes.swift +++ b/Sources/WasmTypes/WasmTypes.swift @@ -2,7 +2,7 @@ /// /// > Note: /// -public struct FunctionType: Equatable, Hashable { +public struct FunctionType: Equatable, Hashable, Sendable { public init(parameters: [ValueType], results: [ValueType] = []) { self.parameters = parameters self.results = results @@ -15,14 +15,14 @@ public struct FunctionType: Equatable, Hashable { } /// Reference types -public enum ReferenceType: UInt8, Equatable, Hashable { +public enum ReferenceType: UInt8, Equatable, Hashable, Sendable { /// A nullable reference type to a function. case funcRef /// A nullable external reference type. case externRef } -public enum ValueType: Equatable, Hashable { +public enum ValueType: Equatable, Hashable, Sendable { /// 32-bit signed or unsigned integer. case i32 /// 64-bit signed or unsigned integer. diff --git a/Tests/WITTests/Semantics/RequestEvaluatorTests.swift b/Tests/WITTests/Semantics/RequestEvaluatorTests.swift index fc0ae422..cc7eb398 100644 --- a/Tests/WITTests/Semantics/RequestEvaluatorTests.swift +++ b/Tests/WITTests/Semantics/RequestEvaluatorTests.swift @@ -61,7 +61,7 @@ class RequestEvaluatorTests: XCTestCase { ) let cyclicalRequestError = try XCTUnwrap(anyError as? Evaluator.CyclicalRequestError) - XCTAssertEqual(cyclicalRequestError.activeRequests.count, 3) + XCTAssertEqual(cyclicalRequestError.activeRequestDescriptions.count, 3) } func testThrowingRequest() throws { diff --git a/Tests/WasmKitTests/Spectest/Spectest.swift b/Tests/WasmKitTests/Spectest/Spectest.swift index 7dc094a6..82302c78 100644 --- a/Tests/WasmKitTests/Spectest/Spectest.swift +++ b/Tests/WasmKitTests/Spectest/Spectest.swift @@ -48,11 +48,11 @@ struct NullSpectestProgressReporter: SpectestProgressReporter { struct StderrSpectestProgressReporter: SpectestProgressReporter { func log(_ message: String, verbose: Bool) { - fputs(message + "\n", stderr) + try! FileHandle.standardError.write(contentsOf: Data((message + "\n").utf8)) } func log(_ message: String, path: String, location: Location, verbose: Bool) { let (line, _) = location.computeLineAndColumn() - fputs("\(path):\(line): " + message + "\n", stderr) + try! FileHandle.standardError.write(contentsOf: Data(("\(path):\(line): " + message + "\n").utf8)) } }