Skip to content

Commit 205bfb7

Browse files
Merge pull request RustPython#532 from coolreader18/wasm-better-panic
[WASM] Make panic errors available from JS
2 parents 098675d + 9a7bb31 commit 205bfb7

File tree

2 files changed

+27
-6
lines changed

2 files changed

+27
-6
lines changed

wasm/demo/src/main.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,12 @@ function runCodeFromTextarea() {
3636
if (result !== null) {
3737
consoleElement.value += `\n${result}\n`;
3838
}
39-
} catch (e) {
40-
errorElement.textContent = e;
41-
console.error(e);
39+
} catch (err) {
40+
if (err instanceof WebAssembly.RuntimeError) {
41+
err = window.__RUSTPYTHON_ERROR || err;
42+
}
43+
errorElement.textContent = err;
44+
console.error(err);
4245
}
4346
}
4447

@@ -61,4 +64,5 @@ snippets.addEventListener('change', () => {
6164
runCodeFromTextarea();
6265
});
6366

64-
runCodeFromTextarea(); // Run once for demo
67+
// Run once for demo
68+
runCodeFromTextarea();

wasm/lib/src/lib.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,34 @@ extern crate wasm_bindgen_futures;
1212
extern crate web_sys;
1313

1414
use js_sys::{Object, Reflect, TypeError};
15+
use std::panic;
1516
use wasm_bindgen::prelude::*;
1617

1718
pub use crate::vm_class::*;
1819

1920
const PY_EVAL_VM_ID: &str = "__py_eval_vm";
2021

21-
extern crate console_error_panic_hook;
22+
fn panic_hook(info: &panic::PanicInfo) {
23+
// If something errors, just ignore it; we don't want to panic in the panic hook
24+
use js_sys::WebAssembly::RuntimeError;
25+
let window = match web_sys::window() {
26+
Some(win) => win,
27+
None => return,
28+
};
29+
let msg = &info.to_string();
30+
let _ = Reflect::set(&window, &"__RUSTPYTHON_ERROR_MSG".into(), &msg.into());
31+
let error = RuntimeError::new(&msg);
32+
let _ = Reflect::set(&window, &"__RUSTPYTHON_ERROR".into(), &error);
33+
let stack = match Reflect::get(&error, &"stack".into()) {
34+
Ok(stack) => stack,
35+
Err(_) => return,
36+
};
37+
let _ = Reflect::set(&window, &"__RUSTPYTHON_ERROR_STACK".into(), &stack.into());
38+
}
2239

2340
#[wasm_bindgen(start)]
2441
pub fn setup_console_error() {
25-
std::panic::set_hook(Box::new(console_error_panic_hook::hook));
42+
std::panic::set_hook(Box::new(panic_hook));
2643
}
2744

2845
// Hack to comment out wasm-bindgen's generated typescript definitons

0 commit comments

Comments
 (0)