diff --git a/crates/cli-support/src/js/binding.rs b/crates/cli-support/src/js/binding.rs index 9af2a469d3d..8f807805193 100644 --- a/crates/cli-support/src/js/binding.rs +++ b/crates/cli-support/src/js/binding.rs @@ -65,6 +65,8 @@ pub struct JsFunction { pub ts_arg_tys: Vec, pub ts_ret_ty: Option, pub might_be_optional_field: bool, + pub catch: bool, + pub log_error: bool, } impl<'a, 'b> Builder<'a, 'b> { @@ -201,7 +203,6 @@ impl<'a, 'b> Builder<'a, 'b> { if self.catch { js.cx.expose_handle_error()?; - call = format!("try {{\n{}}} catch (e) {{\n handleError(e)\n}}\n", call); } // Generate a try/catch block in debug mode which handles unexpected and @@ -210,7 +211,6 @@ impl<'a, 'b> Builder<'a, 'b> { // elsewhere. if self.log_error { js.cx.expose_log_error(); - call = format!("try {{\n{}}} catch (e) {{\n logError(e)\n}}\n", call); } code.push_str(&call); @@ -235,6 +235,8 @@ impl<'a, 'b> Builder<'a, 'b> { ts_arg_tys, ts_ret_ty, might_be_optional_field, + catch: self.catch, + log_error: self.log_error, }) } diff --git a/crates/cli-support/src/js/mod.rs b/crates/cli-support/src/js/mod.rs index fd36ff510ac..653bea21fa1 100644 --- a/crates/cli-support/src/js/mod.rs +++ b/crates/cli-support/src/js/mod.rs @@ -1666,9 +1666,16 @@ impl<'a> Context<'a> { let add = self.expose_add_to_anyref_table(table, alloc)?; self.global(&format!( " - function handleError(e) {{ - const idx = {}(e); - wasm.{}(idx); + function handleError(f) {{ + return function () {{ + try {{ + return f.apply(this, arguments); + + }} catch (e) {{ + const idx = {}(e); + wasm.{}(idx); + }} + }}; }} ", add, store, @@ -1678,8 +1685,15 @@ impl<'a> Context<'a> { self.expose_add_heap_object(); self.global(&format!( " - function handleError(e) {{ - wasm.{}(addHeapObject(e)); + function handleError(f) {{ + return function () {{ + try {{ + return f.apply(this, arguments); + + }} catch (e) {{ + wasm.{}(addHeapObject(e)); + }} + }}; }} ", store, @@ -1695,20 +1709,27 @@ impl<'a> Context<'a> { } self.global( "\ - function logError(e) { - let error = (function () { + function logError(f) { + return function () { try { - return e instanceof Error \ - ? `${e.message}\\n\\nStack:\\n${e.stack}` \ - : e.toString(); - } catch(_) { - return \"\"; + return f.apply(this, arguments); + + } catch (e) { + let error = (function () { + try { + return e instanceof Error \ + ? `${e.message}\\n\\nStack:\\n${e.stack}` \ + : e.toString(); + } catch(_) { + return \"\"; + } + }()); + console.error(\"wasm-bindgen: imported JS function that \ + was not marked as `catch` threw an error:\", \ + error); + throw e; } - }()); - console.error(\"wasm-bindgen: imported JS function that \ - was not marked as `catch` threw an error:\", \ - error); - throw e; + }; } ", ); @@ -2183,6 +2204,8 @@ impl<'a> Context<'a> { js_doc, code, might_be_optional_field, + catch, + log_error, } = builder .process(&adapter, instrs, arg_names) .with_context(|| match kind { @@ -2201,6 +2224,9 @@ impl<'a> Context<'a> { // on what's being exported. match kind { Kind::Export(export) => { + assert_eq!(catch, false); + assert_eq!(log_error, false); + let ts_sig = match export.generate_typescript { true => Some(ts_sig.as_str()), false => None, @@ -2257,10 +2283,20 @@ impl<'a> Context<'a> { } } Kind::Import(core) => { - self.wasm_import_definitions - .insert(core, format!("function{}", code)); + let code = if catch { + format!("handleError(function{})", code) + } else if log_error { + format!("logError(function{})", code) + } else { + format!("function{}", code) + }; + + self.wasm_import_definitions.insert(core, code); } Kind::Adapter => { + assert_eq!(catch, false); + assert_eq!(log_error, false); + self.globals.push_str("function "); self.globals.push_str(&self.adapter_name(id)); self.globals.push_str(&code); diff --git a/crates/cli/tests/reference/anyref-import-catch.js b/crates/cli/tests/reference/anyref-import-catch.js index 5e7c481b570..4f5f48aa60a 100644 --- a/crates/cli/tests/reference/anyref-import-catch.js +++ b/crates/cli/tests/reference/anyref-import-catch.js @@ -24,9 +24,16 @@ function addToAnyrefTable0(obj) { return idx; } -function handleError(e) { - const idx = addToAnyrefTable0(e); - wasm.__wbindgen_exn_store(idx); +function handleError(f) { + return function () { + try { + return f.apply(this, arguments); + + } catch (e) { + const idx = addToAnyrefTable0(e); + wasm.__wbindgen_exn_store(idx); + } + }; } /** */ @@ -34,13 +41,9 @@ export function exported() { wasm.exported(); } -export const __wbg_foo_8d66ddef0ff279d6 = function() { - try { - foo(); - } catch (e) { - handleError(e) - } -}; +export const __wbg_foo_8d66ddef0ff279d6 = handleError(function() { + foo(); +}); export const __wbindgen_throw = function(arg0, arg1) { throw new Error(getStringFromWasm0(arg0, arg1)); diff --git a/crates/cli/tests/reference/import-catch.js b/crates/cli/tests/reference/import-catch.js index b4b61630809..6b0f9fb225e 100644 --- a/crates/cli/tests/reference/import-catch.js +++ b/crates/cli/tests/reference/import-catch.js @@ -29,8 +29,15 @@ function addHeapObject(obj) { return idx; } -function handleError(e) { - wasm.__wbindgen_exn_store(addHeapObject(e)); +function handleError(f) { + return function () { + try { + return f.apply(this, arguments); + + } catch (e) { + wasm.__wbindgen_exn_store(addHeapObject(e)); + } + }; } /** */ @@ -42,13 +49,9 @@ export const __wbindgen_object_drop_ref = function(arg0) { takeObject(arg0); }; -export const __wbg_foo_8d66ddef0ff279d6 = function() { - try { - foo(); - } catch (e) { - handleError(e) - } -}; +export const __wbg_foo_8d66ddef0ff279d6 = handleError(function() { + foo(); +}); export const __wbindgen_rethrow = function(arg0) { throw takeObject(arg0);