aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorbors-servo <lbergstrom+bors@mozilla.com>2017-04-30 19:14:43 -0500
committerGitHub <noreply@github.com>2017-04-30 19:14:43 -0500
commit38bbacda7016843c8eefb150bc058845a192e3bf (patch)
tree6354331da8aba94672fa1891fe0e17298b1fbc57
parentbf0bf4f4b4ff7eb79c5d91fb725deefbcd063185 (diff)
parent54f33a6bfda530f20728cb2af62670921a91ce42 (diff)
downloadservo-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.rs4
-rw-r--r--components/style/properties/properties.mako.rs28
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 {