diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2017-04-30 19:14:43 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-04-30 19:14:43 -0500 |
commit | 38bbacda7016843c8eefb150bc058845a192e3bf (patch) | |
tree | 6354331da8aba94672fa1891fe0e17298b1fbc57 | |
parent | bf0bf4f4b4ff7eb79c5d91fb725deefbcd063185 (diff) | |
parent | 54f33a6bfda530f20728cb2af62670921a91ce42 (diff) | |
download | servo-38bbacda7016843c8eefb150bc058845a192e3bf.tar.gz servo-38bbacda7016843c8eefb150bc058845a192e3bf.zip |
Auto merge of #16664 - emilio:fix-eternal-todo, r=bholley
style: Avoid allocating a unique nsStyleSVG and nsStyleBackground per element
Should also help with https://bugzilla.mozilla.org/show_bug.cgi?id=1360881, and it's a TODO that has always been there.
This is on top of #16663, so only last commit needs review.
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/16664)
<!-- Reviewable:end -->
-rw-r--r-- | components/style/properties/gecko.mako.rs | 4 | ||||
-rw-r--r-- | components/style/properties/properties.mako.rs | 28 |
2 files changed, 23 insertions, 9 deletions
diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index f0fbe045c11..85a1e21bb85 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -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 diff --git a/components/style/properties/properties.mako.rs b/components/style/properties/properties.mako.rs index 9724580d678..be94b96b5f0 100644 --- a/components/style/properties/properties.mako.rs +++ b/components/style/properties/properties.mako.rs @@ -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 { |