LibWeb: Implement faster equals() for UnresolvedStyleValue

Compare `Vector<Parser::ComponentValue>` directly instead of
serializing them into strings first.

This is required for the upcoming changes where we would compare
previous and new sets of custom properties to figure out whether we need
to invalidate descendant elements. Without this change `equals()` would
show up being hot in profiles.
This commit is contained in:
Aliaksandr Kalenik 2025-07-27 23:28:34 +02:00 committed by Andreas Kling
commit cbe4ba60c3
Notes: github-actions[bot] 2025-07-30 09:07:30 +00:00
4 changed files with 14 additions and 2 deletions

View file

@ -48,6 +48,8 @@ public:
String to_debug_string() const;
String original_source_text() const;
bool operator==(ComponentValue const&) const = default;
private:
Variant<Token, Function, SimpleBlock, GuaranteedInvalidValue> m_value;
};

View file

@ -169,6 +169,11 @@ public:
Position const& end_position() const { return m_end_position; }
void set_position_range(Badge<Tokenizer>, Position start, Position end);
bool operator==(Token const& other) const
{
return m_type == other.m_type && m_value == other.m_value && m_number_value == other.m_number_value && m_hash_type == other.m_hash_type;
}
private:
Type m_type { Type::Invalid };

View file

@ -81,6 +81,8 @@ struct SimpleBlock {
String to_string() const;
String original_source_text() const;
void contains_arbitrary_substitution_function(SubstitutionFunctionsPresence&) const;
bool operator==(SimpleBlock const& other) const { return token == other.token && value == other.value; }
};
// https://drafts.csswg.org/css-syntax/#function
@ -93,6 +95,8 @@ struct Function {
String to_string() const;
String original_source_text() const;
void contains_arbitrary_substitution_function(SubstitutionFunctionsPresence&) const;
bool operator==(Function const& other) const { return name == other.name && value == other.value; }
};
// https://drafts.csswg.org/css-variables/#guaranteed-invalid-value
@ -100,6 +104,8 @@ struct GuaranteedInvalidValue {
GuaranteedInvalidValue() = default;
String to_string() const { return {}; }
String original_source_text() const { return {}; }
bool operator==(GuaranteedInvalidValue const&) const = default;
};
}

View file

@ -48,8 +48,7 @@ bool UnresolvedStyleValue::equals(CSSStyleValue const& other) const
{
if (type() != other.type())
return false;
// This is a case where comparing the strings actually makes sense.
return to_string(SerializationMode::Normal) == other.to_string(SerializationMode::Normal);
return values() == other.as_unresolved().values();
}
}