From 820944dbe32db1d6679f5dbdb2c0564bc06671c2 Mon Sep 17 00:00:00 2001 From: Nayeem Rahman Date: Thu, 18 Feb 2021 22:36:02 +0000 Subject: [PATCH] fix(core): Make dynamic import async errors catchable (#9505) Fixes #6259 --- cli/tests/085_dynamic_import_async_error.ts | 5 +++++ cli/tests/085_dynamic_import_async_error.ts.out | 2 ++ cli/tests/delayed_error.ts | 2 ++ cli/tests/integration_tests.rs | 5 +++++ core/runtime.rs | 6 ++++++ 5 files changed, 20 insertions(+) create mode 100644 cli/tests/085_dynamic_import_async_error.ts create mode 100644 cli/tests/085_dynamic_import_async_error.ts.out create mode 100644 cli/tests/delayed_error.ts diff --git a/cli/tests/085_dynamic_import_async_error.ts b/cli/tests/085_dynamic_import_async_error.ts new file mode 100644 index 0000000000..aa5ff7277e --- /dev/null +++ b/cli/tests/085_dynamic_import_async_error.ts @@ -0,0 +1,5 @@ +try { + await import("./delayed_error.ts"); +} catch (error) { + console.log(`Caught: ${error.stack}`); +} diff --git a/cli/tests/085_dynamic_import_async_error.ts.out b/cli/tests/085_dynamic_import_async_error.ts.out new file mode 100644 index 0000000000..974c2e4264 --- /dev/null +++ b/cli/tests/085_dynamic_import_async_error.ts.out @@ -0,0 +1,2 @@ +[WILDCARD]Caught: Error: foo + at [WILDCARD]/delayed_error.ts:[WILDCARD] diff --git a/cli/tests/delayed_error.ts b/cli/tests/delayed_error.ts new file mode 100644 index 0000000000..76057e627b --- /dev/null +++ b/cli/tests/delayed_error.ts @@ -0,0 +1,2 @@ +await new Promise((r) => setTimeout(r, 100)); +throw new Error("foo"); diff --git a/cli/tests/integration_tests.rs b/cli/tests/integration_tests.rs index 15da2359df..0b85bad9b9 100644 --- a/cli/tests/integration_tests.rs +++ b/cli/tests/integration_tests.rs @@ -2718,6 +2718,11 @@ console.log("finish"); output: "084_worker_custom_inspect.ts.out", }); + itest!(_085_dynamic_import_async_error { + args: "run --allow-read 085_dynamic_import_async_error.ts", + output: "085_dynamic_import_async_error.ts.out", + }); + itest!(js_import_detect { args: "run --quiet --reload js_import_detect.ts", output: "js_import_detect.ts.out", diff --git a/core/runtime.rs b/core/runtime.rs index 7653608f72..e0a4a6b153 100644 --- a/core/runtime.rs +++ b/core/runtime.rs @@ -809,6 +809,12 @@ impl JsRuntime { ); let promise = v8::Local::::try_from(value) .expect("Expected to get promise as module evaluation result"); + let empty_fn = |_scope: &mut v8::HandleScope, + _args: v8::FunctionCallbackArguments, + _rv: v8::ReturnValue| {}; + let empty_fn = v8::FunctionTemplate::new(scope, empty_fn); + let empty_fn = empty_fn.get_function(scope).unwrap(); + promise.catch(scope, empty_fn); let promise_global = v8::Global::new(scope, promise); let mut state = state_rc.borrow_mut(); state.pending_promise_exceptions.remove(&promise_global);