Skip to content

Commit a74d7d1

Browse files
authored
[wasm] pass ExitStatus when calling quit_ (#64734)
* pass ExitStatus when calling quit_ * set noExitRuntime * fix double throw * enable 64727 tests
1 parent 0a3531e commit a74d7d1

File tree

7 files changed

+28
-16
lines changed

7 files changed

+28
-16
lines changed

src/libraries/tests.proj

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,6 @@
1818
<ProjectExclusions Include="$(MonoProjectRoot)sample\wasm\console-node-ts\Wasm.Console.Node.TS.Sample.csproj" />
1919
<ProjectExclusions Include="$(MonoProjectRoot)sample\wasm\browser-webpack\Wasm.Browser.WebPack.Sample.csproj" />
2020
<ProjectExclusions Include="$(MonoProjectRoot)sample\wasm\browser-nextjs\Wasm.Browser.NextJs.Sample.csproj" />
21-
22-
<!-- https://github.com/dotnet/runtime/issues/64727 -->
23-
<ProjectExclusions Include="$(MonoProjectRoot)sample\wasm\console-node-cjs\Wasm.Console.Node.CJS.Sample.csproj" />
24-
<ProjectExclusions Include="$(MonoProjectRoot)sample\wasm\console-node-es6\Wasm.Console.Node.ES6.Sample.csproj" />
2521
</ItemGroup>
2622

2723
<!-- Wasm aot on !windows -->

src/mono/wasm/runtime/cjs/dotnet.cjs.lib.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,13 @@ const DotnetSupportLib = {
1212
$DOTNET__postset: `
1313
let __dotnet_replacements = {readAsync, fetch: globalThis.fetch, require};
1414
let __dotnet_exportedAPI = __dotnet_runtime.__initializeImportsAndExports(
15-
{ isESM:false, isGlobal:ENVIRONMENT_IS_GLOBAL, isNode:ENVIRONMENT_IS_NODE, isShell:ENVIRONMENT_IS_SHELL, isWeb:ENVIRONMENT_IS_WEB, locateFile, quit_, requirePromise:Promise.resolve(require)},
15+
{ isESM:false, isGlobal:ENVIRONMENT_IS_GLOBAL, isNode:ENVIRONMENT_IS_NODE, isShell:ENVIRONMENT_IS_SHELL, isWeb:ENVIRONMENT_IS_WEB, locateFile, quit_, ExitStatus, requirePromise:Promise.resolve(require)},
1616
{ mono:MONO, binding:BINDING, internal:INTERNAL, module:Module },
1717
__dotnet_replacements);
1818
readAsync = __dotnet_replacements.readAsync;
1919
var fetch = __dotnet_replacements.fetch;
2020
require = __dotnet_replacements.requireOut;
21+
var noExitRuntime = __dotnet_replacements.noExitRuntime;
2122
`,
2223
};
2324

src/mono/wasm/runtime/es6/dotnet.es6.lib.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,13 @@ if (ENVIRONMENT_IS_NODE) {
4949
}
5050
}
5151
let __dotnet_exportedAPI = __dotnet_runtime.__initializeImportsAndExports(
52-
{ isESM:true, isGlobal:false, isNode:ENVIRONMENT_IS_NODE, isShell:ENVIRONMENT_IS_SHELL, isWeb:ENVIRONMENT_IS_WEB, locateFile, quit_, requirePromise:__dotnet_replacements.requirePromise },
52+
{ isESM:true, isGlobal:false, isNode:ENVIRONMENT_IS_NODE, isShell:ENVIRONMENT_IS_SHELL, isWeb:ENVIRONMENT_IS_WEB, locateFile, quit_, ExitStatus, requirePromise:__dotnet_replacements.requirePromise },
5353
{ mono:MONO, binding:BINDING, internal:INTERNAL, module:Module },
5454
__dotnet_replacements);
5555
readAsync = __dotnet_replacements.readAsync;
5656
var fetch = __dotnet_replacements.fetch;
5757
require = __dotnet_replacements.requireOut;
58+
var noExitRuntime = __dotnet_replacements.noExitRuntime;
5859
`,
5960
};
6061

src/mono/wasm/runtime/exports.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import {
2626
mono_wasm_add_dbg_command_received,
2727
mono_wasm_change_debugger_log_level,
2828
} from "./debug";
29-
import { runtimeHelpers, setImportsAndExports } from "./imports";
29+
import { ENVIRONMENT_IS_WEB, ExitStatusError, runtimeHelpers, setImportsAndExports } from "./imports";
3030
import { DotnetModuleConfigImports, DotnetModule } from "./types";
3131
import {
3232
mono_load_runtime_and_bcl_args, mono_wasm_load_config,
@@ -132,9 +132,9 @@ let exportedAPI: DotnetPublicAPI;
132132
// it exports methods to global objects MONO, BINDING and Module in backward compatible way
133133
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
134134
function initializeImportsAndExports(
135-
imports: { isESM: boolean, isGlobal: boolean, isNode: boolean, isShell: boolean, isWeb: boolean, locateFile: Function, quit_: Function, requirePromise: Promise<Function> },
135+
imports: { isESM: boolean, isGlobal: boolean, isNode: boolean, isShell: boolean, isWeb: boolean, locateFile: Function, quit_: Function, ExitStatus: ExitStatusError, requirePromise: Promise<Function> },
136136
exports: { mono: any, binding: any, internal: any, module: any },
137-
replacements: { fetch: any, readAsync: any, require: any, requireOut: any },
137+
replacements: { fetch: any, readAsync: any, require: any, requireOut: any, noExitRuntime: boolean },
138138
): DotnetPublicAPI {
139139
const module = exports.module as DotnetModule;
140140
const globalThisAny = globalThis as any;
@@ -192,6 +192,8 @@ function initializeImportsAndExports(
192192
replacements.readAsync = readAsync_like;
193193
replacements.requireOut = module.imports.require;
194194

195+
replacements.noExitRuntime = ENVIRONMENT_IS_WEB;
196+
195197
if (typeof module.disableDotnet6Compatibility === "undefined") {
196198
module.disableDotnet6Compatibility = imports.isESM;
197199
}

src/mono/wasm/runtime/imports.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,16 @@ export let ENVIRONMENT_IS_SHELL: boolean;
2020
export let ENVIRONMENT_IS_WEB: boolean;
2121
export let locateFile: Function;
2222
export let quit: Function;
23+
export let ExitStatus: ExitStatusError;
2324
export let requirePromise: Promise<Function>;
2425

26+
export interface ExitStatusError {
27+
new(status: number): any;
28+
}
29+
2530
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
2631
export function setImportsAndExports(
27-
imports: { isESM: boolean, isNode: boolean, isShell: boolean, isWeb: boolean, locateFile: Function, quit_: Function, requirePromise: Promise<Function> },
32+
imports: { isESM: boolean, isNode: boolean, isShell: boolean, isWeb: boolean, locateFile: Function, ExitStatus: ExitStatusError, quit_: Function, requirePromise: Promise<Function> },
2833
exports: { mono: any, binding: any, internal: any, module: any },
2934
): void {
3035
MONO = exports.mono;
@@ -37,6 +42,7 @@ export function setImportsAndExports(
3742
ENVIRONMENT_IS_WEB = imports.isWeb;
3843
locateFile = imports.locateFile;
3944
quit = imports.quit_;
45+
ExitStatus = imports.ExitStatus;
4046
requirePromise = imports.requirePromise;
4147
}
4248

src/mono/wasm/runtime/run.ts

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Module, quit } from "./imports";
1+
import { ExitStatus, Module, quit } from "./imports";
22
import { mono_call_assembly_entry_point } from "./method-calls";
33
import { mono_wasm_set_main_args, runtime_is_initialized_reject } from "./startup";
44

@@ -8,6 +8,9 @@ export async function mono_run_main_and_exit(main_assembly_name: string, args: s
88
const result = await mono_run_main(main_assembly_name, args);
99
set_exit_code(result);
1010
} catch (error) {
11+
if (error instanceof ExitStatus) {
12+
return;
13+
}
1114
set_exit_code(1, error);
1215
}
1316
}
@@ -24,11 +27,14 @@ export function mono_on_abort(error: any): void {
2427
}
2528

2629
function set_exit_code(exit_code: number, reason?: any) {
27-
if (reason) {
30+
if (reason && !(reason instanceof ExitStatus)) {
2831
Module.printErr(reason.toString());
2932
if (reason.stack) {
3033
Module.printErr(reason.stack);
3134
}
3235
}
36+
else {
37+
reason = new ExitStatus(exit_code);
38+
}
3339
quit(exit_code, reason);
3440
}

src/mono/wasm/test-main.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ loadDotnet("./dotnet.js").then((createDotnetRuntime) => {
127127
onConfigLoaded: (config) => {
128128
if (!Module.config) {
129129
const err = new Error("Could not find ./mono-config.json. Cancelling run");
130-
set_exit_code(1,);
130+
set_exit_code(1);
131131
throw err;
132132
}
133133
// Have to set env vars here to enable setting MONO_LOG_LEVEL etc.
@@ -214,7 +214,9 @@ const App = {
214214
const result = await MONO.mono_run_main(main_assembly_name, app_args);
215215
set_exit_code(result);
216216
} catch (error) {
217-
set_exit_code(1, error);
217+
if (error.name != "ExitStatus") {
218+
set_exit_code(1, error);
219+
}
218220
}
219221
} else {
220222
set_exit_code(1, "Unhandled argument: " + processedArguments.applicationArgs[0]);
@@ -272,8 +274,6 @@ function set_exit_code(exit_code, reason) {
272274
};
273275
stop_when_ws_buffer_empty();
274276

275-
} else if (is_node) {
276-
process.exit(exit_code);
277277
} else if (App && App.INTERNAL) {
278278
App.INTERNAL.mono_wasm_exit(exit_code);
279279
}

0 commit comments

Comments
 (0)