diff --git a/crates/cli-support/src/js/mod.rs b/crates/cli-support/src/js/mod.rs index b068cbca8fc..a418b5a2338 100644 --- a/crates/cli-support/src/js/mod.rs +++ b/crates/cli-support/src/js/mod.rs @@ -2410,6 +2410,9 @@ impl<'a, 'b> SubContext<'a, 'b> { // Build up our shim's state, and we'll use that to guide whether we // actually emit an import here or not. let mut shim = Rust2Js::new(self.cx); + if shim.cx.config.debug { + shim.catch_and_rethrow(true); + } shim.catch(import.catch) .variadic(import.variadic) .process(descriptor.unwrap_function())?; diff --git a/crates/cli-support/src/js/rust2js.rs b/crates/cli-support/src/js/rust2js.rs index da75816507a..b2081c6d2f2 100644 --- a/crates/cli-support/src/js/rust2js.rs +++ b/crates/cli-support/src/js/rust2js.rs @@ -36,6 +36,7 @@ pub struct Rust2Js<'a, 'b: 'a> { /// Whether or not we're catching JS exceptions catch: bool, + catch_and_rethrow: bool, /// Whether or not the last argument is a slice representing variadic arguments. variadic: bool, @@ -53,6 +54,7 @@ impl<'a, 'b> Rust2Js<'a, 'b> { arg_idx: 0, ret_expr: String::new(), catch: false, + catch_and_rethrow: false, variadic: false, } } @@ -62,6 +64,11 @@ impl<'a, 'b> Rust2Js<'a, 'b> { self } + pub fn catch_and_rethrow(&mut self, catch_and_rethrow: bool) -> &mut Self { + self.catch_and_rethrow = catch_and_rethrow; + self + } + pub fn variadic(&mut self, variadic: bool) -> &mut Self { self.variadic = variadic; self @@ -505,6 +512,7 @@ impl<'a, 'b> Rust2Js<'a, 'b> { let Rust2Js { // fields which may affect whether we do nontrivial work catch, + catch_and_rethrow, finally, js_arguments, prelude, @@ -520,6 +528,7 @@ impl<'a, 'b> Rust2Js<'a, 'b> { } = self; !catch && + !catch_and_rethrow && !variadic && prelude.is_empty() && finally.is_empty() && @@ -639,7 +648,21 @@ impl<'a, 'b> Rust2Js<'a, 'b> { ", &invoc, catch ); - }; + } else if self.catch_and_rethrow { + invoc = format!( + "\ + try {{\n\ + {} + }} catch (e) {{\n\ + console.error(\"wasm-bindgen: imported JS function that \ + was not marked as `catch` threw an error:\", \ + e); + throw e; + }}\ + ", + &invoc, + ); + } if self.finally.len() > 0 { invoc = format!(