Use JavaScriptKit's main entrypoint handler if available

The latest JavaScriptKit added main() method to handle main()/__main_argc_argv()
function call. It also handles some quirks of async-main & JavaScriptEventLoop.
This commit is contained in:
Yuta Saito 2024-05-08 09:58:10 +00:00
parent d487abb3b3
commit 52f65cb692
3 changed files with 16 additions and 9 deletions

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,6 @@
export class SwiftRuntime {
setInstance(instance: WebAssembly.Instance): void;
main?(): void;
readonly wasmImports: ImportedFunctions;
}
export type SwiftRuntimeConstructor = typeof SwiftRuntime;

View File

@ -112,11 +112,17 @@ export const WasmRunner = (rawOptions: Options | false, SwiftRuntime: SwiftRunti
} else if (typeof instance.exports._initialize == "function") {
// Initialize and start Reactor
wasi.initialize(instance as any);
if (typeof instance.exports.main === "function") {
instance.exports.main();
} else if (typeof instance.exports.__main_argc_argv === "function") {
// Swift 6.0 and later use `__main_argc_argv` instead of `main`.
instance.exports.__main_argc_argv(0, 0);
if (swift && swift.main) {
// Use JavaScriptKit's entry point if it's available
swift.main();
} else {
// For older versions of JavaScriptKit, we need to handle it manually
if (typeof instance.exports.main === "function") {
instance.exports.main();
} else if (typeof instance.exports.__main_argc_argv === "function") {
// Swift 6.0 and later use `__main_argc_argv` instead of `main`.
instance.exports.__main_argc_argv(0, 0);
}
}
}
},