From f2f11a01a2a1de943ca931fb610bf00939a2e80b Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Mon, 14 Jan 2019 15:59:31 -0800 Subject: [PATCH] In debug mode log all imported uncaught exceptions This commit updates the `--debug` output of `wasm-bindgen` from the CLI to catch all JS exceptions from imported functions, log such, and then rethrow. It's hoped that this can be used when necessary to learn more information about thrown exceptions and where an uncaught exception could be causing issues with Rust code. Closes #1176 --- crates/cli-support/src/js/mod.rs | 3 +++ crates/cli-support/src/js/rust2js.rs | 25 ++++++++++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) 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!(