1
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2024-12-22 15:24:46 -05:00

fix(core/runtime): always cancel termination in exception handling (#15514)

This commit is contained in:
Nayeem Rahman 2022-08-21 12:57:10 +01:00 committed by GitHub
parent 3caec9721e
commit e39d4e3e7f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 22 additions and 10 deletions

View file

@ -2738,6 +2738,13 @@ itest!(report_error_handled {
output: "report_error_handled.ts.out", output: "report_error_handled.ts.out",
}); });
// Regression test for https://github.com/denoland/deno/issues/15513.
itest!(report_error_end_of_program {
args: "run --quiet report_error_end_of_program.ts",
output: "report_error_end_of_program.ts.out",
exit_code: 1,
});
itest!(spawn_stdout_inherit { itest!(spawn_stdout_inherit {
args: "run --quiet --unstable -A spawn_stdout_inherit.ts", args: "run --quiet --unstable -A spawn_stdout_inherit.ts",
output: "spawn_stdout_inherit.ts.out", output: "spawn_stdout_inherit.ts.out",

View file

@ -0,0 +1 @@
reportError(new Error("foo"));

View file

@ -0,0 +1,4 @@
error: Uncaught Error: foo
reportError(new Error("foo"));
^
at [WILDCARD]/report_error_end_of_program.ts:1:13

View file

@ -1156,14 +1156,14 @@ pub(crate) fn exception_to_err_result<'s, T>(
) -> Result<T, Error> { ) -> Result<T, Error> {
let state_rc = JsRuntime::state(scope); let state_rc = JsRuntime::state(scope);
let is_terminating_exception = scope.is_execution_terminating(); let was_terminating_execution = scope.is_execution_terminating();
// If TerminateExecution was called, cancel isolate termination so that the
// exception can be created. Note that `scope.is_execution_terminating()` may
// have returned false if TerminateExecution was indeed called but there was
// no JS to execute after the call.
scope.cancel_terminate_execution();
let mut exception = exception; let mut exception = exception;
{
if is_terminating_exception {
// TerminateExecution was called. Cancel isolate termination so that the
// exception can be created..
scope.cancel_terminate_execution();
// If the termination is the result of a `Deno.core.terminate` call, we want // If the termination is the result of a `Deno.core.terminate` call, we want
// to use the exception that was passed to it rather than the exception that // to use the exception that was passed to it rather than the exception that
// was passed to this function. // was passed to this function.
@ -1191,8 +1191,8 @@ pub(crate) fn exception_to_err_result<'s, T>(
); );
} }
if is_terminating_exception { if was_terminating_execution {
// Re-enable exception termination. // Resume exception termination.
scope.terminate_execution(); scope.terminate_execution();
} }