gpui: Arc GlobalElementId (#40979)

This shrinks it from roughly a ~kilobyte to 8 byte, removing a bunch of
memmoves emitted by the compiler. Also `Arc`'s it instead of boxing as
we do clone it a couple times here and there, making that also a fair
bit cheaper

Release Notes:

- N/A *or* Added/Fixed/Improved ...
This commit is contained in:
Lukas Wirth
2025-10-23 07:58:33 +00:00
committed by GitHub
parent 278032c6b8
commit c529a066bf
4 changed files with 23 additions and 24 deletions
+9 -9
View File
@@ -1186,18 +1186,14 @@ impl BlockMapWriter<'_> {
self.0.sync(wrap_snapshot, edits);
}
pub fn remove_intersecting_replace_blocks<T>(
pub fn remove_intersecting_replace_blocks(
&mut self,
ranges: impl IntoIterator<Item = Range<T>>,
ranges: impl IntoIterator<Item = Range<usize>>,
inclusive: bool,
) where
T: ToOffset,
{
) {
let wrap_snapshot = self.0.wrap_snapshot.borrow();
let mut blocks_to_remove = HashSet::default();
for range in ranges {
let range = range.start.to_offset(wrap_snapshot.buffer_snapshot())
..range.end.to_offset(wrap_snapshot.buffer_snapshot());
for block in self.blocks_intersecting_buffer_range(range, inclusive) {
if matches!(block.placement, BlockPlacement::Replace(_)) {
blocks_to_remove.insert(block.id);
@@ -3570,8 +3566,12 @@ mod tests {
let mut writer = block_map.write(wraps_snapshot.clone(), Default::default());
writer.remove_intersecting_replace_blocks(
[buffer_snapshot.anchor_after(Point::new(1, 0))
..buffer_snapshot.anchor_after(Point::new(1, 0))],
[buffer_snapshot
.anchor_after(Point::new(1, 0))
.to_offset(&buffer_snapshot)
..buffer_snapshot
.anchor_after(Point::new(1, 0))
.to_offset(&buffer_snapshot)],
false,
);
let blocks_snapshot = block_map.read(wraps_snapshot, Default::default());
+7 -7
View File
@@ -37,11 +37,11 @@ use crate::{
util::FluentBuilder,
};
use derive_more::{Deref, DerefMut};
pub(crate) use smallvec::SmallVec;
use std::{
any::{Any, type_name},
fmt::{self, Debug, Display},
mem, panic,
sync::Arc,
};
/// Implemented by types that participate in laying out and painting the contents of a window.
@@ -272,8 +272,8 @@ impl<C: RenderOnce> IntoElement for Component<C> {
}
/// A globally unique identifier for an element, used to track state across frames.
#[derive(Deref, DerefMut, Default, Debug, Eq, PartialEq, Hash)]
pub struct GlobalElementId(pub(crate) SmallVec<[ElementId; 32]>);
#[derive(Deref, DerefMut, Clone, Default, Debug, Eq, PartialEq, Hash)]
pub struct GlobalElementId(pub(crate) Arc<[ElementId]>);
impl Display for GlobalElementId {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
@@ -353,7 +353,7 @@ impl<E: Element> Drawable<E> {
ElementDrawPhase::Start => {
let global_id = self.element.id().map(|element_id| {
window.element_id_stack.push(element_id);
GlobalElementId(window.element_id_stack.clone())
GlobalElementId(Arc::from(&*window.element_id_stack))
});
let inspector_id;
@@ -361,7 +361,7 @@ impl<E: Element> Drawable<E> {
{
inspector_id = self.element.source_location().map(|source| {
let path = crate::InspectorElementPath {
global_id: GlobalElementId(window.element_id_stack.clone()),
global_id: GlobalElementId(Arc::from(&*window.element_id_stack)),
source_location: source,
};
window.build_inspector_element_id(path)
@@ -412,7 +412,7 @@ impl<E: Element> Drawable<E> {
} => {
if let Some(element_id) = self.element.id() {
window.element_id_stack.push(element_id);
debug_assert_eq!(global_id.as_ref().unwrap().0, window.element_id_stack);
debug_assert_eq!(&*global_id.as_ref().unwrap().0, &*window.element_id_stack);
}
let bounds = window.layout_bounds(layout_id);
@@ -461,7 +461,7 @@ impl<E: Element> Drawable<E> {
} => {
if let Some(element_id) = self.element.id() {
window.element_id_stack.push(element_id);
debug_assert_eq!(global_id.as_ref().unwrap().0, window.element_id_stack);
debug_assert_eq!(&*global_id.as_ref().unwrap().0, &*window.element_id_stack);
}
window.next_frame.dispatch_tree.set_active_node(node_id);
+1 -1
View File
@@ -39,7 +39,7 @@ mod conditional {
impl Clone for InspectorElementPath {
fn clone(&self) -> Self {
Self {
global_id: crate::GlobalElementId(self.global_id.0.clone()),
global_id: self.global_id.clone(),
source_location: self.source_location,
}
}
+6 -7
View File
@@ -1848,7 +1848,8 @@ impl Window {
f: impl FnOnce(&GlobalElementId, &mut Self) -> R,
) -> R {
self.element_id_stack.push(element_id);
let global_id = GlobalElementId(self.element_id_stack.clone());
let global_id = GlobalElementId(Arc::from(&*self.element_id_stack));
let result = f(&global_id, self);
self.element_id_stack.pop();
result
@@ -2260,7 +2261,7 @@ impl Window {
self.rendered_frame.accessed_element_states[range.start.accessed_element_states_index
..range.end.accessed_element_states_index]
.iter()
.map(|(id, type_id)| (GlobalElementId(id.0.clone()), *type_id)),
.map(|(id, type_id)| (id.clone(), *type_id)),
);
self.text_system
.reuse_layouts(range.start.line_layout_index..range.end.line_layout_index);
@@ -2328,7 +2329,7 @@ impl Window {
self.rendered_frame.accessed_element_states[range.start.accessed_element_states_index
..range.end.accessed_element_states_index]
.iter()
.map(|(id, type_id)| (GlobalElementId(id.0.clone()), *type_id)),
.map(|(id, type_id)| (id.clone(), *type_id)),
);
self.next_frame.tab_stops.replay(
&self.rendered_frame.tab_stops.insertion_history
@@ -2650,10 +2651,8 @@ impl Window {
{
self.invalidator.debug_assert_paint_or_prepaint();
let key = (GlobalElementId(global_id.0.clone()), TypeId::of::<S>());
self.next_frame
.accessed_element_states
.push((GlobalElementId(key.0.clone()), TypeId::of::<S>()));
let key = (global_id.clone(), TypeId::of::<S>());
self.next_frame.accessed_element_states.push(key.clone());
if let Some(any) = self
.next_frame