Skip to content

Commit 7b8c890

Browse files
committed
Allow JS errors to get the row and column info of the error
1 parent c5fca1b commit 7b8c890

File tree

1 file changed

+39
-5
lines changed

1 file changed

+39
-5
lines changed

wasm/lib/src/vm_class.rs

Lines changed: 39 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::browser_module::setup_browser_module;
22
use crate::convert;
33
use crate::wasm_builtins;
4-
use js_sys::{Object, SyntaxError, TypeError};
4+
use js_sys::{Object, Reflect, SyntaxError, TypeError};
55
use rustpython_vm::{
66
compile,
77
frame::ScopeRef,
@@ -318,10 +318,44 @@ impl WASMVirtualMachine {
318318
}| {
319319
source.push('\n');
320320
let code =
321-
compile::compile(&source, &mode, "<wasm>".to_string(), vm.ctx.code_type())
322-
.map_err(|err| {
323-
SyntaxError::new(&format!("Error parsing Python code: {}", err))
324-
})?;
321+
compile::compile(&source, &mode, "<wasm>".to_string(), vm.ctx.code_type());
322+
let code = code.map_err(|err| {
323+
let js_err = SyntaxError::new(&format!("Error parsing Python code: {}", err));
324+
if let rustpython_vm::error::CompileError::Parse(ref parse_error) = err {
325+
use rustpython_parser::error::ParseError;
326+
if let ParseError::EOF(Some(ref loc))
327+
| ParseError::ExtraToken((ref loc, ..))
328+
| ParseError::InvalidToken(ref loc)
329+
| ParseError::UnrecognizedToken((ref loc, ..), _) = parse_error
330+
{
331+
let _ = Reflect::set(
332+
&js_err,
333+
&"row".into(),
334+
&(loc.get_row() as u32).into(),
335+
);
336+
let _ = Reflect::set(
337+
&js_err,
338+
&"col".into(),
339+
&(loc.get_column() as u32).into(),
340+
);
341+
}
342+
if let ParseError::ExtraToken((_, _, ref loc))
343+
| ParseError::UnrecognizedToken((_, _, ref loc), _) = parse_error
344+
{
345+
let _ = Reflect::set(
346+
&js_err,
347+
&"endrow".into(),
348+
&(loc.get_row() as u32).into(),
349+
);
350+
let _ = Reflect::set(
351+
&js_err,
352+
&"endcol".into(),
353+
&(loc.get_column() as u32).into(),
354+
);
355+
}
356+
}
357+
js_err
358+
})?;
325359
let result = vm.run_code_obj(code, scope.clone());
326360
convert::pyresult_to_jsresult(vm, result)
327361
},

0 commit comments

Comments
 (0)