Skip to content

Commit dbc1b07

Browse files
WasmParser: Add FileSystem trait to allow omitting file system helpers
Extracted from #357 Co-Authored-By: Joannis Orlandos <joannis@orlandos.nl>
1 parent 6190c06 commit dbc1b07

10 files changed

Lines changed: 189 additions & 161 deletions

File tree

.github/workflows/main.yml

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ jobs:
6161
./Vendor/checkout-dependency --category component-model
6262
6363
swift --version
64-
swift test --sanitize address --traits ComponentModel,WasmDebuggingSupport ${{ matrix.test-args }}
64+
swift test --sanitize address --traits FileSystem,ComponentModel,WasmDebuggingSupport ${{ matrix.test-args }}
6565
swift build --package-path Benchmarks
6666
6767
build-macos:
@@ -71,7 +71,7 @@ jobs:
7171
# Swift 6.3.2
7272
- os: macos-26
7373
xcode: Xcode_26.5
74-
test-args: "--sanitize address --traits ComponentModel,WasmDebuggingSupport"
74+
test-args: "--sanitize address --traits FileSystem,ComponentModel,WasmDebuggingSupport"
7575

7676
runs-on: ${{ matrix.os }}
7777
name: "build-macos (${{ matrix.xcode }})"
@@ -132,15 +132,15 @@ jobs:
132132
matrix:
133133
include:
134134
- swift: "swift:6.3-noble"
135-
test-args: "--traits ComponentModel,WasmDebuggingSupport --enable-code-coverage"
135+
test-args: "--traits FileSystem,ComponentModel,WasmDebuggingSupport --enable-code-coverage"
136136
build-benchmarks: true
137137
run-benchmarks: true
138138
build-dev-dashboard: true
139139
- swift: "swiftlang/swift:nightly-6.4.x-noble"
140-
test-args: "--traits ComponentModel,WasmDebuggingSupport"
140+
test-args: "--traits FileSystem,ComponentModel,WasmDebuggingSupport"
141141
build-benchmarks: true
142142
- swift: "swiftlang/swift:nightly-main-noble"
143-
test-args: "--traits ComponentModel,WasmDebuggingSupport"
143+
test-args: "--traits FileSystem,ComponentModel,WasmDebuggingSupport"
144144
build-benchmarks: true
145145

146146
runs-on: ubuntu-24.04
@@ -234,9 +234,9 @@ jobs:
234234
run: ./build-exec swift sdk install "${{ matrix.musl-swift-sdk-download }}" --checksum "${{ matrix.musl-swift-sdk-checksum }}"
235235

236236
- name: Build (x86_64-swift-linux-musl)
237-
run: ./build-exec swift build --swift-sdk x86_64-swift-linux-musl --traits ComponentModel,WasmDebuggingSupport --explicit-target-dependency-import-check error
237+
run: ./build-exec swift build --swift-sdk x86_64-swift-linux-musl --traits FileSystem,ComponentModel,WasmDebuggingSupport --explicit-target-dependency-import-check error
238238
- name: Build (aarch64-swift-linux-musl)
239-
run: ./build-exec swift build --swift-sdk aarch64-swift-linux-musl --traits ComponentModel,WasmDebuggingSupport --explicit-target-dependency-import-check error
239+
run: ./build-exec swift build --swift-sdk aarch64-swift-linux-musl --traits FileSystem,ComponentModel,WasmDebuggingSupport --explicit-target-dependency-import-check error
240240

