mirror of
https://github.com/denoland/deno.git
synced 2025-08-03 18:38:33 +00:00
fix: async op error stacktraces (#10080)
Co-authored-by: Aaron O'Mullan <aaron.omullan@gmail.com>
This commit is contained in:
parent
c6e7a243d5
commit
c86ee742a2
3 changed files with 73 additions and 50 deletions
|
@ -108,3 +108,51 @@ where
|
|||
},
|
||||
)
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[tokio::test]
|
||||
async fn json_op_async_stack_trace() {
|
||||
let mut runtime = crate::JsRuntime::new(Default::default());
|
||||
|
||||
async fn op_throw(
|
||||
_state: Rc<RefCell<OpState>>,
|
||||
msg: Option<String>,
|
||||
zero_copy: Option<ZeroCopyBuf>,
|
||||
) -> Result<(), AnyError> {
|
||||
assert_eq!(msg.unwrap(), "hello");
|
||||
assert!(zero_copy.is_none());
|
||||
Err(crate::error::generic_error("foo"))
|
||||
}
|
||||
|
||||
runtime.register_op("op_throw", json_op_async(op_throw));
|
||||
runtime
|
||||
.execute(
|
||||
"<init>",
|
||||
r#"
|
||||
// First we initialize the ops cache. This maps op names to their id's.
|
||||
Deno.core.ops();
|
||||
// Register the error class.
|
||||
Deno.core.registerErrorClass('Error', Error);
|
||||
|
||||
async function f1() {
|
||||
await Deno.core.jsonOpAsync('op_throw', 'hello');
|
||||
}
|
||||
|
||||
async function f2() {
|
||||
await f1();
|
||||
}
|
||||
|
||||
f2();
|
||||
"#,
|
||||
)
|
||||
.unwrap();
|
||||
let e = runtime.run_event_loop().await.unwrap_err().to_string();
|
||||
println!("{}", e);
|
||||
assert!(e.contains("Error: foo"));
|
||||
assert!(e.contains("at async f1 (<init>:"));
|
||||
assert!(e.contains("at async f2 (<init>:"));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue