@@ -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,27 @@ 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
+ const stack = "" + ( reason . stack || ( new Error ( ) . stack ) ) ;
98
+ Object . defineProperty ( reason , "stack" , {
99
+ get : ( ) => stack
100
+ } ) ;
96
101
97
102
// don't report this error twice
103
+ const alreadySilent = ! ! reason . silent ;
98
104
reason . silent = true ;
99
105
100
106
if ( ! is_exited ( ) ) {
101
107
try {
108
+ unregisterEmscriptenExitHandlers ( ) ;
109
+ uninstallUnhandledErrorHandler ( ) ;
102
110
if ( ! runtimeHelpers . runtimeReady ) {
103
111
mono_log_debug ( "abort_startup, reason: " + reason ) ;
104
112
abort_promises ( reason ) ;
@@ -119,19 +127,25 @@ export function mono_exit (exit_code: number, reason?: any): void {
119
127
}
120
128
121
129
try {
122
- logOnExit ( exit_code , reason ) ;
123
- appendElementOnExit ( exit_code ) ;
130
+ if ( ! alreadySilent ) {
131
+ logOnExit ( exit_code , reason ) ;
132
+ appendElementOnExit ( exit_code ) ;
133
+ }
124
134
} catch ( err ) {
125
135
mono_log_warn ( "mono_exit failed" , err ) ;
126
136
// don't propagate any failures
127
137
}
128
138
129
139
loaderHelpers . exitCode = exit_code ;
130
- loaderHelpers . exitReason = reason . message ;
140
+ if ( ! loaderHelpers . exitReason ) {
141
+ loaderHelpers . exitReason = reason ;
142
+ }
131
143
132
144
if ( ! ENVIRONMENT_IS_WORKER && runtimeHelpers . runtimeReady ) {
133
145
emscriptenModule . runtimeKeepalivePop ( ) ;
134
146
}
147
+ } else {
148
+ mono_log_debug ( "mono_exit called after exit" ) ;
135
149
}
136
150
137
151
if ( loaderHelpers . config && loaderHelpers . config . asyncFlushOnExit && exit_code === 0 ) {
@@ -154,13 +168,11 @@ export function mono_exit (exit_code: number, reason?: any): void {
154
168
function set_exit_code_and_quit_now ( exit_code : number , reason ?: any ) : void {
155
169
if ( WasmEnableThreads && ENVIRONMENT_IS_WORKER && runtimeHelpers . runtimeReady && runtimeHelpers . nativeAbort ) {
156
170
// note that the reason is not passed to UI thread
157
- runtimeHelpers . runtimeReady = false ;
158
171
runtimeHelpers . nativeAbort ( reason ) ;
159
172
throw reason ;
160
173
}
161
174
162
175
if ( runtimeHelpers . runtimeReady && runtimeHelpers . nativeExit ) {
163
- runtimeHelpers . runtimeReady = false ;
164
176
try {
165
177
runtimeHelpers . nativeExit ( exit_code ) ;
166
178
} catch ( error : any ) {
@@ -205,7 +217,6 @@ async function flush_node_streams () {
205
217
}
206
218
207
219
function abort_promises ( reason : any ) {
208
- loaderHelpers . exitReason = reason ;
209
220
loaderHelpers . allDownloadsQueued . promise_control . reject ( reason ) ;
210
221
loaderHelpers . afterConfigLoaded . promise_control . reject ( reason ) ;
211
222
loaderHelpers . wasmCompilePromise . promise_control . reject ( reason ) ;
@@ -256,7 +267,7 @@ function logOnExit (exit_code: number, reason: any) {
256
267
}
257
268
}
258
269
}
259
- if ( loaderHelpers . config ) {
270
+ if ( ! ENVIRONMENT_IS_WORKER && loaderHelpers . config ) {
260
271
if ( loaderHelpers . config . logExitCode ) {
261
272
if ( loaderHelpers . config . forwardConsoleLogsToWS ) {
262
273
teardown_proxy_console ( "WASM EXIT " + exit_code ) ;
@@ -294,3 +305,10 @@ function fatal_handler (event: any, reason: any, type: string) {
294
305
// no not re-throw from the fatal handler
295
306
}
296
307
}
308
+
309
+ function createExitStatus ( status :number , message :string ) {
310
+ const ex = new runtimeHelpers . ExitStatus ( status ) ;
311
+ ex . message = message ;
312
+ ex . toString = ( ) => message ;
313
+ return ex ;
314
+ }
0 commit comments