diff options
author | Ryan Dahl <ry@tinyclouds.org> | 2021-11-03 09:27:36 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-11-03 09:27:36 -0400 |
commit | 7c2abb9d579d13fa61339c24f8c39bc3c27c25db (patch) | |
tree | c3ce3cefff867dd3f073eda18ebed53f728e4675 | |
parent | 95b2955712b0daae3c8e8f7bb0eccf341b5c8fa3 (diff) |
fix: Deno.emit crashes with BorrowMutError (#12627)
Warn on await_holding_refcell_ref clippy rule to avoid this in the future.
Fixes #12453
-rw-r--r-- | cli/ops/runtime_compiler.rs | 12 | ||||
-rw-r--r-- | cli/tests/integration/run_tests.rs | 18 | ||||
-rw-r--r-- | cli/tests/testdata/issue12453.js | 4 | ||||
-rw-r--r-- | core/runtime.rs | 9 | ||||
-rw-r--r-- | ext/web/message_port.rs | 1 | ||||
-rw-r--r-- | runtime/web_worker.rs | 1 | ||||
-rwxr-xr-x | tools/lint.js | 9 |
7 files changed, 47 insertions, 7 deletions
diff --git a/cli/ops/runtime_compiler.rs b/cli/ops/runtime_compiler.rs index ab6992d19..8f7a75146 100644 --- a/cli/ops/runtime_compiler.rs +++ b/cli/ops/runtime_compiler.rs @@ -88,9 +88,15 @@ async fn op_emit( ) -> Result<EmitResult, AnyError> { deno_runtime::ops::check_unstable2(&state, "Deno.emit"); let root_specifier = args.root_specifier; - let state = state.borrow(); - let ps = state.borrow::<ProcState>(); - let mut runtime_permissions = { state.borrow::<Permissions>().clone() }; + let ps = { + let state = state.borrow(); + state.borrow::<ProcState>().clone() + }; + let mut runtime_permissions = { + let state = state.borrow(); + state.borrow::<Permissions>().clone() + }; + let mut cache: Box<dyn cache::CacherLoader> = if let Some(sources) = &args.sources { Box::new(cache::MemoryCacher::new(sources.clone())) diff --git a/cli/tests/integration/run_tests.rs b/cli/tests/integration/run_tests.rs index ec42a8dc8..b7480c44b 100644 --- a/cli/tests/integration/run_tests.rs +++ b/cli/tests/integration/run_tests.rs @@ -2148,3 +2148,21 @@ itest!(eval_context_throw_dom_exception { args: "run eval_context_throw_dom_exception.js", output: "eval_context_throw_dom_exception.js.out", }); + +#[test] +fn issue12453() { + let _g = util::http_server(); + let deno_dir = util::new_deno_dir(); + let mut deno_cmd = util::deno_cmd_with_deno_dir(deno_dir.path()); + let status = deno_cmd + .current_dir(util::testdata_path()) + .arg("run") + .arg("--unstable") + .arg("--allow-net") + .arg("issue12453.js") + .spawn() + .unwrap() + .wait() + .unwrap(); + assert!(status.success()); +} diff --git a/cli/tests/testdata/issue12453.js b/cli/tests/testdata/issue12453.js new file mode 100644 index 000000000..2ed1b5ae7 --- /dev/null +++ b/cli/tests/testdata/issue12453.js @@ -0,0 +1,4 @@ +const i = setInterval(() => { + Deno.emit("http://localhost:4545/subdir/mt_text_typescript.t1.ts"); + clearInterval(i); +}, 1); diff --git a/core/runtime.rs b/core/runtime.rs index 80221295d..704be7a76 100644 --- a/core/runtime.rs +++ b/core/runtime.rs @@ -2317,11 +2317,14 @@ assertEquals(1, notify_return_value); _: (), _: (), ) -> Result<(), AnyError> { - let op_state = op_state.borrow(); - let inner_state = op_state.borrow::<InnerState>(); + let n = { + let op_state = op_state.borrow(); + let inner_state = op_state.borrow::<InnerState>(); + inner_state.0 + }; // Future must be Poll::Pending on first call tokio::time::sleep(std::time::Duration::from_millis(1)).await; - if inner_state.0 != 42 { + if n != 42 { unreachable!(); } Ok(()) diff --git a/ext/web/message_port.rs b/ext/web/message_port.rs index d8d8e5907..8734f9b65 100644 --- a/ext/web/message_port.rs +++ b/ext/web/message_port.rs @@ -48,6 +48,7 @@ impl MessagePort { &self, state: Rc<RefCell<OpState>>, ) -> Result<Option<JsMessageData>, AnyError> { + #![allow(clippy::await_holding_refcell_ref)] // TODO(ry) remove! let mut rx = self .rx .try_borrow_mut() diff --git a/runtime/web_worker.rs b/runtime/web_worker.rs index 8d3fcbb35..c70d20ffc 100644 --- a/runtime/web_worker.rs +++ b/runtime/web_worker.rs @@ -198,6 +198,7 @@ impl WebWorkerHandle { pub async fn get_control_event( &self, ) -> Result<Option<WorkerControlEvent>, AnyError> { + #![allow(clippy::await_holding_refcell_ref)] // TODO(ry) remove! let mut receiver = self.receiver.borrow_mut(); Ok(receiver.next().await) } diff --git a/tools/lint.js b/tools/lint.js index 03339bcbe..bcb181e29 100755 --- a/tools/lint.js +++ b/tools/lint.js @@ -109,7 +109,14 @@ async function clippy() { } const p = Deno.run({ - cmd: [...cmd, "--", "-D", "clippy::all"], + cmd: [ + ...cmd, + "--", + "-D", + "clippy::all", + "-D", + "clippy::await_holding_refcell_ref", + ], }); const { success } = await p.status(); if (!success) { |