Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Make Node::style_and_layout_data be a DomRefCell<T>
That way we can use borrow_mut_for_layout and borrow_mut.
  • Loading branch information
nox committed May 19, 2020
1 parent 15db317 commit 518c066
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 28 deletions.
46 changes: 25 additions & 21 deletions components/script/dom/node.rs
Expand Up @@ -150,12 +150,9 @@ pub struct Node {
/// are this node.
ranges: WeakRangeVec,

/// Style+Layout information. Only the layout thread may touch this data.
///
/// Must be sent back to the layout thread to be destroyed when this
/// node is finalized.
#[ignore_malloc_size_of = "Unsafe cell"]
style_and_layout_data: UnsafeCell<Option<Box<StyleAndOpaqueLayoutData>>>,
/// Style+Layout information.
#[ignore_malloc_size_of = "trait object"]
style_and_layout_data: DomRefCell<Option<Box<StyleAndOpaqueLayoutData>>>,
}

bitflags! {
Expand Down Expand Up @@ -1246,21 +1243,18 @@ impl Node {
}
}

#[allow(unsafe_code)]
pub fn style(&self) -> Option<Arc<ComputedValues>> {
if !window_from_node(self).layout_reflow(QueryMsg::StyleQuery) {
return None;
}
unsafe {
(*self.style_and_layout_data.get()).as_ref().map(|data| {
data.style_data
.element_data
.borrow()
.styles
.primary()
.clone()
})
}
self.style_and_layout_data.borrow().as_ref().map(|data| {
data.style_data
.element_data
.borrow()
.styles
.primary()
.clone()
})
}
}

Expand Down Expand Up @@ -1444,21 +1438,31 @@ impl<'dom> LayoutNodeHelpers<'dom> for LayoutDom<'dom, Node> {
#[inline]
#[allow(unsafe_code)]
fn get_style_and_opaque_layout_data(self) -> Option<&'dom StyleAndOpaqueLayoutData> {
unsafe { (*self.unsafe_get().style_and_layout_data.get()).as_deref() }
unsafe {
self.unsafe_get()
.style_and_layout_data
.borrow_for_layout()
.as_deref()
}
}

#[inline]
#[allow(unsafe_code)]
unsafe fn init_style_and_opaque_layout_data(self, val: Box<StyleAndOpaqueLayoutData>) {
let data = &mut *self.unsafe_get().style_and_layout_data.get();
let data = self
.unsafe_get()
.style_and_layout_data
.borrow_mut_for_layout();
debug_assert!(data.is_none());
*data = Some(val);
}

#[inline]
#[allow(unsafe_code)]
unsafe fn take_style_and_opaque_layout_data(self) -> Box<StyleAndOpaqueLayoutData> {
(*self.unsafe_get().style_and_layout_data.get())
self.unsafe_get()
.style_and_layout_data
.borrow_mut_for_layout()
.take()
.unwrap()
}
Expand Down Expand Up @@ -1775,7 +1779,7 @@ impl Node {
inclusive_descendants_version: Cell::new(0),
ranges: WeakRangeVec::new(),

style_and_layout_data: UnsafeCell::new(None),
style_and_layout_data: Default::default(),
}
}

Expand Down
14 changes: 7 additions & 7 deletions tests/unit/script/size_of.rs
Expand Up @@ -30,10 +30,10 @@ macro_rules! sizeof_checker (

// Update the sizes here
sizeof_checker!(size_event_target, EventTarget, 56);
sizeof_checker!(size_node, Node, 184);
sizeof_checker!(size_element, Element, 360);
sizeof_checker!(size_htmlelement, HTMLElement, 376);
sizeof_checker!(size_div, HTMLDivElement, 376);
sizeof_checker!(size_span, HTMLSpanElement, 376);
sizeof_checker!(size_text, Text, 216);
sizeof_checker!(size_characterdata, CharacterData, 216);
sizeof_checker!(size_node, Node, 192);
sizeof_checker!(size_element, Element, 368);
sizeof_checker!(size_htmlelement, HTMLElement, 384);
sizeof_checker!(size_div, HTMLDivElement, 384);
sizeof_checker!(size_span, HTMLSpanElement, 384);
sizeof_checker!(size_text, Text, 224);
sizeof_checker!(size_characterdata, CharacterData, 224);

0 comments on commit 518c066

Please sign in to comment.