From 986c2c0ffbbe6a1b2654bb1fbb0a44606a74921d Mon Sep 17 00:00:00 2001 From: Emil Ernerfeldt Date: Wed, 17 Dec 2025 17:19:18 +0100 Subject: [PATCH] Use explicit `Arc::clone` to clarify when clones are cheap (#7784) --- Cargo.toml | 1 + crates/eframe/src/native/glow_integration.rs | 8 ++++---- crates/eframe/src/native/wgpu_integration.rs | 11 ++++++----- crates/eframe/src/web/app_runner.rs | 11 ++++++----- crates/eframe/src/web/web_painter_glow.rs | 2 +- crates/eframe/src/web/web_painter_wgpu.rs | 4 ++-- crates/egui-wgpu/src/capture.rs | 2 +- crates/egui-wgpu/src/setup.rs | 2 +- crates/egui-wgpu/src/winit.rs | 2 +- crates/egui/src/containers/window.rs | 2 +- crates/egui/src/context.rs | 14 +++++++------- crates/egui/src/drag_and_drop.rs | 6 +----- crates/egui/src/grid.rs | 4 +++- crates/egui/src/load.rs | 2 +- crates/egui/src/menu.rs | 2 +- crates/egui/src/plugin.rs | 2 +- crates/egui/src/ui.rs | 4 ++-- crates/egui/src/viewport.rs | 2 +- crates/egui/src/widget_text.rs | 2 +- crates/egui/src/widgets/text_edit/builder.rs | 2 +- crates/egui_demo_lib/src/demo/misc_demo_window.rs | 4 +++- crates/egui_demo_lib/src/demo/screenshot.rs | 4 ++-- .../src/demo/tests/tessellation_test.rs | 6 ++++-- crates/egui_extras/src/loaders/file_loader.rs | 2 +- crates/egui_extras/src/loaders/gif_loader.rs | 2 +- crates/egui_extras/src/loaders/http_loader.rs | 2 +- crates/egui_extras/src/loaders/image_loader.rs | 2 +- crates/egui_extras/src/loaders/webp_loader.rs | 4 ++-- crates/egui_glow/examples/pure_glow.rs | 2 +- crates/epaint/src/shape_transform.rs | 2 +- crates/epaint/src/text/fonts.rs | 8 ++++---- crates/epaint/src/text/text_layout_types.rs | 2 +- crates/epaint/src/texture_handle.rs | 2 +- examples/custom_3d_glow/src/main.rs | 2 +- examples/external_eventloop_async/src/app.rs | 6 ++++-- examples/multiple_viewports/src/main.rs | 2 +- examples/puffin_profiler/src/main.rs | 2 +- examples/screenshot/src/main.rs | 2 +- tests/test_ui_stack/src/main.rs | 6 ++++-- tests/test_viewports/src/main.rs | 4 ++-- 40 files changed, 80 insertions(+), 71 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index b291cb36c..5cb5fbbfd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -184,6 +184,7 @@ branches_sharing_code = "warn" char_lit_as_u8 = "warn" checked_conversions = "warn" clear_with_drain = "warn" +clone_on_ref_ptr = "warn" cloned_instead_of_copied = "warn" dbg_macro = "warn" debug_assert_with_mut_call = "warn" diff --git a/crates/eframe/src/native/glow_integration.rs b/crates/eframe/src/native/glow_integration.rs index 9306cf9cc..0a338affa 100644 --- a/crates/eframe/src/native/glow_integration.rs +++ b/crates/eframe/src/native/glow_integration.rs @@ -216,7 +216,7 @@ impl<'app> GlowWinitApp<'app> { storage.as_deref(), &mut self.native_options, )?; - let gl = painter.gl().clone(); + let gl = Arc::clone(painter.gl()); let max_texture_side = painter.max_texture_side(); glutin.max_texture_side = Some(max_texture_side); @@ -234,9 +234,9 @@ impl<'app> GlowWinitApp<'app> { &self.app_name, &self.native_options, storage, - Some(gl.clone()), + Some(Arc::clone(&gl)), Some(Box::new({ - let painter = painter.clone(); + let painter = Rc::clone(&painter); move |native| painter.borrow_mut().register_native_texture(native) })), #[cfg(feature = "wgpu_no_default_features")] @@ -244,7 +244,7 @@ impl<'app> GlowWinitApp<'app> { ); { - let event_loop_proxy = self.repaint_proxy.clone(); + let event_loop_proxy = Arc::clone(&self.repaint_proxy); integration .egui_ctx .set_request_repaint_callback(move |info| { diff --git a/crates/eframe/src/native/wgpu_integration.rs b/crates/eframe/src/native/wgpu_integration.rs index b7708f6f6..5444e9cf3 100644 --- a/crates/eframe/src/native/wgpu_integration.rs +++ b/crates/eframe/src/native/wgpu_integration.rs @@ -219,7 +219,7 @@ impl<'app> WgpuWinitApp<'app> { { profiling::scope!("set_window"); - pollster::block_on(painter.set_window(ViewportId::ROOT, Some(window.clone())))?; + pollster::block_on(painter.set_window(ViewportId::ROOT, Some(Arc::clone(&window))))?; } let wgpu_render_state = painter.render_state(); @@ -238,7 +238,7 @@ impl<'app> WgpuWinitApp<'app> { ); { - let event_loop_proxy = self.repaint_proxy.clone(); + let event_loop_proxy = Arc::clone(&self.repaint_proxy); egui_ctx.set_request_repaint_callback(move |info| { log::trace!("request_repaint_callback: {info:?}"); @@ -610,7 +610,7 @@ impl WgpuWinitRunning<'_> { { profiling::scope!("set_window"); - pollster::block_on(painter.set_window(viewport_id, Some(window.clone())))?; + pollster::block_on(painter.set_window(viewport_id, Some(Arc::clone(window))))?; } let Some(egui_winit) = egui_winit.as_mut() else { @@ -919,7 +919,7 @@ impl Viewport { let window = Arc::new(window); if let Err(err) = - pollster::block_on(painter.set_window(viewport_id, Some(window.clone()))) + pollster::block_on(painter.set_window(viewport_id, Some(Arc::clone(&window)))) { log::error!("on set_window: viewport_id {viewport_id:?} {err}"); } @@ -1051,7 +1051,8 @@ fn render_immediate_viewport( { profiling::scope!("set_window"); - if let Err(err) = pollster::block_on(painter.set_window(ids.this, Some(window.clone()))) { + if let Err(err) = pollster::block_on(painter.set_window(ids.this, Some(Arc::clone(window)))) + { log::error!( "when rendering viewport_id={:?}, set_window Error {err}", ids.this diff --git a/crates/eframe/src/web/app_runner.rs b/crates/eframe/src/web/app_runner.rs index 83b2cb855..b1a19a882 100644 --- a/crates/eframe/src/web/app_runner.rs +++ b/crates/eframe/src/web/app_runner.rs @@ -1,3 +1,5 @@ +use std::sync::Arc; + use egui::{TexturesDelta, UserData, ViewportCommand}; use crate::{App, epi, web::web_painter::WebPainter}; @@ -12,7 +14,7 @@ pub struct AppRunner { painter: Box, pub(crate) input: super::WebInput, app: Box, - pub(crate) needs_repaint: std::sync::Arc, + pub(crate) needs_repaint: Arc, last_save_time: f64, pub(crate) text_agent: TextAgent, @@ -63,7 +65,7 @@ impl AppRunner { canvas, &web_options, )?; - gl = Some(painter.gl().clone()); + gl = Some(Arc::clone(painter.gl())); Box::new(painter) as Box } @@ -138,10 +140,9 @@ impl AppRunner { wgpu_render_state, }; - let needs_repaint: std::sync::Arc = - std::sync::Arc::new(NeedRepaint::new(web_options.max_fps)); + let needs_repaint: Arc = Arc::new(NeedRepaint::new(web_options.max_fps)); { - let needs_repaint = needs_repaint.clone(); + let needs_repaint = Arc::clone(&needs_repaint); egui_ctx.set_request_repaint_callback(move |info| { needs_repaint.repaint_after(info.delay.as_secs_f64()); }); diff --git a/crates/eframe/src/web/web_painter_glow.rs b/crates/eframe/src/web/web_painter_glow.rs index e2fc4a6f2..a6a863b05 100644 --- a/crates/eframe/src/web/web_painter_glow.rs +++ b/crates/eframe/src/web/web_painter_glow.rs @@ -91,7 +91,7 @@ impl WebPainter for WebPainterGlow { for data in data { events.push(Event::Screenshot { viewport_id: ViewportId::default(), - image: image.clone(), + image: Arc::clone(&image), user_data: data, }); } diff --git a/crates/eframe/src/web/web_painter_wgpu.rs b/crates/eframe/src/web/web_painter_wgpu.rs index 387366e5a..ef1127f9c 100644 --- a/crates/eframe/src/web/web_painter_wgpu.rs +++ b/crates/eframe/src/web/web_painter_wgpu.rs @@ -105,7 +105,7 @@ impl WebPainterWgpu { surface_configuration, depth_stencil_format, depth_texture_view: None, - on_surface_error: options.wgpu_options.on_surface_error.clone(), + on_surface_error: Arc::clone(&options.wgpu_options.on_surface_error) as _, screen_capture_state: None, capture_tx, capture_rx, @@ -336,7 +336,7 @@ impl WebPainter for WebPainterWgpu { events.push(Event::Screenshot { viewport_id, user_data: data, - image: screenshot.clone(), + image: Arc::clone(&screenshot), }); } } diff --git a/crates/egui-wgpu/src/capture.rs b/crates/egui-wgpu/src/capture.rs index cd42b838c..f0781d97c 100644 --- a/crates/egui-wgpu/src/capture.rs +++ b/crates/egui-wgpu/src/capture.rs @@ -188,7 +188,7 @@ impl CaptureState { ) { #[allow(clippy::arc_with_non_send_sync, clippy::allow_attributes)] // For wasm let buffer = Arc::new(buffer); - let buffer_clone = buffer.clone(); + let buffer_clone = Arc::clone(&buffer); let buffer_slice = buffer_clone.slice(..); let format = self.texture.format(); let tex_extent = self.texture.size(); diff --git a/crates/egui-wgpu/src/setup.rs b/crates/egui-wgpu/src/setup.rs index bd587350e..17498923d 100644 --- a/crates/egui-wgpu/src/setup.rs +++ b/crates/egui-wgpu/src/setup.rs @@ -134,7 +134,7 @@ impl Clone for WgpuSetupCreateNew { instance_descriptor: self.instance_descriptor.clone(), power_preference: self.power_preference, native_adapter_selector: self.native_adapter_selector.clone(), - device_descriptor: self.device_descriptor.clone(), + device_descriptor: Arc::clone(&self.device_descriptor), } } } diff --git a/crates/egui-wgpu/src/winit.rs b/crates/egui-wgpu/src/winit.rs index a35466493..8169bc9be 100644 --- a/crates/egui-wgpu/src/winit.rs +++ b/crates/egui-wgpu/src/winit.rs @@ -629,7 +629,7 @@ impl Painter { events.push(Event::Screenshot { viewport_id, user_data: data, - image: screenshot.clone(), + image: Arc::clone(&screenshot), }); } } diff --git a/crates/egui/src/containers/window.rs b/crates/egui/src/containers/window.rs index 2ea949e88..411527272 100644 --- a/crates/egui/src/containers/window.rs +++ b/crates/egui/src/containers/window.rs @@ -1274,7 +1274,7 @@ impl TitleBar { let text_pos = text_pos - self.title_galley.rect.min.to_vec2(); ui.painter().galley( text_pos, - self.title_galley.clone(), + Arc::clone(&self.title_galley), ui.visuals().text_color(), ); diff --git a/crates/egui/src/context.rs b/crates/egui/src/context.rs index dc5f06207..02cb3cb60 100644 --- a/crates/egui/src/context.rs +++ b/crates/egui/src/context.rs @@ -1959,7 +1959,7 @@ impl Context { pub fn add_plugin(&self, plugin: impl plugin::Plugin + 'static) { let handle = plugin::PluginHandle::new(plugin); - let added = self.write(|ctx| ctx.plugins.add(handle.clone())); + let added = self.write(|ctx| ctx.plugins.add(Arc::clone(&handle))); if added { handle.lock().dyn_plugin_mut().setup(self); @@ -2085,13 +2085,13 @@ impl Context { /// The currently active [`Style`] used by all subsequent popups, menus, etc. pub fn global_style(&self) -> Arc