Closed Bug 1380877 Opened 3 years ago Closed 3 years ago

stylo: Trim some fat from the traversal

Categories

(Core :: CSS Parsing and Computation, enhancement)

enhancement
Not set
normal

Tracking

()

RESOLVED FIXED

People

(Reporter: bholley, Assigned: bholley)

References

(Blocks 1 open bug)

Details

Attachments

(3 files, 1 obsolete file)

I have some patches to reduce overhead in the traversal. A major piece of to avoid enumerating the children twice (once during preprocessing, and once from the traversal driver).
Contrary to the comment around its declaration, we do move the SmallVec in
the replace call. This fixes that.

MozReview-Commit-ID: Bc1qFPpHQ8t
Attachment #8886738 - Flags: review?(emilio+bugs)
In the next patch, we'll move logic to identify the children for traversal into
preprocess_children (which will be renamed), and the set_dirty_descendants logic
will move along with it. So left as-is, the code here will clobber the flags.

MozReview-Commit-ID: 7ZskKWD4QC3
Attachment #8886739 - Flags: review?(emilio+bugs)
Comment on attachment 8886738 [details] [diff] [review]
Part 1 - Use Drains in parallel.rs. v1

Review of attachment 8886738 [details] [diff] [review]:
-----------------------------------------------------------------

I guess, though the code was nicer before...
Attachment #8886738 - Flags: review?(emilio+bugs) → review+
Attachment #8886739 - Flags: review?(emilio+bugs) → review+
Comment on attachment 8886740 [details] [diff] [review]
Part 3 - Pass a callback to recalc_style_at to avoid traversing children twice. v1

Review of attachment 8886740 [details] [diff] [review]:
-----------------------------------------------------------------

::: servo/components/style/gecko/traversal.rs
@@ +38,3 @@
>      {
>          if node.is_element() {
>              let el = node.as_element().unwrap();

While you're here, can you change this to:

if let Some(el) = node.as_element() {

instead?

::: servo/components/style/traversal.rs
@@ +117,5 @@
>  
>  /// A DOM Traversal trait, that is used to generically implement styling for
>  /// Gecko and Servo.
>  pub trait DomTraversal<E: TElement> : Sync {
>      /// Process `node` on the way down, before its children have been processed.

Please document the new function.

@@ +257,5 @@
>          debug_assert!(node.is_text_node());
>          false
>      }
>  
> +    /// Returns true if traversal is needed for the given element and subtree.

Document that the only place parent_data can be None is if there's no parent?

@@ +617,5 @@
> +    // * This is a reconstruct traversal.
> +    // * This is a servo non-incremental traversal.
> +    //
> +    // Additionally, there are a few scenarios where we avoid traversing the
> +    // subtree even if the element styles are out of date. These cases are

I don't think "the element styles are out of date" is a great description... Maybe just "the children styles"?

@@ +778,5 @@
>          important_rules_changed
>      )
>  }
>  
> +fn note_children<E, D, F>(

I find "note" a very generic name, and it's doing very concrete stuff... Don't have an immediate better suggestion, though I think the previous name is clearer than this (but still not great!)
Attachment #8886740 - Flags: review?(emilio+bugs) → review+
(In reply to Emilio Cobos Álvarez [:emilio] from comment #9)
> Comment on attachment 8886738 [details] [diff] [review]
> Part 1 - Use Drains in parallel.rs. v1
> 
> Review of attachment 8886738 [details] [diff] [review]:
> -----------------------------------------------------------------
> 
> I guess, though the code was nicer before...

Yeah, fair. I realize now that I could have just kept the old code and emptied the array after borrowing it (rather than doing the replace). But I'd probably still want a try push, and otherwise this is land-ready, so I'm just going to land it.

(In reply to Emilio Cobos Álvarez [:emilio] from comment #10)
> I find "note" a very generic name, and it's doing very concrete stuff...
> Don't have an immediate better suggestion, though I think the previous name
> is clearer than this (but still not great!)

Well, pre-process isn't really accurate here, because it both preprocesses and passes them to the caller. We can rename it if we think of a better name.

Thanks for the reviews!
I had to rebase anyway, so I made this more minimal patch for part 1. I'm
going to assume emilio prefers this. :-)

MozReview-Commit-ID: 7nzjMwOmszZ
Attachment #8886818 - Flags: review+
Attachment #8886738 - Attachment is obsolete: true
Status: NEW → RESOLVED
Closed: 3 years ago
Resolution: --- → FIXED
You need to log in before you can comment on or make changes to this bug.