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
This commit is contained in:
Alex Crichton 2019-01-14 15:59:31 -08:00
parent 666c1e4584
commit f2f11a01a2
2 changed files with 27 additions and 1 deletions

View File

@ -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())?;

View File

@ -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!(