From: Ian Jackson Date: Fri, 19 Mar 2021 00:34:38 +0000 (+0000) Subject: xdata: Split out xdata_get_mut_inner X-Git-Tag: otter-0.5.0~655 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=6831ec0449502c4ba15fc3df0a15f5ca1158de96;p=otter.git xdata: Split out xdata_get_mut_inner Signed-off-by: Ian Jackson --- diff --git a/src/gamestate.rs b/src/gamestate.rs index a66ca304..f7651498 100644 --- a/src/gamestate.rs +++ b/src/gamestate.rs @@ -358,21 +358,27 @@ impl PieceXDataState { D: FnOnce() -> T, >(&mut self, def: D) -> Result<&mut T, IE> { let xdata = self.get_or_insert_with(|| Box::new(def())); - let xdata: &mut dyn PieceXData = xdata.as_mut(); - let keep: *mut dyn PieceXData = xdata; - if let Some(y) = xdata.downcast_mut::() { return Ok(y) } - - // Erroneous borrowck error with early returns - // https://github.com/rust-lang/rust/issues/58910 - // https://github.com/rust-lang/rust/issues/51545 - // Safety: the `xdata` borrow that was passed to `downcast_mut` - // is no longer present in this branch, so now we have only `keep` - // and the things `keep` was borrowed from. - let xdata: &dyn PieceXData = unsafe { keep.as_ref().unwrap() }; - Err(xdata_unexpected::(xdata)) + xdata_get_mut_inner(xdata) } } +fn xdata_get_mut_inner< + T: PieceXData, +>(xdata: &mut Box) -> Result<&mut T, IE> { + let xdata: &mut dyn PieceXData = xdata.as_mut(); + let keep: *mut dyn PieceXData = xdata; + if let Some(y) = xdata.downcast_mut::() { return Ok(y) } + + // Erroneous borrowck error with early returns + // https://github.com/rust-lang/rust/issues/58910 + // https://github.com/rust-lang/rust/issues/51545 + // Safety: the `xdata` borrow that was passed to `downcast_mut` + // is no longer present in this branch, so now we have only `keep` + // and the things `keep` was borrowed from. + let xdata: &dyn PieceXData = unsafe { keep.as_ref().unwrap() }; + Err(xdata_unexpected::(xdata)) +} + impl GameState { pub fn dummy() -> Self { GameState { table_colour: Html::lit("green"),