241241
build-android:
242242
runs-on: ubuntu-24.04
@@ -297,4 +297,4 @@ jobs:
297297
- name: Install Swift SDK
298298
run: swift sdk install https://download.swift.org/swift-6.3.2-release/wasm-sdk/swift-6.3.2-RELEASE/swift-6.3.2-RELEASE_wasm.artifactbundle.tar.gz --checksum a61f0584c93283589f8b2f42db05c1f9a182b506c2957271402992655591dd7c
299299
- name: Build with the Swift SDK
300-
run: swift build --swift-sdk "$(swiftc -print-target-info | jq -r '.swiftCompilerTag')_wasm" --traits ComponentModel --explicit-target-dependency-import-check error --product wasmkit-cli
300+
run: swift build --swift-sdk "$(swiftc -print-target-info | jq -r '.swiftCompilerTag')_wasm" --traits FileSystem,ComponentModel --explicit-target-dependency-import-check error --product wasmkit-cli

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ add_compile_definitions(
5353
include(FetchContent)
5454

5555
option(WASMKIT_BUILD_CLI "Build wasmkit-cli" ON)
56+
option(WASMKIT_ENABLE_FILESYSTEM "Enable FileSystem support" ON)
5657

5758
if(WASMKIT_BUILD_CLI)
5859
set(BUILD_TESTING OFF) # disable ArgumentParser tests

Package.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ let package = Package(
3838
.library(name: "_CabiShims", targets: ["_CabiShims"]),
3939
],
4040
traits: [
41-
.default(enabledTraits: []),
41+
.default(enabledTraits: ["FileSystem"]),
42+
"FileSystem",
4243
"ComponentModel",
4344
"WasmDebuggingSupport",
4445
],
@@ -112,7 +113,10 @@ let package = Package(
112113
name: "WasmParser",
113114
dependencies: [
114115
"WasmTypes",
115-
.product(name: "SystemPackage", package: "swift-system"),
116+
.product(
117+
name: "SystemPackage", package: "swift-system",
118+
condition: .when(traits: ["FileSystem"])
119+
),
116120
.target(
117121
name: "ComponentModel",
118122
condition: .when(traits: ["ComponentModel"])

Sources/WasmKit/CMakeLists.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ add_wasmkit_library(WasmKit
33
Imports.swift
44
Module.swift
55
ModuleParser.swift
6+
ModuleParser+FileSystem.swift
67
SIMDOpcode.swift
78
Translator.swift
89
Validator.swift
@@ -47,5 +48,10 @@ add_wasmkit_library(WasmKit
4748
Execution/V128Storage.swift
4849
)
4950

51+
if(WASMKIT_ENABLE_FILESYSTEM)
52+
target_compile_options(WasmKit PRIVATE
53+
$<$<COMPILE_LANGUAGE:Swift>:-D;FileSystem>)
54+
endif()
55+
5056
target_link_wasmkit_libraries(WasmKit PUBLIC
5157
_CWasmKit WasmParser SystemExtras WasmTypes SystemPackage)

Sources/WasmKit/Execution/ParsedComponentBuilder.swift

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,9 @@
11
#if ComponentModel
22
import ComponentModel
3-
import SystemPackage
43
import WasmParser
54

65
// MARK: - Component Parsing
76

8-
/// Parse a component binary file from a caller-owned file descriptor.
9-
///
10-
/// The descriptor is consumed from its current offset and is not closed by
11-
/// this function.
12-
public func parseComponent(
13-
fileHandle: FileDescriptor,
14-
features: WasmFeatureSet = .default
15-
) throws -> ParsedComponent {
16-
let stream = try FileHandleStream(fileHandle: fileHandle)
17-
return try parseComponent(stream: stream, features: features)
18-
}
19-
207
/// Parse a component binary into a `ParsedComponent` ready for instantiation.
218
///
229
/// This function converts the streaming `ComponentParser` output into a
@@ -609,3 +596,19 @@
609596
}
610597

611598
#endif
599+
600+
#if ComponentModel && FileSystem
601+
import struct SystemPackage.FileDescriptor
602+
603+
/// Parse a component binary file from a caller-owned file descriptor.
604+
///
605+
/// The descriptor is consumed from its current offset and is not closed by
606+
/// this function.
607+
public func parseComponent(
608+
fileHandle: FileDescriptor,
609+
features: WasmFeatureSet = .default
610+
) throws -> ParsedComponent {
611+
let stream = try FileHandleStream(fileHandle: fileHandle)
612+
return try parseComponent(stream: stream, features: features)
613+
}
614+
#endif
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#if FileSystem
2+
import WasmParser
3+
import SystemExtras
4+
import SystemPackage
5+
6+
#if os(Windows)
7+
import ucrt
8+
#endif
9+
10+
/// Parse a given file as a WebAssembly binary format file
11+
/// > Note: <https://webassembly.github.io/spec/core/binary/index.html>
12+
public func parseWasm(filePath: FilePath, features: WasmFeatureSet = .default) throws -> Module {
13+
#if os(Windows)
14+
// TODO: Upstream `O_BINARY` to `SystemPackage
15+
let accessMode = FileDescriptor.AccessMode(
16+
rawValue: FileDescriptor.AccessMode.readOnly.rawValue | O_BINARY
17+
)
18+
#else
19+
let accessMode: FileDescriptor.AccessMode = .readOnly
20+
#endif
21+
let fileHandle = try FileDescriptor.open(filePath, accessMode)
22+
return try withThrowing {
23+
try parseWasm(fileHandle: fileHandle, features: features)
24+
} defer: {
25+
try fileHandle.close()
26+
}
27+
}
28+
29+
/// Parse a WebAssembly binary file from a caller-owned file descriptor.
30+
///
31+
/// The descriptor is consumed from its current offset and is not closed by
32+
/// this function.
33+
public func parseWasm(fileHandle: FileDescriptor, features: WasmFeatureSet = .default) throws -> Module {
34+
let stream = try FileHandleStream(fileHandle: fileHandle)
35+
let module = try parseModule(stream: stream, features: features)
36+
return module
37+
}
38+
#endif

Sources/WasmKit/ModuleParser.swift

Lines changed: 0 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,5 @@
1-
import SystemExtras
2-
import SystemPackage
31
import WasmParser
42

5-
#if os(Windows)
6-
import ucrt
7-
#endif
8-
9-
/// Parse a given file as a WebAssembly binary format file
10-
/// > Note: <https://webassembly.github.io/spec/core/binary/index.html>
11-
public func parseWasm(filePath: FilePath, features: WasmFeatureSet = .default) throws -> Module {
12-
#if os(Windows)
13-
// TODO: Upstream `O_BINARY` to `SystemPackage
14-
let accessMode = FileDescriptor.AccessMode(
15-
rawValue: FileDescriptor.AccessMode.readOnly.rawValue | O_BINARY
16-
)
17-
#else
18-
let accessMode: FileDescriptor.AccessMode = .readOnly
19-
#endif
20-
let fileHandle = try FileDescriptor.open(filePath, accessMode)
21-
return try withThrowing {
22-
try parseWasm(fileHandle: fileHandle, features: features)
23-
} defer: {
24-
try fileHandle.close()
25-
}
26-
}
27-
28-
/// Parse a WebAssembly binary file from a caller-owned file descriptor.
29-
///
30-
/// The descriptor is consumed from its current offset and is not closed by
31-
/// this function.
32-
public func parseWasm(fileHandle: FileDescriptor, features: WasmFeatureSet = .default) throws -> Module {
33-
let stream = try FileHandleStream(fileHandle: fileHandle)
34-
let module = try parseModule(stream: stream, features: features)
35-
return module
36-
}
37-
383
/// Parse a given byte array as a WebAssembly binary format file
394
/// > Note: <https://webassembly.github.io/spec/core/binary/index.html>
405
public func parseWasm(bytes: [UInt8], features: WasmFeatureSet = .default) throws(WasmKitError) -> Module {

Sources/WasmParser/CMakeLists.txt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,12 @@ add_wasmkit_library(WasmParser
1111
)
1212

1313
target_link_wasmkit_libraries(WasmParser PUBLIC
14-
SystemExtras WasmTypes SystemPackage)
14+
WasmTypes)
15+
16+
if(WASMKIT_ENABLE_FILESYSTEM)
17+
target_compile_options(WasmParser PRIVATE
18+
$<$<COMPILE_LANGUAGE:Swift>:-D;FileSystem>)
19+
target_link_wasmkit_libraries(WasmParser PUBLIC
20+
SystemPackage)
21+
endif()
22+

0 commit comments

Comments
 (0)