style: Avoid allocating a unique nsStyleSVG and nsStyleBackground per element.

Should also help with https://bugzilla.mozilla.org/show_bug.cgi?id=1360881
This commit is contained in:
Emilio Cobos Álvarez 2017-04-30 15:39:54 +02:00
parent 3b857f1c4e
commit 54f33a6bfd
No known key found for this signature in database
GPG key ID: 056B727BB9C1027C
2 changed files with 23 additions and 9 deletions

View file

@ -2774,10 +2774,6 @@ fn static_assert() {
% for member in fill_fields.split():
max_len = cmp::max(max_len, self.gecko.${image_layers_field}.${member}Count);
% endfor
// XXXManishearth Gecko does an optimization here where it only
// fills things in if any of the properties have been set
unsafe {
// While we could do this manually, we'd need to also manually
// run all the copy constructors, so we just delegate to gecko

View file

@ -2044,6 +2044,15 @@ impl<'a, T: 'a> StyleStructRef<'a, T>
}
}
/// Get a mutable reference to the owned struct, or `None` if the struct
/// hasn't been mutated.
pub fn get_if_mutated(&mut self) -> Option<<&mut T> {
match *self {
StyleStructRef::Owned(ref mut v) => Some(v),
StyleStructRef::Borrowed(..) => None,
}
}
/// Returns an `Arc` to the internal struct, constructing one if
/// appropriate.
pub fn build(self) -> Arc<T> {
@ -2141,6 +2150,13 @@ impl<'a> StyleBuilder<'a> {
pub fn mutate_${style_struct.name_lower}(&mut self) -> &mut style_structs::${style_struct.name} {
self.${style_struct.ident}.mutate()
}
/// Gets a mutable view of the current `${style_struct.name}` style,
/// only if it's been mutated before.
pub fn get_${style_struct.name_lower}_if_mutated(&mut self)
-> Option<<&mut style_structs::${style_struct.name}> {
self.${style_struct.ident}.get_if_mutated()
}
% endfor
/// Returns whether this computed style represents a floated object.
@ -2546,11 +2562,13 @@ pub fn apply_declarations<'a, F, I>(device: &Device,
}
% if product == "gecko":
// FIXME(emilio): This is effectively creating a new nsStyleBackground
// and nsStyleSVG per element. We should only do this when necessary
// using the `seen` bitfield!
style.mutate_background().fill_arrays();
style.mutate_svg().fill_arrays();
if let Some(ref mut bg) = style.get_background_if_mutated() {
bg.fill_arrays();
}
if let Some(ref mut svg) = style.get_svg_if_mutated() {
svg.fill_arrays();
}
% endif
if is_root_element {