@@ -39,36 +39,40 @@ export function uninstallUnhandledErrorHandler () {
39
39
}
40
40
}
41
41
42
+ let originalOnAbort : ( ( reason : any , extraJson ?:string ) => void ) | undefined ;
43
+ let originalOnExit : ( ( code : number ) => void ) | undefined ;
44
+
42
45
export function registerEmscriptenExitHandlers ( ) {
43
- if ( ! emscriptenModule . onAbort ) {
44
- emscriptenModule . onAbort = onAbort ;
45
- }
46
- if ( ! emscriptenModule . onExit ) {
47
- emscriptenModule . onExit = onExit ;
48
- }
46
+ originalOnAbort = emscriptenModule . onAbort ;
47
+ originalOnExit = emscriptenModule . onExit ;
48
+ emscriptenModule . onAbort = onAbort ;
49
+ emscriptenModule . onExit = onExit ;
49
50
}
50
51
51
52
function unregisterEmscriptenExitHandlers ( ) {
52
53
if ( emscriptenModule . onAbort == onAbort ) {
53
- emscriptenModule . onAbort = undefined ;
54
+ emscriptenModule . onAbort = originalOnAbort ;
54
55
}
55
56
if ( emscriptenModule . onExit == onExit ) {
56
- emscriptenModule . onExit = undefined ;
57
+ emscriptenModule . onExit = originalOnExit ;
57
58
}
58
59
}
59
60
function onExit ( code : number ) {
61
+ if ( originalOnExit ) {
62
+ originalOnExit ( code ) ;
63
+ }
60
64
mono_exit ( code , loaderHelpers . exitReason ) ;
61
65
}
62
66
63
67
function onAbort ( reason : any ) {
64
- mono_exit ( 1 , loaderHelpers . exitReason || reason ) ;
68
+ if ( originalOnAbort ) {
69
+ originalOnAbort ( reason || loaderHelpers . exitReason ) ;
70
+ }
71
+ mono_exit ( 1 , reason || loaderHelpers . exitReason ) ;
65
72
}
66
73
67
74
// this will also call mono_wasm_exit if available, which will call exitJS -> _proc_exit -> terminateAllThreads
68
75
export function mono_exit ( exit_code : number , reason ?: any ) : void {
69
- unregisterEmscriptenExitHandlers ( ) ;
70
- uninstallUnhandledErrorHandler ( ) ;
71
-
72
76
// unify shape of the reason object
73
77
const is_object = reason && typeof reason === "object" ;
74
78
exit_code = ( is_object && typeof reason . status === "number" )
@@ -82,23 +86,24 @@ export function mono_exit (exit_code: number, reason?: any): void {
82
86
reason = is_object
83
87
? reason
84
88
: ( runtimeHelpers . ExitStatus
85
- ? new runtimeHelpers . ExitStatus ( exit_code )
89
+ ? createExitStatus ( exit_code , message )
86
90
: new Error ( "Exit with code " + exit_code + " " + message ) ) ;
87
91
reason . status = exit_code ;
88
92
if ( ! reason . message ) {
89
93
reason . message = message ;
90
94
}
91
95
92
96
// force stack property to be generated before we shut down managed code, or create current stack if it doesn't exist
93
- if ( ! reason . stack ) {
94
- reason . stack = new Error ( ) . stack || "" ;
95
- }
97
+ reason . stack = "" + new Error ( ) . stack || "" ;
96
98
97
99
// don't report this error twice
100
+ const alreadySilent = ! ! reason . silent ;
98
101
reason . silent = true ;
99
102
100
103
if ( ! is_exited ( ) ) {
101
104
try {
105
+ unregisterEmscriptenExitHandlers ( ) ;
106
+ uninstallUnhandledErrorHandler ( ) ;
102
107
if ( ! runtimeHelpers . runtimeReady ) {
103
108
mono_log_debug ( "abort_startup, reason: " + reason ) ;
104
109
abort_promises ( reason ) ;
@@ -119,19 +124,25 @@ export function mono_exit (exit_code: number, reason?: any): void {
119
124
}
120
125
121
126
try {
122
- logOnExit ( exit_code , reason ) ;
123
- appendElementOnExit ( exit_code ) ;
127
+ if ( ! alreadySilent ) {
128
+ logOnExit ( exit_code , reason ) ;
129
+ appendElementOnExit ( exit_code ) ;
130
+ }
124
131
} catch ( err ) {
125
132
mono_log_warn ( "mono_exit failed" , err ) ;
126
133
// don't propagate any failures
127
134
}
128
135
129
136
loaderHelpers . exitCode = exit_code ;
130
- loaderHelpers . exitReason = reason . message ;
137
+ if ( ! loaderHelpers . exitReason ) {
138
+ loaderHelpers . exitReason = reason ;
139
+ }
131
140
132
141
if ( ! ENVIRONMENT_IS_WORKER && runtimeHelpers . runtimeReady ) {
133
142
emscriptenModule . runtimeKeepalivePop ( ) ;
134
143
}
144
+ } else {
145
+ mono_log_debug ( "mono_exit called after exit" ) ;
135
146
}
136
147
137
148
if ( loaderHelpers . config && loaderHelpers . config . asyncFlushOnExit && exit_code === 0 ) {
@@ -154,13 +165,11 @@ export function mono_exit (exit_code: number, reason?: any): void {
154
165
function set_exit_code_and_quit_now ( exit_code : number , reason ?: any ) : void {
155
166
if ( WasmEnableThreads && ENVIRONMENT_IS_WORKER && runtimeHelpers . runtimeReady && runtimeHelpers . nativeAbort ) {
156
167
// note that the reason is not passed to UI thread
157
- runtimeHelpers . runtimeReady = false ;
158
168
runtimeHelpers . nativeAbort ( reason ) ;
159
169
throw reason ;
160
170
}
161
171
162
172
if ( runtimeHelpers . runtimeReady && runtimeHelpers . nativeExit ) {
163
- runtimeHelpers . runtimeReady = false ;
164
173
try {
165
174
runtimeHelpers . nativeExit ( exit_code ) ;
166
175
} catch ( error : any ) {
@@ -205,7 +214,6 @@ async function flush_node_streams () {
205
214
}
206
215
207
216
function abort_promises ( reason : any ) {
208
- loaderHelpers . exitReason = reason ;
209
217
loaderHelpers . allDownloadsQueued . promise_control . reject ( reason ) ;
210
218
loaderHelpers . afterConfigLoaded . promise_control . reject ( reason ) ;
211
219
loaderHelpers . wasmCompilePromise . promise_control . reject ( reason ) ;
@@ -256,7 +264,7 @@ function logOnExit (exit_code: number, reason: any) {
256
264
}
257
265
}
258
266
}
259
- if ( loaderHelpers . config ) {
267
+ if ( ! ENVIRONMENT_IS_WORKER && loaderHelpers . config ) {
260
268
if ( loaderHelpers . config . logExitCode ) {
261
269
if ( loaderHelpers . config . forwardConsoleLogsToWS ) {
262
270
teardown_proxy_console ( "WASM EXIT " + exit_code ) ;
@@ -294,3 +302,10 @@ function fatal_handler (event: any, reason: any, type: string) {
294
302
// no not re-throw from the fatal handler
295
303
}
296
304
}
305
+
306
+ function createExitStatus ( status :number , message :string ) {
307
+ const ex = new runtimeHelpers . ExitStatus ( status ) ;
308
+ ex . message = message ;
309
+ ex . toString = ( ) => message ;
310
+ return ex ;
311
+ }
0 commit comments